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

如何优化预处理步骤提升Pytesseract的OCR识别准确率?

针对OCR的有效预处理优化方案

根据你当前预处理未生效的情况,推荐以下针对性的预处理步骤,需结合图像实际问题(如噪声、光照不均、文本倾斜等)选择组合:

  • 噪声优先去除
    直接锐化会放大图像噪声,反而干扰OCR识别。如果图像存在椒盐或高斯噪声,先做去噪处理:

    # 高斯模糊(适合高斯噪声)
    denoised = cv2.GaussianBlur(gray, (3, 3), 0)
    # 或中值滤波(适合椒盐噪声)
    denoised = cv2.medianBlur(gray, 3)
    
  • 光照不均校正
    全局Otsu阈值在光照不均的图像上效果极差,改用自适应阈值或对比度增强:

    # CLAHE对比度增强(解决局部明暗不均)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    enhanced_gray = clahe.apply(gray)
    # 自适应二值化(替代全局阈值)
    binary = cv2.adaptiveThreshold(enhanced_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    
  • 文本倾斜校正
    文本倾斜是OCR识别的常见障碍,先检测倾斜角度再旋转校正:

    import numpy as np
    
    # Canny边缘检测
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    # 霍夫直线检测
    lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)
    # 计算倾斜角度中位数
    angles = []
    for line in lines:
        x1, y1, x2, y2 = line[0]
        angle = np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi
        angles.append(angle)
    median_angle = np.median(angles)
    # 旋转校正
    h, w = gray.shape[:2]
    center = (w//2, h//2)
    M = cv2.getRotationMatrix2D(center, median_angle, 1.0)
    rotated_gray = cv2.warpAffine(gray, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
    
  • 文本区域提取
    若图像存在多余背景干扰,先提取文本区域:

    # 找到文本轮廓
    contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 筛选符合文本特征的轮廓(面积、宽高比)
    text_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 50 and (cv2.boundingRect(cnt)[2]/cv2.boundingRect(cnt)[3]) < 10]
    # 生成掩码提取文本
    mask = np.zeros_like(gray)
    cv2.drawContours(mask, text_contours, -1, 255, cv2.FILLED)
    text_region = cv2.bitwise_and(gray, gray, mask=mask)
    
  • 形态学后处理
    二值化后可通过形态学操作修复文本断裂或去除小噪声:

    # 定义结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
    # 膨胀修复文本断裂
    dilated = cv2.dilate(binary, kernel, iterations=1)
    # 腐蚀去除残留噪声点
    eroded = cv2.erode(dilated, kernel, iterations=1)
    

注意事项

预处理需按需组合:如果图像本身清晰无噪声,可跳过去噪步骤;若光照均匀,Otsu阈值仍可使用。建议先分析图像核心问题(如噪声、倾斜、光照),再针对性选择步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:05:57