Предварительная обработка и решение капчи с помощью Opencv и pytesseract

Проблема

Я пытаюсь написать код на Python для предварительной обработки и распознавания изображений с использованием Tesseract-OCR. Моя цель — надежно решить эту форму капчи.

Исходная капча и результат каждого шага предварительной обработки

Шаги на данный момент

  1. Оттенки серого и пороговое значение изображения

  2. Улучшение изображения с помощью PIL

  3. Преобразование в TIF и масштабирование до> 300 пикселей

  4. Скормите его Tesseract-OCR (белый список всех алфавитов в верхнем регистре)

Тем не менее, я все еще получаю довольно неправильное чтение (EPQ M Q). Какие еще шаги предварительной обработки я могу предпринять для повышения точности? Мой код и дополнительная капча аналогичного характера приложены ниже.

похожие проверки, которые я хочу решить

Код

import cv2
import pytesseract
from PIL import Image, ImageEnhance, ImageFilter
def binarize_image_using_opencv(captcha_path, binary_image_path='input-black-n-white.jpg'):
     im_gray = cv2.imread(captcha_path, cv2.IMREAD_GRAYSCALE)
     (thresh, im_bw) = cv2.threshold(im_gray, 85, 255, cv2.THRESH_BINARY)
     # 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)



get_captcha_text_from_captcha_image("path/captcha.png")

im = Image.open("input-NEAREST.tif") # the second one 
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.save('captchafinal.tif')
text = pytesseract.image_to_string(Image.open('captchafinal.tif'), config="-c 
tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ -psm 6")
print(text)

person Simon Holloway    schedule 14.08.2017    source источник


Ответы (1)


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

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

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

person BatyaGG    schedule 14.08.2017
comment
Спасибо за несколько идей. Создание алгоритма для обнаружения каждой буквы кажется довольно сложной задачей. Любые предложения по существующим инструментам для этого? Также вы думаете, что какие-либо методы глубокого обучения будут преобладать в моей ситуации? - person Simon Holloway; 15.08.2017
comment
@SimonHolloway, чтобы найти каждую букву, попробуйте любую сегментацию изображения, доступную в opencv, например алгоритм водораздела docs.opencv.org/3.2.0/d3/db4/tutorial_py_watershed.html - person BatyaGG; 17.08.2017
comment
Я бы посоветовал посмотреть некоторые документы о распознавании рукописного ввода, в которых используются NN, такие как CTC и LSTM. Такие распознаватели должны быть более устойчивыми к повороту глифов. - person bballdave025; 20.02.2020