我正在寻找一种更快的模糊图像的方式,而不是使用 GaussianBlur 。 解决方案我正在寻找可以是命令行解决方案,但我更喜欢perl表示法中的代码。
实际上,我们使用Perl图像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);
这样可以正常工作,但随着关卡高度的增加,它消耗的时间似乎呈指数级增长。
问题:如何改善模糊操作所用的时间? 是否有另一种更快速的方法来模糊图像?
答案 0 :(得分:4)
我发现用于模糊模仿的the suggested method调整大小的图像使得输出看起来非常像像是非常大的sigma值,如25或更多。所以我终于想到了缩减模糊 - 放大,这会产生非常好的结果(几乎与大西格玛的简单模糊无法区分):
# 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倍。
答案 1 :(得分:3)
documentation speaks of the difference between Blur and GaussianBlur。
对于哪个运营商,“-blur”或者哪个运营商存在一些混淆 “-gaussian-blur”更适合模糊图像。首先是“-blur” 更快,但它使用两阶段技术。先进一个 轴,然后在另一个。另一方面是“-gaussian-blur”运算符 手在数学上更正确,因为它在所有方向上模糊 同时。两者之间的速度成本可能是巨大的 因子为10或更多,取决于所涉及的模糊量。
[...]
总之,两个运营商略有不同,但仅限于此 最低限度。因为“-blur”要快得多,所以请使用它。我做的几乎都是 涉及模糊的例子。大
那就是:
$image->Blur( 'x' . $level );
但是Perl ImageMagick documentation在Blur
和GaussianBlur
上都有相同的文字(强调我的)。我现在不能尝试,你必须自己做基准测试。
模糊:使用给定半径和标准差(sigma)的高斯算子降低图像噪声并降低细节水平。
GaussianBlur:使用给定半径和标准偏差(sigma)的高斯算子降低图像噪声并降低细节水平。
alternative that the documentation also lists正在将图像调整为非常小,然后再次放大。
使用大sigma值进行图像模糊非常慢。但是onw 技术可以用来加速这个过程。然而,这只是一个 粗糙的方法,可以使用一些数学上的严谨性来改进 结果。因此,大模糊的原因很慢是因为你 需要一个大窗口或'内核'来合并大量的像素,为 图像中的每个像素。然而调整大小(制作图像 更小的)做同样的事情,但产生更少的像素 处理。该技术基本上缩小了图像,然后将其放大 再次产生沉重的模糊结果。高斯滤波器是 对此特别有用,因为您可以直接指定高斯 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
答案 2 :(得分:1)
不确定是否仍然可以帮助OP,但是最近我对模糊的锁屏图片尝试了相同的操作。 我发现省略-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值会有所不同。
请注意,生成的图像大小明显不同!