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

如何使用OpenCV与pytesseract优化预处理提升数字OCR准确率

OCR数字识别优化方案

待识别的数字原图如下:
待OCR识别的数字图片

关于红色背景的影响

红色背景确实会提升识别难度、干扰识别结果。这张图的红色背景本身带有杂色,和深色数字的对比度没有黑白场景高,直接全图转灰度再做固定阈值二值化,很容易把背景噪点和数字笔画混在一起,最终导致识别错漏。

预处理优化方向

  • 优先提取红色通道做后续处理:红色背景在红色通道下亮度接近纯白,数字为深黑色,对比度远高于直接三通道转灰度的效果,能从根源上降低背景干扰
  • 调整图片放大的插值算法:你当前用的INTER_AREA适合图片缩小场景,放大时换成INTER_CUBIC或者INTER_LINEAR,放大倍数调到2~3倍即可,能让数字边缘更锐利
  • 移除无效的字体细化逻辑:你写的thin_font函数用1x1核对图像做腐蚀,实际不会起到细化字体的作用,反而会丢失数字边缘的细节信息,换成3x3核的高斯模糊做轻度去噪即可
  • 替换固定阈值为自适应阈值:固定阈值很难适配图中局部亮度不均的问题,用高斯自适应阈值做二值化,能更好地保留完整的数字笔画
  • 二值化后增加轻度去噪步骤:用2x2的核对二值图做一次形态学开运算,可以去掉背景残留的细碎杂点,注意不要用过大的核做腐蚀/膨胀,避免数字变形
  • 修正tesseract调用参数:你当前的config参数写法有误,正确的单行数字识别配置应该加--psm 7,告诉tesseract当前图是单行文本,配合outputbase digits限定只识别数字,准确率会明显提升

修正后的参考代码

import cv2
import pytesseract
import numpy as np

imgFile = "c:/test1.jpg"
img = cv2.imread(imgFile)

# 按2.5倍放大图片,使用适配放大场景的插值算法
width = int(img.shape[1] * 2.5)
height = int(img.shape[0] * 2.5)
dim = (width, height)
resized = cv2.resize(img, dim, interpolation=cv2.INTER_CUBIC)

# 拆分通道提取红色通道,最大化背景和数字的对比度
_, _, r_channel = cv2.split(resized)
# 轻度高斯模糊去除随机噪点
blur_img = cv2.GaussianBlur(r_channel, (3, 3), 0)
# 自适应阈值二值化,适配局部亮度差异
thresh_img = cv2.adaptiveThreshold(
    blur_img, 
    255, 
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
    cv2.THRESH_BINARY_INV, 
    11, 
    2
)
# 形态学开运算去除残留细碎杂点
kernel = np.ones((2, 2), np.uint8)
clean_img = cv2.morphologyEx(thresh_img, cv2.MORPH_OPEN, kernel, iterations=1)

# 调用tesseract识别,使用正确的配置参数
recognize_result = pytesseract.image_to_string(
    clean_img, 
    config="--psm 7 outputbase digits"
)
print(recognize_result.strip())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:00:57