如何使用ImageMagick在位图中找到最大的近白色矩形?

时间:2014-04-25 17:49:47

标签: imagemagick imagemagick-convert

我想自动清理扫描页面中的可见边框/阴影。

我这样做的想法很简单:在图像中检测所有像素为白色或接近白色的最大矩形,然后将图像裁剪为该矩形或用白色填充外部。< / p>

我可以编写自己的程序来查找这样的矩形,但我更喜欢使用ImageMagick(也可以进行裁剪或填充),netpbm或其他可用的实用程序Linux和Cygwin。

他们可以这样做吗?怎么样?

PS:我刚发现very similar question。 如果答案对我有用,那将是重复的。

2 个答案:

答案 0 :(得分:1)

convert具有可在执行autocrop之前应用的过滤器。我在这里有一个例子:

http://www.alexiswilke.me/blog/learning-more-about-convert-imagemagick

所以使用类似的东西:

convert <in-image> -level 20%,80%,1.0 <out-image>

这将使黑暗区域变黑,白色区域变为白色。

接下来,您想要在顶部逐行比较图像,以查找从顶部删除的行数。这是通过比较工具完成的(你也可以在做比较时使用“-level过滤器”,例如-fuzz。)我没有仔细尝试,所以我不能给你准确的命令行那一个......

http://www.imagemagick.org/script/compare.php

比较过程完成后,您应该在顶部有行数,在底部,左侧和右侧有行数(如果他们不测试列,请考虑旋转图像90 %。)

最后,您拥有几何体并可以应用裁剪:

convert <in-image> -crop <width>x<height>+<xpos>+<ypos> <final-image>

更新

考虑到这一点,转换的-level选项可以在pnmcrop工具中很好地工作。这意味着您首先进行转换,裁剪转换后的图像,搜索原始图像中最终图像的位置,使用该几何图形裁剪原始图像。一个sinopsis就是这样的:

convert <original> -level 20%,80% <temp>
pnmcrop <temp>
compare <original> <temp>
convert <original> -crop ... <final>

将它放在一个脚本中,如上所述,您的自动裁剪图像周围没有纯色。

嗯...实际上,如果我们与&lt; temp&gt;进行比较,那么compare命令肯定会好很多。图像。

convert <original> -level 20%,80% <tempA>
pnmcrop <tempA> <tempB>
compare <tempA> <tempB>
convert <original> -crop ... <final>

对确切的pnmcropcompare命令行选项不太确定,但请按照以下方式考虑:&lt; tempA&gt;由convert(第1行)写一次,然后用于生成&lt; tempB&gt;然后我们搜索&lt; tempB&gt;在&lt; tempA&gt;内获得我们最终为裁剪命令重复使用的位置和大小(几何)(最后convert。)

答案 1 :(得分:1)

我这样做(我的问题是您链接的similar one)与ImageMagick和LSD的组合。

您的里程数可能因调整的不同设置而有所不同(事实上,我的算法会在不同的设置和不同的分辨率下运行整个过程多次,直到有人认为&#34;足够好&#34;),但一般情况下我的策略是:

  1. 使用ImageMagick将图像转换为黑白(仅黑色像素和白色像素,而不是灰度)PGM图像。
  2. 使用带有一些非常极端参数的LSD,从页面边缘的PGM图像生成EPS图像。
  3. 存储EPS的旋转角度,由ImageMagick检测到deskew
  4. 使用ImageMagick旋转EPS使其平直。 (我的扫描图像可能会弯曲。)
  5. 使用ImageMagick&#39; trim存储每个EPS的裁剪尺寸。
  6. 进行原始扫描,并将旋转角度旋转并使用ImageMagick将其裁剪为裁剪尺寸。
  7. 如果需要,请使用ImageMagick morphology删除劣质扫描中的斑点。
  8. 我使用的所有参数都相当于我的用例,但这是一般的方法。祝你好运!