如何使用tesseract(预处理或通过特殊的tesseract配置)以正确的方式处理字符分隔符内的文本,特别是梳子类型(第三幅图像),如以下三个图像所示:
https://i.stack.imgur.com/Jb5Qd.png
https://i.stack.imgur.com/GhzCa.png
https://i.stack.imgur.com/rI4c1.png
1)下面显示了我尝试对其执行OCR的特定图像。 图像清晰,高分辨率且无噪点。如果我将此图像直接输入到tesseract中(几乎在所有页面分段模式中都进行了尝试),则输出如下:
1
11, 9;9j1 | 0,7 4142 |
如所观察到的,数字正确为OCRed,并显示为提取文本的子集。但是,分隔符也被识别为“ 1”,“,”,“ 7”,“ 4”,“ |”。预期输出为1992 07 12。
2)我是图像识别的新手。图像预处理是OCR之前的重要步骤。我尝试从左,下和右进行泛洪以删除字符分隔符。该概念来自此处:https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/ 尽管此解决方案适用于此特定图像,但绝对不是通用解决方案。由于这些字符分隔符以多种形式通用,因此必须有一种提取文本的好方法。
3)我尝试了谷歌搜索,但在结果的前10页中找不到任何可靠的内容(无关主题上的很多噪音)。我的搜索词是“ tesseract字符分隔符”。较差的结果可能是由于搜索词的选择不正确,这与CV社区使用的搜索词不同。
4)我尝试了abbyy finereader,并且可以毫无问题地识别文本。但是,此应用程序是付费的,并且是封闭源。
答案 0 :(得分:2)
有很多方法可以解决您的问题。例如,如果连接了构成单元格的线-您可以使用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)
其他方法包括但不限于通过寻找轮廓或进行形态学操作,使用启发式方法(例如字母应在同一行上等)来检测字母...