You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何优化Python中Pytesseract OCR的图像预处理以提升识别准确率

提升Pytesseract图像转文本稳定性的优化方案

首先得点明你代码里的一个核心问题:你用了--psm 10这个配置,它是单字符识别模式,但你要识别的是U3DS这种多字符内容,这就难怪会出现识别成ss这类离谱错误了!先把这个核心配置改过来,再结合预处理流程优化,就能明显提升准确率。

下面是具体的优化步骤和调整后的代码:

一、调整Tesseract的核心配置参数

  • 替换PSM模式:针对单一单词(比如U3DS),推荐用--psm 8(假设图像中只有一个独立单词),或者--psm 7(假设图像是单一文本行),完全适配你的识别场景;
  • 添加字符白名单:因为你的目标是大写字母+数字,设置白名单可以让Tesseract只关注这些字符,大幅减少误识别:-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
  • 明确OCR引擎模式:加上--oem 3(使用默认的LSTM+传统引擎混合模式,兼容性和准确率都更优)。

二、优化图像预处理流程

你的现有预处理步骤有可调整的空间,针对OCR识别的特性,我做了这些优化:

  • 缩放时用更清晰的插值方法,避免放大后出现锯齿;
  • 增加形态学操作,去除小噪点、规整字符边缘;
  • 提供两种去噪方案,可根据图像实际噪声类型切换;
  • 针对不同对比度的图像,提供两种阈值处理选项。

调整后的完整代码

import pytesseract as pt
import cv2
import numpy as np

# 配置Tesseract路径
pt.pytesseract.tesseract_cmd = r"C:\Users\user\AppData\Local\Programs\Tesseract-OCR\tesseract.exe"

# 读取目标图像
img = cv2.imread("dd.png")  # 待识别内容为U3DS

# 1. 缩放图像(用INTER_CUBIC插值提升放大后的清晰度)
scale_factor = 1.3  # 放大1.3倍,可根据图像实际尺寸调整
img = cv2.resize(img, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC)

# 2. 转为灰度图,减少颜色干扰
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 3. 去噪:两种方案可选,根据图像噪声类型切换
# 方案1:双边滤波——适合保留字符边缘的同时去除高斯噪
# gray = cv2.bilateralFilter(gray, 9, 75, 75)
# 方案2:中值滤波——适合处理椒盐噪(图像上的白点/黑点噪点)
gray = cv2.medianBlur(gray, 3)

# 4. 阈值处理:两种方案可选
# 方案1:自适应阈值——适合有阴影、光照不均的图像
# th = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
# 方案2:OTSU阈值——适合对比度高、光照均匀的图像
th = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# 5. 形态学操作:去除小噪点,规整字符边缘
kernel = np.ones((2, 2), np.uint8)
th = cv2.erode(th, kernel, iterations=1)  # 先腐蚀消除小噪点
th = cv2.dilate(th, kernel, iterations=1)  # 再膨胀还原字符边缘

# 6. 锐化(可选,图像模糊时开启)
kernel_sharpen = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
sharpened = cv2.filter2D(th, -1, kernel_sharpen)

# 显示预处理后的图像(方便调试,看字符是否清晰规整)
cv2.imshow("Preprocessed Image", sharpened)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 7. Tesseract识别:使用优化后的配置
custom_config = r"--oem 3 --psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
result = pt.image_to_string(sharpened, config=custom_config)
print("识别结果:", result.strip())

三、额外调试小技巧

  • 先观察预处理后的图像:如果字符边缘模糊、有残留噪点,就调整去噪和形态学操作的参数;
  • 尝试不同PSM模式:如果图像中有多个单词,换成--psm 6(假设图像是一个单一文本块);
  • 如果图像倾斜,添加旋转矫正:用霍夫变换检测文本角度,再旋转图像对齐。

内容的提问来源于stack exchange,提问作者simransharma3

火山引擎 最新活动