Как извлечь точечный текст из изображения? - PullRequest
3 голосов
/ 25 мая 2019

Я работаю над финальным проектом моей степени бакалавра и хочу создать OCR для проверки бутылок с помощью python. Мне нужна помощь с распознаванием текста по изображению. Нужно ли применять операции cv2 лучше, обучать тессеракт или мне стоит попробовать другой метод?

Я попытался выполнить операции по обработке изображения на изображении и использовал pytesseract для распознавания символов.

Используя приведенный ниже код, полученный с этой фотографии:

enter image description here

к этому:

enter image description here

и затем к этому:

enter image description here

Функция повышения резкости:

def sharpen(img):
  sharpen = iaa.Sharpen(alpha=1.0, lightness = 1.0)
  sharpen_img = sharpen.augment_image(img)
  return sharpen_img

Код обработки изображения:

textZone = cv2.pyrUp(sharpen(originalImage[y:y + h - 1, x:x + w - 1])) #text zone cropped from the original image

sharp = cv2.cvtColor(textZone, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(sharp, 127, 255, cv2.THRESH_BINARY)

#the functions such as opening are inverted (I don't know why) that's why I did opening with MORPH_CLOSE parameter, dilatation with erode and so on

kernel_open = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
open = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel_open)

kernel_dilate = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,7))
dilate = cv2.erode(open,kernel_dilate)

kernel_close = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 5))
close = cv2.morphologyEx(dilate, cv2.MORPH_OPEN, kernel_close)

print(pytesseract.image_to_string(close))

Это результат pytesseract.image_to_string:

22203;?!)

92:53 a

Ожидаемый результат:

22/03/20

02:53 A

Ответы [ 3 ]

2 голосов
/ 26 мая 2019

Одна потенциальная вещь, которую вы можете сделать, чтобы улучшить распознавание символов, - это расширить символы, чтобы pytesseract давал лучший результат.Расширение символов соединит отдельные капли и может исправить символы / или A.Итак, начиная с вашего последнего двоичного изображения:

Оригинал

image

Расширение с 3x3 ядром с iterations=1 (слева) или iterations=2 (справа)).Вы можете поэкспериментировать с другими значениями, но не делайте это слишком много, иначе все персонажи соединятся.Может быть, это даст лучший результат с вами OCR.

image image

import cv2

image = cv2.imread("1.PNG")
thresh = cv2.threshold(image, 115, 255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilate = cv2.dilate(thresh, kernel, iterations=1)
final = cv2.threshold(dilate, 115, 255, cv2.THRESH_BINARY_INV)[1]

cv2.imshow('image', image)
cv2.imshow('dilate', dilate)
cv2.imshow('final', final)
cv2.waitKey(0)
2 голосов
/ 25 мая 2019

По полученному результату и ожидаемому результату видно, что некоторые символы распознаются правильно. Предполагая, что вы используете изображение, отличное от показанного в руководстве, я рекомендую вам изменить значения threshold и getStructuringElement.

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

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

1 голос
/ 26 мая 2019

"Нужно ли мне применять операции cv2 лучше, обучать тессеракту или я должен попробовать другой метод?"

Во-первых, слава за то, что вы взялись за этот проект и продвинулись в этом.То, что у вас есть с точки зрения OpenCV / cv2, выглядит довольно хорошо.

Теперь, если вы думаете о Tesseract, чтобы нести вас до конца пути, по крайней мере вам придется его тренировать.Здесь у вас есть сложный выбор: инвестировать в обучение Tesseract или создать CNN для распознавания ограниченного алфавита.Если у вас есть способ сегментировать изображение, я бы соблазнился пойти с последним.

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