Я пытаюсь написать код на Python для ручной предварительной обработки и распознавания изображений с помощью Tesseract-OCR.
Ручная обработка:
Чтобы вручную распознать текст для одного изображения, я предварительно обрабатываю изображение с помощью GIMP и создаю изображение в формате TIF. Затем я скармливаю его Tesseract-OCR, который распознает его правильно.
Чтобы предварительно обработать изображение с помощью GIMP, я делаю -
- Измените режим на RGB / оттенки серого
Меню - Изображение - Режим - RGB - Установка пороговых значений
Меню - Инструменты - Инструменты цвета - Пороговые значения - Авто - Измените режим на "Индексированный"
Меню - Изображение - Режим - Индексированный - Изменить размер / масштабировать до ширины ›300 пикселей
Меню - Изображение - Масштабировать изображение - Ширина = 300 - Сохранить как Tif
Потом кормлю его тессеракт -
$ tesseract captcha.tif output -psm 6
И все время получаю точный результат.
Код Python:
Я попытался воспроизвести описанную выше процедуру с помощью OpenCV и Tesseract -
def binarize_image_using_opencv(captcha_path, binary_image_path='input-black-n-white.jpg'):
im_gray = cv2.imread(captcha_path, cv2.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# although thresh is used below, gonna pick something suitable
im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]
cv2.imwrite(binary_image_path, im_bw)
return binary_image_path
def preprocess_image_using_opencv(captcha_path):
bin_image_path = binarize_image_using_opencv(captcha_path)
im_bin = Image.open(bin_image_path)
basewidth = 300 # in pixels
wpercent = (basewidth/float(im_bin.size[0]))
hsize = int((float(im_bin.size[1])*float(wpercent)))
big = im_bin.resize((basewidth, hsize), Image.NEAREST)
# tesseract-ocr only works with TIF so save the bigger image in that format
tif_file = "input-NEAREST.tif"
big.save(tif_file)
return tif_file
def get_captcha_text_from_captcha_image(captcha_path):
# Preprocess the image befor OCR
tif_file = preprocess_image_using_opencv(captcha_path)
# Perform OCR using tesseract-ocr library
# OCR : Optical Character Recognition
image = Image.open(tif_file)
ocr_text = image_to_string(image, config="-psm 6")
alphanumeric_text = ''.join(e for e in ocr_text)
return alphanumeric_text
Но я не получаю такой точности. Что я пропустил?
Обновление 1:
- Исходное изображение
- Изображение Tif, созданное с помощью GIMP
- Изображение Tif, созданное моим кодом Python
Обновление 2:
Этот код доступен по адресу https://github.com/hussaintamboli/python-image-to-text
comparing the binary outputs
и т. д. - person ZdaR   schedule 09.09.2015erosion
иdilation
, чтобы заполнить отверстия, а также удалить маленькие точки на обратной стороне соответственно. - person ZdaR   schedule 10.09.2015