Python+OpenCV+Tesseract数字识别无结果,如何优化图像质量?
图像数字提取优化方案
问题背景
尝试使用Python结合OpenCV与Tesseract提取图像中的数字,但代码未返回预期数字。当前实现代码如下:
import fitz, pytesseract, os, re import cv2 sTemp = "Number.png" directory = '.\MyFolder' def useMagick(img): pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' command = 'magick convert {} -resize 1024x640 -density 300 -quality 100 {}'.format(img, sTemp) os.system(command) def readNumber(img): img = cv2.imread(img) gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) txt = pytesseract.image_to_string(gry) print(txt) try: return re.findall(r'\d+\s?\/\s?(\d+)', txt)[0] except: blur = cv2.GaussianBlur(gry, (3,3), 0) txt = pytesseract.image_to_string(blur) try: return re.findall(r'\d+\s?\/\s?(\d+)', txt)[0] except: return 'REVIEW' sPath = os.path.join(directory, sTemp) useMagick(sPath) x = readNumber(sPath) print(x)
示例图像:
当前代码未返回任何数字,以下是优化图像质量及提取逻辑的具体方案:
优化方案
1. 调整图像预处理流程,增强数字对比度
原代码的灰度转换和简单高斯模糊不足以突出低对比度的数字,建议添加阈值二值化和形态学操作:
def readNumber(img): img = cv2.imread(img) # 灰度转换 gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应阈值二值化,适配光照不均场景 thresh = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 形态学膨胀,填充数字内部细小空隙 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) dilated = cv2.dilate(thresh, kernel, iterations=1) # 限定识别范围,减少干扰 txt = pytesseract.image_to_string(dilated, config='--psm 6 -c tessedit_char_whitelist=0123456789/') print(txt) try: return re.findall(r'\d+\s?\/\s?(\d+)', txt)[0] except: return 'REVIEW'
- 自适应阈值:根据局部区域动态调整阈值,解决图像光照不均问题,让数字与背景彻底分离
- 形态学膨胀:填补数字笔画的断裂部分,强化字符连续性,提升Tesseract识别准确率
- Tesseract专属配置:
--psm 6指定图像为单一文本块,tessedit_char_whitelist仅允许识别数字和斜杠,过滤无关字符干扰
2. 优化ImageMagick预处理命令
原命令参数缺乏针对性,调整为更贴合数字提取的配置:
def useMagick(img, output_img): pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 增强对比度+放大尺寸+锐化边缘,三重强化数字清晰度 command = 'magick convert {} -contrast-stretch 0.1% -resize 200% -sharpen 0x1.0 {}'.format(img, output_img) os.system(command)
-contrast-stretch:拉伸图像对比度,让暗部更暗、亮部更亮,突出数字轮廓-resize 200%:放大图像,让数字笔画更粗壮清晰,Tesseract对高分辨率字符识别率更高-sharpen:锐化边缘,强化数字的边界感,减少模糊干扰
3. 修正文件路径逻辑
原代码存在路径不一致问题:useMagick处理后生成的文件在当前目录,而readNumber读取的是原目录下的文件,导致读取未处理的原图像。修正如下:
sPath = os.path.join(directory, sTemp) # 生成处理后的临时文件,避免覆盖原图像 processed_temp = os.path.join(directory, "processed_" + sTemp) useMagick(sPath, processed_temp) x = readNumber(processed_temp) print(x)
4. 增加调试步骤
在预处理的每一步保存图像,直观查看处理效果,方便参数调整:
cv2.imwrite('gray.png', gry) cv2.imwrite('thresh.png', thresh) cv2.imwrite('dilated.png', dilated)
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

