我在使用Python和Pytesseract编写一个简单的程序来识别图像中的数字,但问题是它总是返回♀,我正在分析这样的图像:
我读取数字的代码如下:
import pytesseractfrom pytesseract import ( Output, TesseractError, TesseractNotFoundError, TSVNotSupported, get_tesseract_version, image_to_boxes, image_to_data, image_to_osd, image_to_pdf_or_hocr, image_to_string, run_and_get_output)def analizar_resultado(path): image = cv2.imread(path, 1) text = pytesseract.image_to_string(image, config = 'digits') print('texto detectado:', text)
但我无法让它正常工作,我尝试了更多这类图像,包括质量更好的和其他类型的,但始终无法识别出任何数字,我该如何解决这个问题?非常感谢
回答:
我有一个三步解决方案
-
- 分别获取每个数字
-
- 应用阈值
-
- 读取输出
第一部分:分别获取每个数字
-
你可以通过使用索引变量来获取每个数字。例如:
-
s_idx = 0 # 开始索引e_idx = int(w/5) - 10 # 结束索引
-
-
首先获取图像的高度和宽度,然后对于每个数字,增加索引
-
for _ in range(0, 6): gry_crp = gry[0:h, s_idx:e_idx] s_idx = e_idx e_idx = s_idx + int(w/5) - 20
-
-
结果
-
第二部分:应用阈值
-
第三部分:读取
-
0.9976
-
遗憾的是,由于图像中的伪影,第二个零无法被识别为数字。
如果无法读取图像,可以尝试不同的psm
配置
代码:
import cv2from pytesseract import image_to_stringimg = cv2.imread("A3QRw.png")gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)(h, w) = gry.shape[:2]s_idx = 0 # 开始索引e_idx = int(w/5) - 10 # 结束索引result = []for i, _ in enumerate(range(0, 6)): gry_crp = gry[0:h, s_idx:e_idx] (h_crp, w_crp) = gry_crp.shape[:2] gry_crp = cv2.resize(gry_crp, (w_crp*3, h_crp*3)) thr = cv2.threshold(gry_crp, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] txt = image_to_string(thr, config="--psm 6 digits") result.append(txt[0]) s_idx = e_idx e_idx = s_idx + int(w/5) - 20 cv2.imshow("thr", thr) cv2.waitKey(0)print("".join([digit for digit in result]))