4

扫描文档的智能裁剪

最近我接手了一个旧书/手稿的保存项目。它们数量庞大,将近 10,000 页。我不得不用便携式扫描仪手动扫描它们,因为它们不适合在自动书籍扫描仪中进行扫描。

当我开始在 Photoshop 中编辑它们时,真正的问题就出现了。请注意,它们基本上都是文档(JPG 格式),并且这些文档中绝对没有图像。它们使用不同的语言(奥里亚语),我相信在不久的将来不会有任何 OCR 软件可用。(如果有请告诉我。)

为了使这些图像(文档)看起来干净优雅,我必须裁剪它们,定位它们,增加一点对比度,用橡皮擦清洁不必要的斑点等等。我能够在 Photoshop 中自动化大部分这些过程,但裁剪是我卡住的地方。我无法自动裁剪,因为该软件无法识别该 img (doc) 的某个区域中是否存在文本或内容;它只是将赋予它的值应用于裁剪。

我想要一个解决方案来自动化这个裁剪过程。我已经想出了一个想法,我不知道它是否足够实用,据我所知,市场上没有软件可以做这种事情。

可能的解决方案:如果工具可以识别图像中文本的存在(这不是很关键,因为它们都是普通文档图像,其中没有图像,没有图案只是普通矩形)并裁剪它,这可能是可能的从每一侧的这些文本的边界开始,因此它可以输出没有任何边距的文档图像。在这之后,其余的任务可以使用 Photoshop 自动完成,例如为边距添加空白,调整对比度和颜色使其更具可读性等。

这是画廊的专辑链接。如果有用的话,我可以发布更多示例图片 - 请告诉我。

http://imageshack.us/g/1/9800204/

这是通过上述链接获得的更大图像样本中的一个示例:

一个更大的集合的一个例子......

4

3 回答 3

11

使用来自 tinypic 的样本, 原始扫描

使用 ImageMagick,我将按照以下几行构建一个算法:

  1. 对比拉伸原始图像

    黑点 1% 和白点 10% 的值似乎是正确的。

    命令:

    convert                               \
       http://i46.tinypic.com/21lppac.jpg \
      -contrast-stretch 1%x10%            \
       contrast-stretched.jpg   
    

    结果: 对比拉伸结果

  2. 剃掉一些边界像素以消除那里的黑暗扫描伪影

    每个边缘上 30 像素的值似乎是正确的。

    命令:

    convert                   \
       contrast-stretched.jpg \
      -shave 30x30            \
       shaved.jpg   
    

    结果: 每条边缘剃掉 30 像素

  3. 去斑点图像

    这里没有更多参数。重复过程 3 次以获得更好的结果。

    命令:

    convert       \
       shaved.jpg \
      -despeckle  \
      -despeckle  \
      -despeckle  \
       despeckled.jpg
    

    结果: 去斑图像

  4. 应用阈值以使所有像素变为黑色或白色

    大约 50% 的值似乎是正确的。

    命令:

    convert           \
       despeckled.jpg \
      -threshold 50%  \
       b+w.jpg
    

    结果: 黑白图像

  5. 重新添加剃掉的像素

    使用identify -format '%Wx%H' 21lppac.jpg确定原始图像具有1536x835像素尺寸。

    命令:

    convert            \
       b+w.jpg         \
      -gravity center  \
      -extent 1536x835 \
       big-b+w.jpg
    

    结果:( 原始尺寸 请注意,此步骤只是可选的。其目的是返回到原始图像尺寸,如果您从这里开始并将结果与​​原始图像或其他任何东西重叠,您可能需要这样做......)

  6. 去歪斜图像

    40% 的阈值(默认值)似乎也适用于此。

    命令:

    convert        \
       big-b+w.jpg \
      -deskew 40%  \
       deskewed.jpg
    

    结果: 歪斜图像

  7. 从每个边缘删除所有纯白色像素的行和列

    这可以通过简单地使用-trim运算符来实现。

    命令:

    convert         \
       deskewed.jpg \
      -trim         \
       trimmmed.jpg
    

    结果: 修剪后的图像

如您所见,结果还不完美:

当然,您可以通过使用每个步骤中使用的一些参数轻松获得更好的结果。

当然,您可以通过将每个命令放入 shell 或批处理脚本来轻松地自动化此过程。


更新

好的,所以这里有一个失真来粗略地纠正变形。

*命令:

convert                                                                         \
   trimmmed.jpg                                                                 \
  -distort perspective '0,0 0,0  1300,0 1300,0  0,720 0,720  1300,720 1300,770' \
   distort.jpg

结果:(再一次在下面加上原件,使直接的视觉比较更容易) 未失真的图像 原始图像

图像中仍有部分桶状失真,可能可以通过应用-barrelinverse算子来消除——我们只需要找到拟合参数即可。

于 2012-10-09T10:21:13.113 回答
2

从背景中分割文本的一种技术是笔画宽度变换。你会在 Stack Overflow 上找到几篇关于它的帖子,包括这个:

笔画宽度变换 (SWT) 实现(Java、C#...)

如果 Wikipedia 页面中显示的文本代表书面奥里亚语,那么我相信 SWT(或您的自定义版本)将表现良好。在查看图像后,您可能仍需要进行一些手动调整,但基于 SWT 的方法应该为您完成大量工作。

尽管 SWT 可能无法识别每一个笔画,但它应该可以很好地估计笔画(和字符)所占空间的尺寸。最简单的方法

一种可能对您有用的新算法是“内容感知大小调整”算法,例如“缝合雕刻”,它会自动删除低信息内容像素的路径(例如背景像素)。这是一个关于接缝雕刻的视频:

http://www.youtube.com/watch?v=qadw0BRKeMk

GIMP 有一个接缝雕刻插件(“液体调整大小”):http: //liquidrescale.wikidot.com/

这篇博文报告了一个 Photoshop 插件: http ://wordpress.brainfight.com/195/photoshop-cs5-content-aware-aka-seam-carving-aka-liquid-resize-fun-marketing/

对于 OCR 技术的概述,我推荐Cheriet、Kharma、Liu 和 Suen所著的《字符识别系统》一书。那本书中的参考资料可能会让你忙上一段时间。

http://www.amazon.com/Character-Recognition-Systems-Students-Practitioners/dp/0471415707

最后,考虑加入 LinkedIn 上的光学字符识别小组以发布更具体的问题。业内有学者、研究人员和工程师可以非常详细地回答问题,您还可以通过电子邮件与正在为类似于奥里亚语的语言开发 OCR 的印度研究人员联系,尽管他们可能尚未发表软件呢。

于 2012-10-08T03:31:35.503 回答
2

我们在我们的开源DjVu->PDF转换器中解决了许多“智能裁剪”问题。该转换器还允许您加载一组扫描图像而不是 DjVu(只需按 SHIFT 和 Open 命令)并输出一组结果图像而不是 PDF。

它是一个免费的跨平台 GUI 工具,用 Java 编写。

图像转换器、智能裁剪和纠偏

于 2012-11-05T16:29:15.827 回答