【问题标题】:Reliably Compressing the image horizontally to 1 column of pixels with 100% thresholding可靠地将图像水平压缩为 1 列像素,阈值为 100%
【发布时间】:2020-07-23 16:16:28
【问题描述】:

我正在寻找一种方法来可靠地将图像水平压缩为一列像素,其方式如下:

  • 任何不是由全白像素组成的像素行都会在结果列中变为黑色像素
  • 由全白像素组成的任何像素行都将成为结果列中的白色像素

以下是原始输入图像:

我能做的最好的就是使用这段代码:

magick convert input.png -alpha off -threshold 99% -scale 1x75! -threshold 99% output.png

但是输出不完美,因为像素列有间隙:

...我想要的输出是:

【问题讨论】:

  • 在命令末尾使用 -morphology open rectangle:1x5 来填补空白。将 5 更改为最大的差距量。

标签: imagemagick


【解决方案1】:

避免使用magick convert ...,因为它会给您带来旧的 v6 行为,现在我们有了 v7,这通常不是一个好主意。我建议你使用magick 而不是magick convert。

所以,总而言之,只需使用:

  • magick INPUT operations OUTPUT - 代替 v6 convert INPUT operations OUTPUT
  • magick identify ...
  • magick compare ...
  • magick compose ...

关于你的问题,在初始阈值之后:

magick logo.png -alpha off -threshold 99% result.png

你只剩下这个了:

问题是,在一行 1278 像素中只有 2 个黑色像素并不算多,它们会消失在噪音中。我的建议是在 200x1 像素的区域上运行统计最小值。这意味着任何黑色像素左右 200 像素内的任何像素都会变成这样的黑色:

magick logo.png -alpha off -threshold 99% -statistic minimum 200x1 result.png

现在有很多黑色可以在最终图像中充分显着地显示出来:

magick logo.png -alpha off -threshold 99% -statistic minimum 200x1 -scale 1x\! -threshold 99% result.png


而不是硬编码的 200,您可以将其设置为图像宽度的 1/8,以适应图像的宽度并提供合理的性能(使区域更宽会减慢处理速度):

magick logo.png -alpha off -threshold 99% -statistic minimum "%[fx:int(w/8)]x1"  result.png

【讨论】:

  • 我知道“......在 1278 像素的一行中只有 2 个黑色像素并不多,它们会消失在噪音中”但我不知道如何制作 -scale使用minimum 算法而不是average,...或任何-scale 使用的算法。我在 C 中创建了自己的实用程序,它使用两个嵌套的 for 循环遍历整个图像,一个用于行,一个用于列,它 exits 内部“列”for 循环一旦遇到非-白色像素。我想在 IM 中做同样的事情。我的解决方案很快,但它过于定制化,并且在我发现 IM 后重新发明了众所周知的轮子。
  • -scale 实际上完全独立于-statistic,您可以在我的第二个示例中看到这一点。 -statistic 将任何黑色像素加宽到 -scale 之前的 200 宽度。
  • 是的,是的,现在我知道试图让-scale 使用minimum 算法来完成它的工作是死路一条,但在你回答之前我什至不知道-statistic minimum是一种选择。
  • -morphology 的性能与-statistic minimum 相比如何?请参阅 fmw42 的建议。
  • 我还没有计时,但我想-morphology erode rectangle 200x1 会在类似的时间运行。请注意,我的建议与 Fred 的评论 (@fmw42) 有所不同。我建议您水平扩展任何黑色像素以变得更重要,而 Fred 建议您填充 1 像素宽列中的任何小间隙。 Fred 会更快,因为它只是一个 1x5 结构元素,但它依赖于任何黑色像素数量较少的行被夹在黑色像素数量较多的行之间。我的希望可以在任何地方为一个单独的黑色像素工作。
猜你喜欢
  • 2013-11-26
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多