如何使用OpenCV与pytesseract优化预处理提升数字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
相关产品推荐
相关产品推荐

