我目前正在研究一个项目,该项目将读取Sudoku网格的图像,检测网格,识别数字,解决难题并将解决方案覆盖在图像上。为了识别数字,我将网格划分为n * 2个图像,其中每个图像都是一个单独的网格(示例:ex2 ex9),并将其运行到pytesseract中。我的图像都没有被检测到任何文本,即使它只是一个无噪音/边界/等数字的图像。
我尝试了使图像平滑的常用方法,各种阈值化方法,调整图像大小,反转图像并将数字裁剪到边框的方法,但是这些方法似乎都不起作用。我已经测试了我为pytesseract在其他图像上编写的代码,这些代码似乎都可以正常工作,仅对我的图像不起作用。
任何人都可以针对我可以尝试的方法和/或为什么我的图像似乎不容易处理提供建议吗?
作为参考,这是我一直在使用的pytesseract的image_to_string的设置:
text = image_to_string(im, config='--psm 10 --oem 3' + '-c tessedit_char_whitelist=123456789')
答案 0 :(得分:0)
我找到了一个解决方案,但是它绝对不漂亮。 我发现pytesseract在捕获数量很少的数字时很烂。我从CNN中获取灵感,该CNN在进行图像识别时使用“零填充”。现在知道,我从中得到的唯一启发是它的实际名称,而不是方法(该方法比本文所涉及的要复杂得多)。
我找到了一个包含0的图像,并创建了一个具有三个零(任意选择的数字和数量的数字)的“零填充图像”。无论如何,我发现pytesseract能够完美地扫描数字图像! 15/15例,而不是3/15例。请记住,将OCR扫描的数字除以1000(如果使用三个0,则为数字)。
我使用了本文中显示的水平图像堆叠技术: Image stacking post
import numpy as np
from PIL import Image
def concat_images(imga, imgb):
"""
type(imga): string of filename
type(imgb): string of filename
type(new_img): PIL.Image.Image
"""
imga = np.asarray(Image.open(imga).convert('LA') )
imgb = np.asarray(Image.open(imgb).convert('LA') )
ha,wa = imga.shape[:2]
hb,wb = imgb.shape[:2]
max_height = np.max([ha, hb])
total_width = wa+wb
new_img = np.zeros(shape=(max_height, total_width, 2) , dtype = 'uint8')
new_img[:ha,:wa]=imga
new_img[:hb,wa:wa+wb]=imgb
new_img = Image.fromarray(new_img)
return new_img