Опитвам се да напиша код на Python за ръчна предварителна обработка и разпознаване на изображения с помощта на Tesseract-OCR.
Ръчен процес:
За ръчно разпознаване на текст за едно изображение, обработвам предварително изображението с помощта на Gimp и създавам TIF изображение. След това го подавам на Tesseract-OCR, който го разпознава правилно.
За да обработя предварително изображението с помощта на Gimp, правя -
- Променете режима на RGB / Grayscale
Меню -- Изображение -- Режим -- RGB - Праг
Меню -- Инструменти -- Инструменти за цвят -- Праг -- Автоматично - Променете режима на Индексиран
Меню -- Изображение -- Режим -- Индексиран - Преоразмеряване / Мащабиране до ширина › 300px
Меню -- Изображение -- Мащабиране на изображението -- Ширина=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