【发布时间】:2021-09-22 15:18:19
【问题描述】:
提前感谢所有愿意回答的人。
我是 OpenCV、Pytesseract 的新手,总体上对图像处理和识别非常缺乏经验。
我正在尝试从 pdf 中检测一个数字,为了这段代码,我将直接提供图像: Initial image
我的目标是检测彩色框中的数字,在本例中是数字 6。 我的预处理代码如下:
import numpy as np
import pytesseract
from PIL import Image
from PIL import ImageFilter, ImageEnhance
pytesseract.pytesseract.tesseract_cmd = 'Tesseract-OCR\tesseract.exe'
# -----Reading the image-----------------------------------------------------
img = cv2.imread('page_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.resize(gray, (1028, 720))
thres_gray = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)[1]
gray_inv = cv2.bitwise_not(thres_gray)
gray_test = cv2.bitwise_not(gray_inv)
out2 = cv2.bitwise_or(gray, gray, mask=gray_inv)
thresh_end = cv2.threshold(out2, 254, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
imageObject = Image.fromarray(thresh_end)
enhancer = ImageEnhance.Sharpness(imageObject)
sharpened1 = imageObject.filter(ImageFilter.SHARPEN)
sharpened2 = sharpened1.filter(ImageFilter.SHARPEN)
# sharpened2.show()
由此我得到以下图片: Preprocessed image
此时,由于我仍在学习如何检测感兴趣区域并使用 OpenCV 对其进行裁剪,因此为了测试代码,我决定手动裁剪图像以测试我的脚本是否能够正常工作。
因此,我传递给 pytesseract 的图像如下: Final image to read with pytesseract 我不确定图像是否足以阅读,但这是我能得到的最好的。 从这里我尝试 image_to_string:
trial = pytesseract.image_to_string(sharpened2, config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789')
我为 tesseract 尝试了许多不同的配置,但都没有奏效,最终输出始终是一个空字符串。
如果您能帮助我了解图像是否不够好,或者我在 tesseract 配置方面做错了什么,我将不胜感激。 如果您还可以帮助我正确裁剪图像,那就太棒了,但即使检测到数字对我来说也足够了。
抱歉发了这么长的帖子,再次感谢。
【问题讨论】:
-
您可以尝试在最终图像上反转黑/白,白底黑字。另外,最终处理后的图像比原始图像小很多,为什么?
-
正如你所建议的,我尝试了
cv2.bitwise_not(sharpened2),但 tesseract 的输出仍然为空。关于图像的大小,我认为这是手动裁剪的结果,但是即使导致图像模糊,我仍然可以调整其大小 -
如果你还没有看这里:tesseract-ocr.github.io/tessdoc/ImproveQuality.html 同时我会尝试制作一个脚本.. 数字周围的框总是橙色的吗?
-
非常感谢您的努力,我会仔细检查文档以查看是否可以改进。不幸的是,不同的公司对盒子采用不同的颜色,这就是我使用
cv2.COLOR_BGR2GRAY的原因,最初的想法是让整个图像完全空白,只留下带有数字的灰色框,这样我就不需要裁剪它了.但不幸的是,这是我能得到的最多的。 -
“预处理图像”看起来有缺陷。请检查。像素(样本)纵横比似乎受到了影响。
标签: python opencv python-tesseract