Tesseract - 如何处理字符分隔符

3

如何在正确的方式下处理Tesseract中字符分隔符内的文本(通过预处理或特殊的Tesseract配置),特别是像下面这三张图片中的梳子状(第三张)图像:

https://istack.dev59.com/Jb5Qd.webp
https://istack.dev59.com/GhzCa.webp
https://istack.dev59.com/rI4c1.webp

1) 我尝试进行OCR的特定图像如下所示。 enter image description here 该图像清晰,分辨率高且没有噪音。如果我直接将此图像输入tesseract(尝试了几乎所有页面段模式),输出结果如下:

1
11, 9;9j1 | 0,7 4142 |

观察发现,数字已经正确地被OCR识别并显示为提取的文本子集。然而,分隔符也被识别为"1"、","、"7"、"4"和"|"。期望的输出结果是1992年07月12日。

2) 我对图像识别还很陌生。在OCR之前,图像预处理是一个重要的步骤。我尝试了从左侧、底部和右侧进行漫水填充以删除字符分隔符。这个概念来自于这里:https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/。虽然这个解决方案对于这个特定的图像有效,但它显然不是通用解决方案。由于这些字符分隔符在许多表单中都很常见,必须有一种好的方法来提取文本。

3) 我已经尝试过谷歌搜索,在前10页的结果中没有找到任何可靠的信息(有很多与无关主题相关的噪音)。我的搜索词是"tesseract character separator"。结果不佳可能是由于选择的搜索词与CV社区使用的不同。

4) 我已经尝试了abbyy finereader,文本识别没有问题。然而,这个应用程序是收费且闭源的。


2
@GhostCat 我已经改进了我的帖子,希望有人能够提供一些方向/建议。互联网上关于识别字符分隔符内的字符的信息严重缺乏。这意味着我可能做错了什么,这就是为什么我发布这个问题的原因。除了我已经更新的内容之外,我不确定还有什么其他信息可以提供。如果您有任何建议,请发布更新。 - jackluo923
我觉得现在看起来更好了!祝好运! - GhostCat
1
应该是“1991年07月12日”吧? - bballdave025
1个回答

4

有许多方法可以解决您的问题。例如,如果形成单元格的行相互连接-您可以使用opencv过滤大型连接组件。

gray = cv2.imread('path_to_your/image.png', 0)
_, blackAndWhite = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(blackAndWhite, None, None, None, 8, cv2.CV_32S)
sizes = stats[1:, -1]
img2 = np.zeros((labels.shape), np.uint8)

for i in range(0, nlabels - 1):
    if sizes[i] <= 5000:   #CHANGE THIS VALUE TO CHANGE THRESHOLD.
        img2[labels == i + 1] = 255

res = cv2.bitwise_not(img2)

cv2.imshow('res.png', res)
cv2.waitKey(0)

enter image description here

其他方法包括但不限于通过找到轮廓或进行形态学操作来检测字母,使用启发式方法如字母应该在同一行等...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接