Pytesseract(Tesseract OCR)没有提取一些数字
Pytesseract (Tesseract OCR) not picking up some numbers
我一直在开发一个使用光学字符识别来读取财务报表的程序,但我一直无法弄清楚为什么开源模块仍然无法读取某些数字使用.
我创建了一个输出文件,在检测到文本的原始输入周围有绿色框。在这种情况下,带有“381”的行被选中,但下面的行(具有完全相同的格式)被忽略。
我正在使用这段代码在提取数据之前对图像进行预处理,因为之前的错误率高达 20%,现在接近 5%。
img = cv2.imread(filename)
img = cv2.resize(img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((1, 1), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)
在此预处理之后,我还 运行 一种从文档中删除超过一定大小的实线的算法,但在这种情况下,“35”或“381”在原始文件中都没有下划线,所以我对此表示怀疑导致了这个问题。我还验证了线检测算法没有删除 5 的顶部。
我不是 OCR 或 CV 方面的专家,我的专长是更多数据和通用编程——我真的只需要让这个库完成它宣传的工作,这样我就可以继续前进并完成该程序。有谁知道可能导致此问题的原因吗?
我建议考虑将您的配置设置为特定的页面分割方法 (PSM),例如 11,因为您正在寻找稀疏文本。例如,我的代码为:
results = pytesseract.image_to_data(Image.open(tempFile), lang='eng', config='--psm 11', output_type=Output.DICT)
PSM如下:
0 Orientation and script detection (OSD) only.
1 Automatic page segmentation with OSD.
2 Automatic page segmentation, but no OSD, or OCR.
3 Fully automatic page segmentation, but no OSD. (Default)
4 Assume a single column of text of variable sizes.
5 Assume a single uniform block of vertically aligned text.
6 Assume a single uniform block of text.
7 Treat the image as a single text line.
8 Treat the image as a single word.
9 Treat the image as a single word in a circle.
10 Treat the image as a single character.
11 Sparse text. Find as much text as possible in no particular order.
12 Sparse text with OSD.
13 Raw line. Treat the image as a single text line,
bypassing hacks that are Tesseract-specific.
还有一种按数字而不是按文本进行搜索的方法,这可能也有帮助。
我一直在开发一个使用光学字符识别来读取财务报表的程序,但我一直无法弄清楚为什么开源模块仍然无法读取某些数字使用.
我创建了一个输出文件,在检测到文本的原始输入周围有绿色框。在这种情况下,带有“381”的行被选中,但下面的行(具有完全相同的格式)被忽略。
我正在使用这段代码在提取数据之前对图像进行预处理,因为之前的错误率高达 20%,现在接近 5%。
img = cv2.imread(filename)
img = cv2.resize(img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((1, 1), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)
在此预处理之后,我还 运行 一种从文档中删除超过一定大小的实线的算法,但在这种情况下,“35”或“381”在原始文件中都没有下划线,所以我对此表示怀疑导致了这个问题。我还验证了线检测算法没有删除 5 的顶部。
我不是 OCR 或 CV 方面的专家,我的专长是更多数据和通用编程——我真的只需要让这个库完成它宣传的工作,这样我就可以继续前进并完成该程序。有谁知道可能导致此问题的原因吗?
我建议考虑将您的配置设置为特定的页面分割方法 (PSM),例如 11,因为您正在寻找稀疏文本。例如,我的代码为:
results = pytesseract.image_to_data(Image.open(tempFile), lang='eng', config='--psm 11', output_type=Output.DICT)
PSM如下:
0 Orientation and script detection (OSD) only.
1 Automatic page segmentation with OSD.
2 Automatic page segmentation, but no OSD, or OCR.
3 Fully automatic page segmentation, but no OSD. (Default)
4 Assume a single column of text of variable sizes.
5 Assume a single uniform block of vertically aligned text.
6 Assume a single uniform block of text.
7 Treat the image as a single text line.
8 Treat the image as a single word.
9 Treat the image as a single word in a circle.
10 Treat the image as a single character.
11 Sparse text. Find as much text as possible in no particular order.
12 Sparse text with OSD.
13 Raw line. Treat the image as a single text line,
bypassing hacks that are Tesseract-specific.
还有一种按数字而不是按文本进行搜索的方法,这可能也有帮助。