如何识别扫描图像中的文本存在模式并进行裁剪?

Dav*_*ave 3 photoshop imagemagick image-processing photoshop-cs4

扫描文档的智能裁剪

最近我接手了旧书/手稿的保存项目.它们数量巨大,近10,000页.我不得不用便携式扫描仪手动扫描它们,因为它们不能在自动书籍扫描仪中扫描.

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

为了使这些图像(文档)看起来干净和优雅,我必须裁剪它们,定位它们,稍微增加对比度,用橡皮擦清洁不必要的斑点,等等.我能够在Photoshop中自动化大多数这些过程,但裁剪是我遇到困难的地方.我无法自动裁剪,因为软件无法在img(doc)的某个区域中重新识别文本或内容的存在; 它只是应用赋予它的值进行裁剪.

我想要一个解决方案来自动化这个裁剪过程.我已经想到了这个想法,我不知道它是否足够实用,据我所知,市场上还没有软件能够做到这一点.

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

这是画廊的专辑链接.我可以发布更多样本图片,如果它有用 - 请告诉我.

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

以下是通过以上链接提供的更大图像样本中的一个示例:

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

Kur*_*fle 11

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

使用ImageMagick我将按以下方式构建一个算法:

  1. 对比 - 拉伸原始图像

    黑点的值为1%,白点的值为10%.

    命令:

    convert                               \
       http://i46.tinypic.com/21lppac.jpg \
      -contrast-stretch 1%x10%            \
       contrast-stretched.jpg   
    
    Run Code Online (Sandbox Code Playgroud)

    结果: 对比度结果

  2. 削掉一些边框像素,以摆脱那里的黑暗扫描伪影

    每条边上30像素的值似乎是正确的.

    命令:

    convert                   \
       contrast-stretched.jpg \
      -shave 30x30            \
       shaved.jpg   
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 去除图像斑点

    这里没有其他参数.重复3x过程以获得更好的结果.

    命令:

    convert       \
       shaved.jpg \
      -despeckle  \
      -despeckle  \
      -despeckle  \
       despeckled.jpg
    
    Run Code Online (Sandbox Code Playgroud)

    结果: 去斑的图像

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

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

    命令:

    convert           \
       despeckled.jpg \
      -threshold 50%  \
       b+w.jpg
    
    Run Code Online (Sandbox Code Playgroud)

    结果: 黑+白图像

  5. 重新添加剃掉的像素

    使用已identify -format '%Wx%H' 21lppac.jpg建立的原始图像具有1536x835像素尺寸.

    命令:

    convert            \
       b+w.jpg         \
      -gravity center  \
      -extent 1536x835 \
       big-b+w.jpg
    
    Run Code Online (Sandbox Code Playgroud)

    结果: 原始尺寸 (注意,这一步只是可选的.它的目的是回到原始图像尺寸,如果您从这里开始并将结果与​​原始图像或其他任何内容叠加在一起,您可能需要这些图像尺寸.)

  6. 消除图像偏斜

    阈值为40%(默认值)似乎也适用于此.

    命令:

    convert        \
       big-b+w.jpg \
      -deskew 40%  \
       deskewed.jpg
    
    Run Code Online (Sandbox Code Playgroud)

    结果: 偏斜的图像

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

    这可以通过简单地使用-trim操作员来实现.

    命令:

    convert         \
       deskewed.jpg \
      -trim         \
       trimmmed.jpg
    
    Run Code Online (Sandbox Code Playgroud)

    结果: 修剪过的图像

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

  • 在图像的底部边缘仍然存在一些随机的伪像,并且

  • 由于其他最小的伪影,最终的修剪并没有从边缘移除所有的空白区域;

  • 另外,我还没有尝试对图像应用失真校正以修复(某些)失真.(通过查看"理解透视投影失真ImageMagick"的答案,您可以了解它可以实现的目标.)

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

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


更新

好的,所以这里有一个扭曲来粗略地纠正变形.

*命令:

convert                                                                         \
   trimmmed.jpg                                                                 \
  -distort perspective '0,0 0,0  1300,0 1300,0  0,720 0,720  1300,720 1300,770' \
   distort.jpg
Run Code Online (Sandbox Code Playgroud)

结果:(再次使用原来的底部,使直接视觉比较更容易) 没有扭曲的图像 原始图像

图像中仍然存在桶状失真的一部分,可以通过应用-barrelinverse算子来移除- 我们只需要找到拟合参数.