对齐OCR的文本

时间:2015-11-13 17:03:35

标签: python image-processing ocr

我正在根据历史记录创建一个数据库,我从书中拍摄的页面(+ 100K页)。在OCR每个页面之前,我写了一些python代码来进行一些图像处理。由于这些书中的数据没有格式良好的表格,我需要将每个页面分成行和列,然后分别对每个页面进行OCR。

其中一个关键步骤是对齐图像中的文字。

例如,这是一个需要对齐的典型页面: page to align

我找到的解决方案是水平涂抹文本(我正在使用skimage.ndimage.morphology.binary_dilation)并找到最大化沿水平维度的白色像素总和的旋转。

这样可以正常工作,但每页大约需要8秒钟,因为我使用的页面数量太多了。

您是否知道更好,更快的方式来完成对齐文本?

更新

我使用scikit-image作为图像处理功能,并使用scipy来最大化沿水平轴的白色像素数。

这是我用来处理这个问题的Jupyter笔记本的html视图的链接。代码使用了我为此项目编写的模块中的一些函数,因此无法单独运行。

链接到笔记本(dropbox):https://db.tt/Mls9Tk8s

更新2:

以下是原始原始图片(dropbox)的链接:https://db.tt/1t9kAt0z

3 个答案:

答案 0 :(得分:15)

前言:我没有用python做过多的图像处理。我可以给你一个图像处理建议,但你必须自己用Python实现它。你需要的只是一个FFT和一个极化变换(我认为OpenCV有in-built function for that),所以这应该是直截了当的。

你只发布了一个样本图像,所以我不知道这是否适用于其他图像,但对于这个图像,傅立叶变换可能非常有用:只需将图像填充到2的强大功率(例如2048x2048)你得到一个像这样的傅里叶谱:

enter image description here

我已经发布了傅里叶变换here的直观解释,但简而言之:您的图像可以表示为一系列正弦/余弦波,而这些“波浪”中的大多数是平行或垂直的文件方向。这就是为什么你会在大约0°,90°,180°和270°处看到强烈的频率响应。要测量精确的角度,您可以采用傅里叶谱的极坐标变换:

enter image description here

并简单地采用列式均值:

enter image description here

该图中的峰值位置为90.835°,如果我将图像旋转-90.835模90,则方向看起来不错:

enter image description here

就像我说的,我没有更多的测试图像,但它适用于图像的旋转版本。至少它应该缩小搜索空间以获得更昂贵的搜索方法。

注1:FFT速度很快,但显然需要更多时间来拍摄更大的图像。遗憾的是,获得更好的角度分辨率的最佳方法是使用更大的输入图像(即在源图像周围有更多的白色填充。)

注2:FFT实际上返回的图像中“DC”(上图中的光谱图像中心)位于原点0/0。但是如果将它移动到中心,旋转属性会更清晰,并且它使极坐标变换更容易,所以我只显示了移位版本。

答案 1 :(得分:3)

这不是一个完整的解决方案,但不仅仅是评论值得思考。

图像的左右和上下都有边距。如果删除它,甚至切换到过程中的文本,您仍将有足够的信息来对齐图像。因此,如果您从顶部,底部,左侧和右侧切下15%,那么您的图像区域已经减少了50% - 这将加快速度。

现在取出你剩下的中心区域,并将其分成10个条带,所有相同的高度,但页面的整个宽度。现在计算这些条带的平均亮度,并选择1-4最暗,因为它们包含最多(黑色)字母。现在可以并行处理每一个,或者只是最黑暗的。您现在正在处理页面中最有趣的5-20%。

这是在ImageMagick中执行此操作的命令 - 它只是我选择的武器,你可以在Python中做到这一点。

convert scan.jpg -crop 300x433+64+92 -crop x10@ -format "%[fx:mean]\n" info:

0.899779
0.894842
0.967889
0.919405
0.912941
0.89933
0.883133    <--- choose 4th last because it is darkest
0.889992
0.88894
0.888865

如果我用这10个条纹制作单独的图像,我会得到这个

convert scan.jpg -crop 300x433+64+92 -crop x10@ m-.jpg

enter image description here

并且有效地,我在第四个最后一个图像而不是整个图像上进行对齐。

也许不科学,但非常有效且很容易尝试。

另一个想法是,一旦你的程序/脚本被整理出来整理单个图像,不要忘记你通常可以通过使用GNU Parallel来骚扰所有CPU的可爱,昂贵的内核来获得大量的加速同时。在这里,我指定了8个并行运行的进程...

#!/bin/bash
for ((i=0;i<100000;i++)); do 
   ProcessPage $i
done | parallel --eta -j 8

答案 2 :(得分:-3)

“对齐图像中的文字”我想这意味着对图像进行校正,使文本行具有相同的基线。

我非常喜欢阅读这个相当过分的工作的科学答案。答案很棒,但是真的有必要花这么多时间(非常宝贵的资源)来实现这个吗?这个功能有很多工具可用,而不需要编写一行代码(除非OP是一名CS学生,并希望练习科学,但显然OP正在这样做,以便处理所有图像)。这些方法让我回到了大学时代,但今天我会使用不同的工具来快速有效地处理这一批,我每天都会这样做。我在大批量文档转换和数据提取服务局和OCR咨询公司工作。

以下是ABBYY FineReader商用台式机OCR软件包中基本打开和校正步骤的结果。纠错对于进一步的OCR处理来说已经足够了。 enter image description here

我不需要重新创建和编写我自己的浏览器来发布这个答案。