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

如何优化代码以准确提取复杂背景下带黑边的白色文字?

白色带黑边文字的OCR识别改进方案

一、修正Tesseract配置错误

原配置中字符白名单格式存在问题,tessedit_char_whitelist= 'ABCDEFG...'里的空格和单引号会被当作白名单字符的一部分,导致识别逻辑混乱。同时PSM模式选择需贴合文本场景:

  • 若为单块连续文本,用--psm 6(假设文本为统一块)
  • 若文本分散分布,保留--psm 11但需配合其他预处理优化
  • 白名单仅保留需要识别的字符,去掉多余空格

修正后的配置示例:

custom_config = r"--oem 3 --psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

二、优化预处理逻辑(针对白色带黑边文字)

白色带黑边的文字核心是保留黑边轮廓、突出文字与背景的差异,原预处理的双边滤波会模糊黑边,高固定阈值会丢失黑边信息,调整如下:

方案一:提取黑边并反转图像(适配Tesseract默认识别习惯)

def preprocess_finale(im):
    # 转灰度图
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    # 提取黑边区域(白色文字的黑边灰度值低,反选后得到黑边)
    _, black_edges = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY_INV)
    # 膨胀操作让黑边连贯,避免文字断裂
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
    dilated = cv2.dilate(black_edges, kernel, iterations=1)
    # 反转成黑字白底,符合Tesseract默认识别偏好
    final = cv2.bitwise_not(dilated)
    return final

方案二:自适应阈值处理(应对复杂背景)

针对亮度不均的背景,用自适应阈值替代固定阈值,提升鲁棒性:

def preprocess_finale(im):
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    # 高斯自适应阈值,自动适配局部亮度
    adaptive_thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
    # 中值滤波去除小噪点
    cleaned = cv2.medianBlur(adaptive_thresh, 3)
    return cleaned

三、调整语言与识别参数

如果文本仅包含大写字母和数字,无需加载意大利语训练集,改用英语训练集(lang='eng')可避免无关字符干扰:

img = np.array(Image.open(i))
im = preprocess_finale(img)
text = pytesseract.image_to_string(im, lang='eng', config=custom_config)

四、额外优化建议

  • 裁剪文本区域:手动或自动截取仅包含文字的区域,减少背景干扰
  • 放大低分辨率图像:用cv2.resize(im, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)提升文字清晰度
  • 测试PSM模式:根据文本布局选择--psm 7(单行文本)或--psm 8(单个词),进一步提升准确率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:48:19