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

Tha*_*ama 6 perl imagemagick image-processing gaussian gaussianblur

我正在寻找一种比使用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);
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,但是随着水平高度的增加,它消耗的时间似乎呈指数增长。

问题:如何改善模糊操作的时间?还有另一种更快的模糊图像方法吗?

sim*_*que 6

文档谈到了BlurGaussianBlur之间的区别

关于哪个运算符“-blur”或“-gaussian-blur”更适合模糊图像存在一些混淆。首先,“-blur”更快,但它使用两阶段技术来做到这一点。首先在一个轴上,然后在另一个轴上。另一方面,“-gaussian-blur”运算符在数学上更正确,因为它同时在所有方向上模糊。取决于所涉及的模糊量,两者之间的速度成本可能是巨大的,可达 10 倍或更多。

[...]

总之,这两个运算符略有不同,但只是最小的。由于“-blur”要快得多,请使用它。我在几乎所有涉及模糊的例子中都做了。大的

那将是:

$image->Blur( 'x' . $level );
Run Code Online (Sandbox Code Playgroud)

但是Perl ImageMagick 文档BlurGaussianBlur(重点是我的)上都有相同的文字。我现在无法尝试,您必须自己进行基准测试。

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

GaussianBlur:使用给定半径和标准偏差 (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
Run Code Online (Sandbox Code Playgroud)


Ale*_*kin 5

我发现,为模仿模糊而调整图像大小的建议方法,对于非常大的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
Run Code Online (Sandbox Code Playgroud)

在我的i5 2.7Ghz上,它显示的速度提高了10倍。

  • 我有一个 4k 屏幕,而使用 i7(笔记本电脑,不记得速度 ATM)仍然需要 1 秒。但缩小到 5%,上升 20k% 需要 0.2 秒 (2认同)

Sca*_*tor 5

不确定我是否还能帮助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
Run Code Online (Sandbox Code Playgroud)

但是,对于 3840x2160,分辨率不能低于 2.5%。它将调整图像的大小。我猜其他尺寸的图片的 eps 值会有所不同。

应该注意的是,生成的图像大小明显不同!