tesseract - 如何处理字符分隔符
tesseract - how to deal with character separators
如何使用 tesseract(预处理或通过特殊的 tesseract 配置)以正确的方式识别字符分隔符内的文本,尤其是梳状类型(第 3 张图片),如下面的三张图片所示:
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 |
正如观察到的那样,这些数字正确地进行了 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,文字识别没有问题。但是,此应用程序是付费的并且是封闭源代码。
有很多方法可以解决您的问题。例如,如果构成你的单元格的线是连接的——你可以使用 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)
其他方法包括但不限于通过查找轮廓或进行形态学操作来检测字母,使用启发式方法(例如字母应该在同一行的事实)等...
如何使用 tesseract(预处理或通过特殊的 tesseract 配置)以正确的方式识别字符分隔符内的文本,尤其是梳状类型(第 3 张图片),如下面的三张图片所示:
https://i.stack.imgur.com/Jb5Qd.png
https://i.stack.imgur.com/GhzCa.png
https://i.stack.imgur.com/rI4c1.png
1)我尝试进行OCR的具体图片如下图。
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,文字识别没有问题。但是,此应用程序是付费的并且是封闭源代码。
有很多方法可以解决您的问题。例如,如果构成你的单元格的线是连接的——你可以使用 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)
其他方法包括但不限于通过查找轮廓或进行形态学操作来检测字母,使用启发式方法(例如字母应该在同一行的事实)等...