如何对图像中与背景同色的低可见度数字进行OCR识别?
优化方案
预处理核心优化点
- 灰度转换后追加CLAHE自适应直方图均衡,解决局部亮度不均、对比度低的问题
- 替换全局阈值为自适应高斯阈值,适配光照不均匀的裁剪图像
- 增加形态学开运算过滤细碎噪点,避免噪点干扰字符特征提取
- 按需放大图像2~3倍,OCR模型对小尺寸字符的识别精度会明显提升
完整可运行代码
import cv2 import matplotlib.pyplot as plt import pytesseract def display(img,cmap='gray'): fig = plt.figure(figsize=(12,10)) ax = fig.add_subplot(111) ax.imshow(img,cmap='gray') # 读取图像 img = cv2.imread("/content/PXL_20211019_171419721.MP.jpg") # 转灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 1. 对比度增强 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) enhanced_gray = clahe.apply(gray) # 2. 自适应高斯阈值二值化 binary = cv2.adaptiveThreshold(enhanced_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 3. 形态学去噪 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) denoised = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=1) # 4. 放大图像 scaled = cv2.resize(denoised, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # 查看预处理结果 display(scaled) # Tesseract识别,指定只识别数字、单字符行模式 result = pytesseract.image_to_string(scaled, config='--psm 8 --oem 3 -c tessedit_char_whitelist=0123456789') print("识别结果:", result.strip())
识别参数说明
- 如果你用PaddleOCR,可指定
rec_char_type='en'并限制识别字符集为数字,同时关闭检测环节直接做识别,减少误判 - 预处理参数可根据实际图像效果微调:比如阈值的块大小、形态学核的尺寸,适配不同清晰度的裁剪图
内容的提问来源于stack exchange,提问作者anand
相关产品推荐
相关产品推荐

