Прочитайте, какое число цветное изображение номера, чтобы утешить - PullRequest
6 голосов
/ 17 января 2020

Поэтому я пытаюсь создать программу, которая может видеть, какое число является изображением, и печатать целое число в консоли. (Я использую python 3)

Например, что программа распознает, что следующее изображение (фактическое изображение, которое программа должна проверить) имеет номер 2:

number 2

Я пытался просто сравнить его с другим изображением с 2 в нем с cv2.matchTemplate(), но каждый раз, когда значения rgb синих пикселей немного различаются для каждого изображения и изображение может быть немного больше или меньше. например, следующее изображение:

number 2

Оно также должно распознавать его отдельно от всех других изображений с синим номером (0-9), например, следующий:

number 5

Я пробовал коды шаблонов с множественным соответствием и создал папку с номерами 0-9 в качестве шаблонов, но каждый раз почти каждый номер распознается в номере, который должен быть распознан. например, номер 5 распознается на изображении с номером 2. И если он не распознает все из них, он распознает неправильный (ые).

Те, которые я пробовал:

но, как я уже говорил, до того, как возникнут эти проблемы.

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

У кого-нибудь есть решение? Я глуп, что использую cv2.matchTemplate(), и есть ли намного более простой вариант? (Я не против использовать для этого библиотеку, потому что это часть большого кода, но я предпочитаю кодировать ее, а не библиотеки)

Ответы [ 3 ]

4 голосов
/ 18 января 2020

Вместо использования сопоставления с шаблоном лучше использовать Pytesseract OCR для чтения числа с image_to_string(). Но перед выполнением распознавания необходимо предварительно обработать изображение. Для оптимальной производительности оптического распознавания предварительно обработанное изображение должно иметь требуемый текст / число / символы для распознавания текста черным цветом с фоном белым . Простой шаг предварительной обработки - преобразовать изображение в градации серого, пороговое значение Оцу, чтобы получить двоичное изображение, а затем инвертировать изображение. Вот визуализация шага предварительной обработки:

Входное изображение -> Оттенки серого -> Порог Оцу -> Инвертированное изображение готово для распознавания текста

enter image description here enter image description here enter image description here enter image description here

Результат от Pytesseract OCR

2

Вот результаты с другими изображениями:

enter image description here enter image description here enter image description here enter image description here

2

enter image description here enter image description here enter image description here enter image description here

5

Мы используем опцию конфигурации --psm 6 для принятия единого единообразного блока текста. См. здесь для получения дополнительных параметров конфигурации.

Код

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image, grayscale, Otsu's threshold, then invert
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
invert = 255 - thresh

# Perfrom OCR with Pytesseract
data = pytesseract.image_to_string(invert, lang='eng', config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('invert', invert)
cv2.waitKey()

Примечание: Если вы настаиваете на использовании сопоставления с шаблоном, вам нужно использовать масштаб соответствие шаблона варианта. Взгляните на , как изолировать все внутри контура, масштабировать его и проверить сходство с изображением? и Python Обнаружение линии OpenCV для обнаружения символа X в изображении для Некоторые примеры. Если вы точно знаете, что ваши изображения синего цвета, тогда другим подходом было бы использовать пороговое значение цвета с cv2.inRange() для получения изображения в двоичной маске, а затем применить OCR к изображению.

2 голосов
/ 17 января 2020

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

Очень просто ...

  • Измените размер ввода или размер шаблонов.
  • Рассчитайте любую прямую оценку соответствия на входе с каждым из 10 шаблонов. Достаточно простого числа совпадений: сколько пикселей соответствует двум изображениям.
  • Шаблон с наивысшей оценкой - это идентификация.

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

0 голосов
/ 18 января 2020

Если у вас нет доступа к движку OCR, просто знайте, что вы можете создать свою собственную систему OCR с помощью классификатора KNN. В этом примере реализация не должна быть очень сложной, поскольку вы только классифицируете числа. OpenCV обеспечивает очень простую реализацию KNN.

Классификатор обучается с использованием функций, рассчитанных на основе примеров из известных экземпляров классов. В этом случае у вас есть 10 классов (если вы работаете с цифрами 0–9), так что вы можете подготовить «шаблон» со своими цифрами, извлечь некоторые функции, обучить классификатор и использовать его для классификации новых экземпляров.

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

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