OCR预处理中倾斜校正与投影切割方法

先把二值图变成可切行的投影信号

OCR 预处理中的倾斜校正,目标是让文字基线接近水平;投影切割,目标是找出每一行文字的上下边界。两者的实际顺序通常是:灰度化、二值化、估计角度、旋转校正、水平投影切行。

二值化是把每个像素归为前景或背景。可以令文字为 1、背景为 0,也可以反色;关键是后续统计始终使用同一种定义。固定阈值适合光照均匀的扫描件,自适应阈值更适合拍照文档,但具体效果取决于背景纹理和文字对比度。

设二值图像高度为 H、宽度为 W,水平投影数组可写成:

P(y) = Σ B(y, x),其中 x 从 0 到 W-1,y 从 0 到 H-1。若文字是前景,P(y) 就表示第 y 行包含多少个前景像素,取值范围为 0 到 W。连续的高值区通常对应文本行,接近 0 的区间通常是行间空白。

  1. 转灰度;扫描噪声明显时,先使用中值滤波或高斯滤波。
  2. 用固定阈值或自适应阈值生成二值图,并确认文字是否为前景。
  3. 计算每个 y 的 P(y),记录连续高于阈值的区间。
  4. 将间隔很短的高值区合并,避免字符断笔或噪声把同一行拆开。
  5. 过滤高度过小的候选区域,再把结果送入 OCR。

不要直接把“投影值超过图像宽度的 1%~5%”当成通用规则。该比例会随字体大小、分辨率和二值化结果变化;更稳妥的做法是先观察投影数组,再以局部统计量或分位数设定阈值。若文本行高度约为 30 像素,可先把 1~3 像素的孤立高值区视为噪声,但这个范围必须结合实际分辨率调整。

用形态学参数控制断行与粘行

投影切割最常见的错误有两类:一行文字被切成几段,或相邻两行被合并。形态学闭运算是先膨胀再腐蚀,用于连接相近的前景区域;开运算是先腐蚀再膨胀,用于去除小噪点。

  • 字符笔画断裂:从 3×3 结构元素开始尝试闭运算。
  • 孤立黑点较多:使用 3×3 开运算,但要检查细笔画是否消失。
  • 一行内部间隔较大:可尝试横向结构元素,例如 5×1。
  • 相邻文本行被连接:减小结构元素,或撤销横向膨胀。

结构元素的尺寸不能脱离字符高度决定。若字符高度约为 24 像素,5×5 可能已经足以改变行间空白;若字符高度只有 10 像素,同样的操作风险更高。每次处理后都应重新计算投影,确认峰值数量没有从多行变成一整块。

表格边框会在投影中产生贯穿整页的高值,插图和复杂背景也会制造假文本行。遇到这类输入,应先用水平、垂直形态学操作检测并去除边框;如果行方向不一致,改用连通域分析、霍夫直线检测或版面分析。投影法的前提是文本行大致水平且行间存在可识别空白。

用 OpenCV 角度约定校正文本方向

最小外接矩形是包住一组前景点且面积最小的旋转矩形。它能估计前景区域的主方向,但不保证等于文本基线角度;多行文字、边框和插图都会改变结果。

在 OpenCV 中,可用 cv2.findNonZero 获取前景点,再交给 cv2.minAreaRect。返回结果包含中心点、尺寸和角度。由于矩形的长边、短边可能交换,角度可能出现约 90° 的跳变,因此不能不加处理地直接旋转。

一个可执行的归一化方法是:比较返回的宽、高,令较长边代表文本的横向方向;再把角度折算到 -45° 到 45° 的范围。这里的符号取决于图像坐标系和 OpenCV 版本的角度约定,实际项目应在一张已知倾斜 10° 的测试图上验证旋转方向。若校正后文字更歪,说明旋转符号取反即可。

旋转矩阵由 cv2.getRotationMatrix2D(center, angle, 1.0)生成,1.0表示不缩放,再用 cv2.warpAffine执行变换。灰度图可使用双线性插值;严格二值图可使用邻近插值,以减少新灰度边缘,但锯齿可能更明显。

不要直接用原图尺寸接收旋转结果。旋转后四角可能被裁切,扩展画布并重新计算有效边界;黑边若被当作前景,会在水平投影中形成假峰。校正后检查文字外接框是否仍完整,再进行切行。

按输入类型选择整页、逐行或透视校正

  1. 读取图像,记录原始宽度、高度和通道数。
  2. 转灰度并轻度去噪,避免滤波抹掉细笔画。
  3. 二值化,过滤面积过小的连通区域。
  4. 对纯文本区域或单行前景点调用 cv2.minAreaRect。
  5. 归一化角度,使用 cv2.warpAffine旋转,并扩展输出画布。
  6. 重新计算水平投影,合并短空白间隔,输出文本行。
  7. 将文本行或校正后的整页交给 Tesseract OCR 5.x 等引擎。
  • 扫描件整体旋转:先整页校正,再统一投影切行。
  • 不同区域角度不同:按文本块或逐行估计,避免整页角度掩盖局部倾斜。
  • 页面呈梯形:使用四点透视变换;单纯旋转不能修复近大远小。

可用三个检查点判断参数是否合适:校正后投影峰值是否更集中,文本基线是否接近水平,OCR 置信度是否提高。若前景点数量过少、角度超过预设范围,或旋转后边缘被裁切,应跳过自动校正并改用霍夫直线检测、透视变换或人工复核。最小外接矩形只是角度候选,不能替代校正后的图像质量验证。

更多推荐

先用边缘图锁定二维码的两条主方向 霍夫变换适合解决二维码检测中的一个局部问题:从复杂背景里找出成组的直线和线段,给定位图形与外接区域提供几何候选。它不负责判断内容是否为二维码,最终仍需交给解码器验证。 QR Code 的结构由 ISO/IE

了解更多 >

从灰度图提取物体边界 把照片变成线稿,核心不是简单“描边”,而是寻找像素亮度变化明显的位置,再把这些位置保留下来。典型流程包括读取图片、转为灰度图、用高斯滤波降噪、进行边缘检测、阈值分割,最后按需要反色。 边缘可以理解为物体边界或纹理交

了解更多 >

先确认是椒盐噪声,再选择中值滤波 图片里如果是零散的纯黑、纯白孤点,中值滤波通常比均值滤波更适合。实操时从 3×3 窗口开始,和 5×5 结果在同一处放大对比;如果噪点成片、呈连续亮度波动,或软件只提供“模糊”滑块,就不能默认它使用了中值

了解更多 >

DPI 与 PPI:先分清密度,再计算打印尺寸 PPI(pixels per inch)表示图像每英寸包含多少个像素,可以用来推算文件的理论打印尺寸。DPI(dots per inch)表示打印设备每英寸能够控制多少个物理墨点;打印机用不

了解更多 >

先分清三种插值各自改了什么 图片缩放时,目标图像的像素网格通常无法与原图一一对齐,程序必须估算目标像素应该是什么颜色。这个过程叫插值:可以把它理解成“查看目标位置附近的原图像素,再按距离分配它们的影响力”。 最近邻插值通常只读取 1 个邻

了解更多 >