You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:25:33