ImageMagick:寻找快速模糊图像的方法

12
我正在寻找一种比使用GaussianBlur更快的图像模糊方法。 我寻找的解决方案可以是命令行解决方案,但我更喜欢使用perl代码。 实际上,我们使用Perl Image Magick API来模糊图像。
# $image is our Perl object holding a imagemagick perl image
# level is a natural number between 1 and 10
$image->GaussianBlur('x' . $level);

这个方法本来可以正常运行,但是随着模糊程度的加深,它所消耗的时间似乎呈指数级增长。

问题:我该如何提高图像模糊操作的速度?是否有其他更快速的模糊图像的方法?


模糊的类型重要吗? - simbabque
3个回答

17

我发现用建议的方法来调整图像大小以模拟模糊效果,对于sigma等于25或更大的值,输出的图像看起来非常像素化。因此,我最终想到了缩小-模糊-放大的方法,这可以得到非常好的结果(几乎与使用大sigma值的简单模糊效果难以区分):

# plain slow blur
convert -blur 0x25 sample.jpg blurred_slow.jpg
# much faster
convert -scale 10% -blur 0x2.5 -resize 1000% sample.jpg blurred_fast.jpg

在我的i5 2.7Ghz上,它显示高达10倍的加速。


2
我有一台4K屏幕电脑,但即使使用i7处理器(笔记本电脑,目前不记得速度),仍需要1秒的时间。但是如果将比例缩小到5%,并将比例增加到20,000%,则只需要0.2秒的时间。 - NullVoxPopuli

7

文档介绍了模糊GaussianBlur之间的区别

关于哪个操作符“-blur”或“-gaussian-blur”更适合图像模糊存在一些困惑。首先,“-blur”速度更快,但使用两阶段技术进行操作。先在一个轴上,然后在另一个轴上。另一方面,“-gaussian-blur”操作符更加数学正确,因为它可以同时在所有方向上进行模糊处理。两者之间的速度差异可能非常大,取决于所涉及的模糊量,可能会高达10倍或更多。

[...]

总之,这两个操作符有些不同,但只是微小的差别。由于“-blur”速度更快,因此请使用它。在几乎所有涉及模糊的示例中,我都使用它。Large

简单来说:

$image->Blur( 'x' . $level );

但是Perl ImageMagick文档BlurGaussianBlur两者上有相同的文本(强调是我的)。我现在不能尝试,您需要自己进行基准测试。

模糊:使用给定半径和标准偏差(sigma)的高斯算子减少图像噪声并降低细节级别。

高斯模糊:使用给定半径和标准偏差(sigma)的高斯算子减少图像噪声并降低细节级别。

文档中还列出了一种替代方法,即将图像大小调整为非常小,然后再放大。

使用大的sigma值进行图像模糊处理非常缓慢。但是可以使用一种技术来加速此过程。然而,这只是一种粗略的方法,需要一些数学严谨性来改进结果。实质上,大型模糊之所以缓慢,是因为您需要一个大窗口或“核”来合并图像中每个像素的很多像素。然而,调整大小(使图像变小)也会生成较少的像素,从而完成相同的操作。该技术基本上是缩小图像,然后再次放大它以生成强烈模糊的结果。高斯滤波器对此特别有用,因为您可以直接指定高斯Sigma定义。
示例命令行代码如下:
convert  rose: -blur 0x5   rose_blur_5.png
convert rose: -filter Gaussian -resize 50% \
      -define filter:sigma=2.5 -resize 200%  rose_resize_5.png

1
谢谢,这正是我在寻找的。我已经搜索了一下,但是没有找到。 - Thariama

5

不确定我是否还能帮助原帖作者,但我最近尝试了模糊的屏幕锁定图片。

我发现省略 -blur 部分可以节省更多的计算时间,并且仍然可以为一张4K图片提供出色的效果:

convert in.png -scale 2.5% -resize 4000% out.png
# real: 0.174s user: 0.144s size: 1.2MiB

convert in.png -scale 10% -blur 0x2.5 -resize 1000% out.png
# real: 0.136s user: 2.117s size: 1.2MiB

convert in.png -blur 0x25 out.png
# real: 2.425s user: 21.408s size: 1KiB

然而,对于3840x2160的图片,您无法将其缩小到低于2.5%。它会重新调整图像大小。我猜eps值因其他尺寸的图片而异。

需要注意的是,生成的图像尺寸明显不同!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接