You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Paddle OCR在图像空白占比过高时无法识别文本的问题排查

PaddleOCR信封识别异常问题分析与解决

问题场景

拍摄了数千张信封图片(为保密已隐藏地址),多数情况下PaddleOCR识别效果良好,但部分图片仅能提取到信封右上角的内容:Lettermall CON nuqme;手动裁剪掉空白区域、仅保留信封主体后,识别即可恢复正常。使用的基础代码如下:

ocr = PaddleOCR(use_angle_cls=True, lang='en')
result = ocr.ocr(image_path, cls=True)

问题原因

  • PaddleOCR的文本检测模块(DB检测)对大比例空白背景敏感:当信封在整张图片中占比过小时,模型会优先识别高对比度的小区域文本(如右上角标识),而忽略占比相对大但对比度较低的信封主体文本。
  • 部分图片可能存在拍摄角度轻微偏移、局部光照不均,再加上空白区域的干扰,进一步降低了模型定位信封主体文本块的准确率。

解决方法

1. 自动批量裁剪空白区域

通过OpenCV实现自动提取信封轮廓并裁剪掉边缘空白,核心逻辑是利用阈值分割区分前景(信封)和背景,然后裁剪出最大轮廓对应的区域。示例代码:

import cv2
import numpy as np

def auto_crop_envelope(image_path):
    # 读取图片
    img = cv2.imread(image_path)
    if img is None:
        return None
    # 转为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 阈值分割,将背景(亮区域)转为黑色,信封转为白色
    _, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)
    # 查找最外层轮廓
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if not contours:
        return img
    # 找到面积最大的轮廓(信封主体)
    max_contour = max(contours, key=cv2.contourArea)
    x, y, w, h = cv2.boundingRect(max_contour)
    # 裁剪信封区域
    cropped_img = img[y:y+h, x:x+w]
    return cropped_img

将裁剪逻辑与OCR结合,批量处理代码示例:

from paddleocr import PaddleOCR
import os

# 初始化OCR
ocr = PaddleOCR(use_angle_cls=True, lang='en')
# 图片文件夹路径
img_dir = "your_envelope_images_dir"
# 遍历文件夹内所有图片
for filename in os.listdir(img_dir):
    if filename.endswith(('.png', '.jpg', '.jpeg')):
        img_path = os.path.join(img_dir, filename)
        # 自动裁剪
        cropped_img = auto_crop_envelope(img_path)
        if cropped_img is not None:
            # 识别裁剪后的图片
            result = ocr.ocr(cropped_img, cls=True)
            # 处理识别结果(如保存到文件)
            with open("ocr_results.txt", "a", encoding="utf-8") as f:
                f.write(f"图片:{filename}\n识别结果:{result}\n\n")

2. 调整PaddleOCR检测参数

降低文本检测的阈值,让模型更容易检测到占比小的文本区域,可调整的关键参数包括:

  • det_db_thresh:文本区域的置信度阈值,默认0.3,可降低至0.2
  • det_db_box_thresh:文本框的置信度阈值,默认0.5,可降低至0.1
  • det_db_unclip_ratio:文本框的扩展比例,默认1.6,可提高至2.0

调整后的初始化代码:

ocr = PaddleOCR(use_angle_cls=True, lang='en',
                det_db_thresh=0.2,
                det_db_box_thresh=0.1,
                det_db_unclip_ratio=2.0)

注:该方法适合空白占比不是特别极端的情况,若空白占比过大,优先使用自动裁剪方案。

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

火山引擎 最新活动