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

背景与纸张颜色相近时的文档图像矫正及文本分割方案咨询

针对approxPolyDP因段落缩进无法识别文档边界的解决方案

一、优化文本区域连通性,消除缩进干扰

  • 合并同段落文本行:先对文本区域做水平投影,统计每行文本的左右边界。如果相邻两行的边界重叠或横向间距小于设定阈值(比如10px),就将它们合并为一个大矩形区域。这样缩进的文本行不会被孤立,能形成连贯的文本块,让approxPolyDP更容易捕捉整体轮廓。
  • 形态学膨胀连通区域:对填充后的文本区域二值图,用cv2.dilate()执行膨胀操作。选择横向尺寸更大的矩形结构元素(比如(20,5)的kernel),把零散的缩进文本区域和主体文本区域连通,消除缩进造成的轮廓断裂。示例代码:
    import cv2
    import numpy as np
    
    # filled_text为填充后的文本区域二值图
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 5))
    dilated = cv2.dilate(filled_text, kernel, iterations=1)
    

二、换用不依赖文本轮廓的边界检测方法

  • 自适应阈值+霍夫直线检测:针对背景与纸张颜色接近的情况,先用cv2.adaptiveThreshold()做二值分割保留边缘信息;再用Canny提取边缘,通过霍夫变换(cv2.HoughLinesP())检测文档的四条边界直线,计算直线交点得到四个角点。这种方法直接定位物理边界,不受缩进影响。示例代码片段:
    # 灰度转换与自适应阈值分割
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
    # Canny边缘检测
    edges = cv2.Canny(thresh, 50, 150)
    # 霍夫直线检测(需自行实现直线筛选逻辑,按斜率分组取最长的两条水平、两条垂直直线)
    lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=200, maxLineGap=50)
    
  • 轮廓层级筛选大轮廓:提取所有轮廓后,通过面积和宽高比筛选。文档轮廓通常是图像中面积最大的几个,且宽高比符合纸张比例(比如A4的0.7左右)。过滤掉小的文本轮廓,只保留疑似文档边界的大轮廓,再用approxPolyDP拟合。

三、后处理修正角点

  • 强制矩形约束:拿到approxPolyDP输出的角点后,计算每条边的斜率,将接近水平/垂直的边强制对齐,调整角点坐标,让四个点构成标准矩形。比如直接取四个点的最小外接矩形,用外接矩形的角点替换原角点。
  • 透视变换验证微调:用初步角点执行透视变换(cv2.getPerspectiveTransform() + cv2.warpPerspective()),变换后检查文本行是否水平。如果存在偏移,微调对应角点的x或y坐标,直到变换后的文本对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:50:21