Подтвердить что ты не робот

Признать число из изображения

Я пытаюсь написать приложение, чтобы найти числа внутри изображения и добавить их.

Как я могу идентифицировать записанное число в изображении?

enter image description here

На изображении много ящиков, чтобы получить числа в левой части и суммировать их, чтобы дать общее количество. Как я могу достичь этого?

Изменить: я сделал java tesseract ocr на изображении, но я не получил никаких правильных результатов. как я могу его обучать?

и

Я сделал обнаружение края, я получил это:

enter image description here

4b9b3361

Ответ 1

Вам, скорее всего, нужно будет сделать следующее:

  • Примените алгоритм Hough Transform на всей странице, это должно привести к серию разделов страниц.

  • Для каждого раздела, который вы получаете, примените его снова. Если текущий раздел дал 2 элемента, тогда вы должны иметь дело с прямоугольником, подобным указанному выше.

  • Как только вы закончите, вы можете использовать OCR для извлечения числового значения.

В этом случае я бы порекомендовал вам взглянуть на JavaCV (OpenCV Java Wrapper), который должен позволить вам решить часть преобразования Hough. Тогда вам понадобится нечто похожее на Tess4j (Tesseract Java Wrapper), которое должно позволить вам извлечь числа, которые вы после.

В качестве дополнительной заметки, чтобы уменьшить количество ложных срабатываний, вы можете сделать следующее:

  • Обрезайте изображение, если вы уверены, что определенные координаты никогда не будут содержать данные, которые вы после. Это должно дать вам меньшую картинку для работы.

  • Возможно, было бы разумно изменить изображение на шкалу серого (при условии, что вы работаете с цветным изображением). Цвета могут негативно повлиять на способность OCR разрешать изображение.

EDIT: в соответствии с вашим комментарием, учитывая что-то вроде этого:

+------------------------------+
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
|                   +---+---+  |
|                   |   |   |  |
|                   +---+---+  |
+------------------------------+

Вы обрезали бы изображение, чтобы удалить область, у которой нет соответствующих данных (часть слева), обрезая изображение, вы получите примерно следующее:

+-------------+
|+---+---+    |
||   |   |    | 
|+---+---+    |
|+---+---+    |
||   |   |    |
|+---+---+    |
|+---+---+    |
||   |   |    |
|+---+---+    |
|+---+---+    |
||   |   |    |
|+---+---+    |
+-------------+

Идея заключалась в том, чтобы запустить Hough Transform, чтобы вы могли получить сегменты страницы, содержащие такие прямоугольники:

+---+---+    
|   |   |     
+---+---+ 

Что бы вы затем применили Hough Transform снова и закончили с двумя сегментами, и вы берете левый.

После этого у вас есть левый сегмент, вы затем примените OCR.

Вы можете попытаться применить OCR перед рукой, но в лучшем случае OCR распознает как числовые значения, так и написанные, и оба напечатанные, что из того, что я получаю, не то, что вы после.

Кроме того, дополнительные строки, которые изображают прямоугольники, могут вывести OCR из трека и сделать его плохим.

Ответ 2

Я бы рекомендовал объединить 2 основных нейронных сетевых компонента:

  • Perceptron
  • Self Organized Map (SOM)

A персептрон - очень простой компонент нейронной сети. Он принимает несколько входов и производит 1 выход. Вам нужно тренировать, подавая на него как входы, так и выходы. Это компонент самообучения.

Внутри он имеет набор весовых коэффициентов, которые используются для расчета выходного сигнала. Эти весовые коэффициенты улучшаются во время обучения. Прекрасная вещь о персептроне заключается в том, что (с надлежащим обучением) он может обрабатывать данные, которые он никогда не видел раньше.

Вы можете сделать персептрон более мощным, разместив его в многоуровневой сети, что означает, что вывод одного персептрона действует как вход другого персептрона.

В вашем случае вы должны использовать 10 персептронных сетей, по одному для каждого числового значения (0-9).

Но для использования персептронов вам понадобится массив числовых входов. Поэтому сначала вам нужно что-то, чтобы преобразовать визуальное изображение в числовые значения. A Самоорганизованная карта (SOM) использует сетку взаимосвязанных точек, Точки должны привлекаться к пикселям вашего изображения (см. Ниже).

Self Organized Map

2 компонента хорошо работают вместе. SOM имеет фиксированное количество узлов сетки, и ваш персептрон нуждается в фиксированном количестве входов.

Оба компонента действительно популярны и доступны в пакетах образовательных программ, таких как MATLAB.

Ответ 3

Нейронные сети - типичный подход для таких проблем.

В этом случае вы можете считать каждый рукописный номер матрицей пикселей. Вы можете получить лучшие результаты, если вы тренируете нейронную сеть с изображениями того же размера, что и изображение, которое вы хотите распознать.

Вы можете обучить нейронную сеть различными изображениями рукописных чисел. После обучения, если вы передадите изображение рукописного номера для идентификации, оно вернет наиболее похожее число.

Конечно, качество обучающих изображений является ключевым фактором для получения хороших результатов.

Ответ 4

В большинстве задач обработки изображений вы хотите использовать максимально возможную информацию. Учитывая изображение, есть предположения, которые мы можем сделать (и, возможно, больше):

  • Ящики вокруг чисел согласованы.
  • Число справа всегда 8 (или известно заранее)
  • Число слева всегда является числом
  • Число слева всегда написано и написано одним и тем же человеком

Тогда мы можем упростить задачу, используя эти предположения:

  • Вы можете использовать более простой подход для поиска чисел (сопоставление шаблонов). Когда у вас есть координаты соответствия, вы можете создать суб-изображение и вычесть шаблон и оставить только цифры, которые вы хотите отдать движку OCR. http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html.
  • Если вы знаете, какие цифры ожидать, то вы можете получить их из другого источника и не подвергать риску ошибки OCR. Вы даже можете включить 8 в качестве части шаблона.
  • Вы можете значительно уменьшить словарный запас (возможные результаты OCR), основываясь на этом, повысив точность двигателя OCR. Для TesseractOCR есть настройка белого списка (см. https://code.google.com/p/tesseract-ocr/wiki/FAQ#How_do_I_recognize_only_digits?).
  • Рукописный ввод значительно сложнее распознать механизм распознавания (они предназначены для печатных шрифтов). Тем не менее, вы можете обучить движок OCR распознаванию авторского "шрифта". (см. http://michaeljaylissner.com/posts/2012/02/11/adding-new-fonts-to-tesseract-3-ocr-engine/)

Суть заключается в том, чтобы использовать любые предположения, которые вы можете уменьшить, чтобы уменьшить проблему на более мелкие, более простые проблемы. Затем посмотрите, какие инструменты доступны для решения каждой из этих проблем в отдельности.

Предположения также трудно сделать, если вам нужно начать беспокоиться о реальном мире, например, если они будут проверены, вам нужно будет рассмотреть перекос или поворот "шаблона" или чисел.

Ответ 5

Брось. В самом деле. Я, как человек, не могу точно сказать, является ли третье письмо "1" или "7". Люди лучше разбираются, поэтому компьютер не справится с этим. "1" и "7" - это только один проблемный случай: "8" и "6", "3" и "9" также трудно расшифровать/выделить. Ваша цитата с ошибкой будет > 10%. Если весь почерк от одного и того же человека, вы можете попытаться обучить OCR для этого, но даже в этом случае у вас все еще будет около ~ 3% ошибок. Возможно, ваш случай использования является особенным, но это число ошибок обычно запрещает любую автоматическую обработку. Я бы посмотрел на "Механический турк", если мне действительно нужно автоматизировать это.