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

标签 image-processing imagemagick photoshop photoshop-cs4

扫描文档的智能裁剪

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

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

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

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

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

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

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



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

one example of a bigger set...

最佳答案

使用来自 tinypic 的样本,
original scan

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

  • 对比拉伸(stretch)原始图像

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

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

    结果:
    contrast-stetched result
  • 剃掉一些边框像素以消除那里的暗扫描伪影

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

    命令:
    convert                   \
       contrast-stretched.jpg \
      -shave 30x30            \
       shaved.jpg   
    

    结果:
    30 pixels shaved off each edge
  • 图像去斑

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

    命令:
    convert       \
       shaved.jpg \
      -despeckle  \
      -despeckle  \
      -despeckle  \
       despeckled.jpg
    

    结果:
    despeckled image
  • 应用阈值使所有像素变为黑色或白色

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

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

    结果:
    black+white image
  • 重新添加剃掉的像素

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

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

    结果:
    original size
    (注意,这一步只是可选的。它的目的是恢复到原始图像尺寸,如果您从这里开始并用原始图像覆盖结果,或者其他什么...)
  • 去歪斜图像

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

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

    结果:
    deskewed image
  • 从每个边缘移除所有纯白色像素的行和列

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

    命令:
    convert         \
       deskewed.jpg \
      -trim         \
       trimmmed.jpg
    

    结果:
    trimmed image

  • 如您所见,结果还不完美:
  • 图像底部边缘仍有一些随机伪影,
  • 由于其他最小的伪影,最终的修剪并没有从边缘移除所有的空白;
  • 另外,我(还)没有尝试对图像应用失真校正来修复(部分)失真。 (您可以通过查看 "Understanding Perspective Projection Distortion 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
    

    结果: (下面再放原图,方便直观对比)
    un-distorted image
    original image

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

    关于image-processing - 如何识别扫描图像中的文本存在模式并进行裁剪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12766579/

    相关文章:

    java - 如何检测图像中的形状?

    image-processing - 将真彩色 RGB 图像转换为索引颜色

    imagemagick - 如何以编程方式创建 APNG 文件?

    png - Ghostscript 将 Postscript 转换为 PNG 过饱和

    node.js - ImageMagick 的 heroku 中应包含哪些 PATH 环境变量?

    ios - 针对 iPad Pro 显示屏优化的网络图像分辨率

    c++ - 如何在图像处理中有效地使用线程?

    python - minAreaRect OpenCV [Python] 返回的裁剪矩形

    css - 在浏览器中设计网站(喘息!)

    css - 将图像分成RGB channel 并通过堆叠重建原始图像?