文档图像矫正核心是定位边界后几何变换:先用Canny+膨胀检测轮廓,approxPolyDP拟合四边形;再按极角或坐标关系排序四角;最后透视变换拉平,并做自适应二值化等后处理增强OCR效果。

扫描文档常因拍摄角度、纸张弯曲或设备限制出现倾斜、透视变形,自动识别并矫正这类图像,核心是定位文档边界再做几何变换。关键不在于追求高精度OCR,而在于先让图像“摆正”,提升后续文字识别的稳定性。
检测文档轮廓:找最接近矩形的外边界
用OpenCV对灰度图做边缘检测(Canny)+ 膨胀增强轮廓,再通过findContours提取所有闭合区域;过滤掉面积过小或长宽比极端的轮廓,对剩余轮廓用approxPolyDP拟合多边形——目标是找到4个顶点、近似平行四边形的轮廓,它大概率就是文档边缘。
- 若场景中存在多个相似矩形(如双栏表格、带边框的表格),可结合轮廓面积占比(大于图像总面积30%)、凸性(isContourConvex为True)进一步筛选
- 若原始图像对比度低,先用自适应直方图均衡化(cv2.createCLAHE)增强局部细节,再二值化(Otsu法效果通常优于固定阈值)
排序四角坐标:按左上→右上→右下→左下顺序排列
拟合出的四个点是无序的,需映射到标准矩形顶点。常用方法是计算每个点到图像中心的极角,或更稳健地:先取x+y最小者为左上,x+y最大者为右下,再根据x-y差值区分右上和左下。排序错误会导致矫正后内容翻转或镜像。
- 建议统一使用“最小外接矩形旋转角度 + 四角投影”方式:调用cv2.minAreaRect得中心、尺寸、角度,再用cv2.boxPoints生成带方向的四顶点,最后按坐标关系重排
- 若文档明显倾斜但边缘模糊(如传真件),可退而求其次:用霍夫直线检测主方向,估算倾斜角后做简单旋转校正(适合小角度,±10°以内)
透视变换矫正:把歪的四边形“拉平”成标准矩形
确定输入四点(原图中文档四角)和输出四点(目标矩形尺寸,如A4比例或按原宽高缩放),调用cv2.getPerspectiveTransform生成变换矩阵,再用cv2.warpPerspective执行映射。输出尺寸建议略大于原图宽高(如+5%),避免裁切。
立即学习“Python免费学习笔记(深入)”;
- 目标矩形宽高比尽量贴近原始文档比例(例如扫描A4纸,输出设为 2480×3508 像素 @300dpi),防止拉伸失真
- 插值方式选cv2.INTER_AREA(缩小)或cv2.INTER_CUBIC(放大),比默认的INTER_LINEAR更保细节
- 若矫正后边缘有黑边,可用cv2.copyMakeBorder加白边,或用掩膜+泊松融合柔化过渡(进阶需求)
后处理增强:提升矫正后图像的OCR友好度
矫正只是第一步,清晰度和对比度直接影响OCR效果。建议在变换后立即做轻量级增强:先高斯模糊去噪(cv2.GaussianBlur,核大小(3,3)),再用自适应阈值(cv2.adaptiveThreshold,blockSize=51, C=10)二值化——比全局阈值更能应对光照不均。
- 若文档含手写批注或浅色底纹,可叠加形态学开运算(cv2.morphologyEx with cv2.MORPH_OPEN)清理噪点
- 避免过度锐化或对比度拉伸,否则易放大扫描伪影,反而干扰Tesseract等OCR引擎判断
基本上就这些。流程不复杂但容易忽略细节:比如四点排序错一位,整张图就反了;目标尺寸没按比例设,字会压扁或拉长。跑通一次后,封装成函数,配合批量读图,就能实现真正的“扫完即正”。










