如何提高OCR系统字符分割的准确性?

时间:2017-06-20 21:19:59

标签: python opencv computer-vision ocr feature-detection

我目前正致力于日语字母的光学字符识别系统。如果所涉及的字母是分开的并且尺寸合适,我已经能够识别单个字符。 (工作的深度学习部分)

作为下一步,我试图分割图像中的单个字符,以预测它是哪个字母。 (目前只有白色背景上的黑色字符,扫描的PDF等)

到目前为止,我得到的最有希望的结果是使用OpenCV中的“cv2.findContours”函数。 以下是3个例子:

Example Image 1

Example Image 2

Example Image 3

虽然结果并不完全可怕,但仍有许多情况下两个或多个字符被视为一个或一个字符被分成多个框。我似乎无法使代码适用于所有字体和字符大小。 虽然第一张图像仍然非常接近完美,但第二张和第三张图像并不是那么准确。 (我希望很清楚错误在哪里)

我尝试了完全不同的方法,例如霍夫变换,但我无法达到与此方法一样好的任何方法。

顺便说一句,这是我目前的代码:

import cv2
import numpy as np

file_name = '../data/test.jpg'

img  = cv2.imread(file_name)

img_final = cv2.imread(file_name)    
img_final = cv2.resize(img_final, (img_final.shape[1], img_final.shape[0]))    
img2gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(img2gray,(7,7),0)
#     thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)Y)    
ret, mask = cv2.threshold(blur, 180, 255, cv2.THRESH_BINARY)    
image_final = cv2.bitwise_and(img2gray , img2gray , mask = mask)

ret, new_img = cv2.threshold(image_final, 180 , 255, cv2.THRESH_BINARY_INV)

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(2,2))
dilated = cv2.dilate(new_img,kernel,iterations = 1)

_, contours, hierarchy = cv2.findContours(dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) 

index = 0     
for contour in contours: 
    [x,y,w,h] = cv2.boundingRect(contour)

    if w <1 and h<1:    
        continue

    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,255),2)

    cropped = image_final[y :y +  h , x : x + w]

    s = '../output/crop_' + str(index) + '.jpg'     
    cv2.imwrite(s , cropped)    
    index = index + 1

cv2.imshow('captcha_result' , img)    
cv2.waitKey()
s2 = '../data/output.jpg'     
cv2.imwrite(s2 , img)

现在问题如下:

  • 有人知道如何提高代码的准确性吗? 采取一种全新的方法更好吗? 滑动窗可以帮助我吗?

  • 我从哪里开始? 我可以使用滑动窗口将单个字符发送到预测吗? 有了所有的误报(例如,尽管试图限制它,但是字符被分成两部分)我不确定我是否可以简单地使用字符的裁剪图像以及如何进一步过滤结果。

    < / LI>

由于我对这一切都不熟悉,我真的很感激我能得到任何帮助或提示!

我期待着您的回复! :)

0 个答案:

没有答案