Tesseract OCR之页面布局分析
1. 核心目标
将文档图像划分为逻辑区域(如文本栏、表格、图片),并确定文本行的阅读顺序。关键在于检测制表位(Tab Stops)—— 文本列的对齐边界。
想象你在看一份报纸的扫描件,用剪刀沿着报纸的空白处剪开,把不同的栏目和段落分离出来,这就是布局分析的目的。
- 找到所有文字区域(比如标题、正文栏、表格内的文字)。
- 排除非文字干扰(如图片、装饰线条、页眉页脚)。
- 确定文字之间的关联(哪些文字属于同一段落/同一列)。
2. 投影分析:快速定位文字密集区
-
水平投影:统计每行像素中的非空白(如黑色)像素数,反映文本行密度。
H(y)=∑x=0widthbinary_image(x,y)H(y) = \sum_{x=0}^{width} \text{binary\_image}(x, y)H(y)=x=0∑widthbinary_image(x,y)- 水平投影举例 → 上下移动手指,数每行有多少字:
标题行: XXXXXXXXXX (10字) ← 手指停在这里(峰值) 空白行: 正文行: XXXX XXXX (8字)
输出:发现文字集中在Y=5060(标题)、Y=100200(正文)。
-
垂直投影:统计每列像素中的非空白像素数,反映文本列密度。
H(y)=∑x=0heightbinary_image(x,y)H(y) = \sum_{x=0}^{height} \text{binary\_image}(x, y)H(y)=x=0∑heightbinary_image(x,y) -
垂直投影举例 → 左右移动手指,数每列有多少字:
左栏: X | X | | X |... (第3列为空) 右栏: | X | X | |...
输出:发现X=0150是左栏,X=200350是右栏(中间X=150~200是空白)。
3. 制表位检测:对齐参考线
文本行基线定位(水平投影)
- 寻找峰值:水平投影的局部最大值对应文本行位置。
- 过滤噪声:
- 阈值:
峰高 > 平均投影值 * 系数
(如0.3)。 - 合并邻近峰(若行间距小于字体高度的1.5倍)。
- 阈值:
- 文字栏的边界:垂直投影的空白处就是栏间分隔。
左栏文字结束 ←|→ 右栏文字开始(此处垂直投影值为0)
列分隔检测(垂直投影)
- 寻找低密度谷:垂直投影的连续低值区域(如宽度≥10像素且值<平均值的10%)。
- 验证列边界:
- 检查左右两侧的投影梯度突变(如从0突然上升)。
- 排除过窄的间隔(如<20像素可能是字符间隙)
- 段落缩进:水平投影中突然的左侧偏移可能是新段落。
XXXX ← 缩进2字符 XXXX ← 顶格
4. XY-Cut:递归“剪空白”
算法流程(递归分割)
- 初始区域:整个图像作为第一个待分割区域。
- 切割方向选择:
- 若区域宽度 > 高度,优先尝试垂直切割(沿垂直投影的空白)。
- 否则优先水平切割(沿水平投影的空白)。
- 终止条件:
- 区域内无空白间隙(全文本)或区域面积小于阈值。
示例,实际切割过程类似这样:
原始页面:
+-----------------------+
| 标题 图片 |
| |
| 左栏段落1 右栏段落1|
| 左栏段落2 |
+-----------------------+第1刀:沿垂直空白切开
+-----------+-----------+
| 标题 |图片|左栏 |右栏 |
| | |段落1|段落1|
| | |段落2| |
+-----------+-----------+第2刀:水平切开标题区域
+-----------+
| 标题 |图片|
+-----------+
|左栏 |右栏 |
|段落1|段落1|
|段落2| |
+-----------+
5.标点符号的作用
-
边界辅助判断:
右对齐的标点(如句号、逗号)会强化垂直投影的右侧下降沿,帮助确认列边界。左栏文字结束 → 此处投影突降。 ← 标点密集处 右栏文字开始 → 此处投影突升
-
连字符处理:
跨行的连字符(如英语单词docu-
和下一行ment
)需要特殊合并逻辑。
扩展阅读
- 经典论文:《XY-Cut: A Fast Segmentation Algorithm for Constraint Object Recognition》
- 现代改进:《Document Layout Analysis via Attention to Split, Merge or Copy》 (CVPR 2023)