我目前在pytesseract中遇到问题,该软件无法在此图像中检测到数字:
https://i.stack.imgur.com/kmH2R.png
这是从应用了阈值滤镜的较大图像中获取的。
由于某种原因,pytesseract不想识别该图像中的6。有什么建议么?这是我的代码:
image = #Insert raw image here. My code takes a screenshot.
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
image = cv2.medianBlur(image, 3)
rel, gray = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# If you want to use the image from above, start here.
image = Image.fromarray(image)
string = pytesseract.image_to_string(image)
print(string)
编辑:经过一些进一步的调查,我的代码可以很好地包含2位数字。但不是那些具有奇数位的数字。
最佳答案
pytesseract的默认模式是查找大块文本(PSM_SINGLE_BLOCK或--psm 6),为了让它检测到单个字符,您需要使用--psm 10(PSM_SINGLE_CHAR)选项运行它。但是,由于您提供的图像角落中的黑点,它将黑点检测为随机破折号,并且在此模式下不返回任何东西,因为它有多个字符,因此在这种情况下,您需要使用--psm 8(PSM_SINGLE_WORD):string = pytesseract.image_to_string(image, config='--psm 8')
这样做的输出将包括那些随机字符,因此您需要在pytesseract运行之后将其删除,或改善数字周围的边框以消除任何噪音。另外,如果检测到的所有字符都是数字,则可以在“--psm 8”之后添加“-c tessedit_char_whitelist = 0123456789”以改善检测效果。
简化代码的其他一些小技巧是cv2.imread可以选择将图像读取为黑白图像,因此您以后无需再运行cvtColor,只需执行以下操作:image = cv2.imread('/path/to/image/6.png', 0)
您还可以在调用pytesseract的过程中创建PIL图像对象,因此该行可以简化为:string = pytesseract.image_to_string(Image.fromarray(img), config='--psm 8')
只要脚本顶部有“from PIL import Image”。