29个版本 (5个重大变更)

0.13.4 2024年8月22日
0.13.1 2024年7月22日

#89图像

Download history 11/week @ 2024-05-03 7/week @ 2024-05-17 1/week @ 2024-05-24 3/week @ 2024-05-31 1371/week @ 2024-06-07 404/week @ 2024-06-14 625/week @ 2024-06-21 171/week @ 2024-06-28 14/week @ 2024-07-05 96/week @ 2024-07-12 110/week @ 2024-07-19 26/week @ 2024-07-26 229/week @ 2024-08-02 18/week @ 2024-08-09 69/week @ 2024-08-16

每月347次下载

Apache-2.0 OR BSD-3-Clause

1MB
21K SLoC

Rust的快速模糊算法库

有一些非常好且速度极快的算法可以用于图像模糊。最佳优化为NEON和SSE。

对于4K照片,您可能以100 FPS的速度接收高斯模糊。

image默认模糊快得多。

当使用4通道模式时,始终认为alpha通道是最后一个。

此外,还有一些可用的选项,可以在线性颜色空间中进行模糊,或者如果方法不适合您,也有f32选项可用

性能

大多数模糊算法都做得非常好,并且运行速度非常快。当适当比较OpenCV时。为了测量,使用了具有NEON功能的M3 Pro。在x86_84上,有时OpenCV可能更好,因为库中未完全支持AVX-2。

用法

cargo add libblur

堆栈模糊

速度最快且结果可接受。结果非常接近高斯,看起来很好。有时可能观察到明显的变化。然而,如果您使用高级分析算法,将检测到非高斯方法。不适用于抗锯齿。结果略逊于“快速高斯”,但速度更快。

O(1)复杂度。

libblur::stack_blur( & mut bytes, stride, width0, height, radius, FastBlurChannels::Channels3);

模糊3000x4000 RGB 8位图像的单线程模式下的示例比较时间,半径为77。

时间
libblur 43.58ms
OpenCV 89.64ms

模糊3000x4000 RGB 8位图像的多线程模式下的示例比较时间,半径为77。

时间
libblur 8.68ms
OpenCV 87.99ms

模糊2828x4242 RGBA 8位图像的多线程模式下的示例比较时间,半径为77。

时间
libblur 6.73ms
OpenCV 93.26ms

模糊2828x4242 RGBA 8位图像的单线程模式下的示例比较时间,半径为77。

时间
libblur 31.18ms
OpenCV 90.82ms

快速高斯

非常快。结果与高斯曲线非常接近,看起来很好。有时可能会观察到明显的变化。然而,如果您使用高级分析算法,将检测到非高斯方法。不适用于抗锯齿。如果您需要高斯,则不要使用。基于二项式滤波器,通常速度接近,可能比堆叠模糊(除了NEON或非多线程堆叠模糊,在NEON上速度更快或超过非多线程堆叠模糊)略快,但我认为结果更好。最大半径约为320个u8,对于u16会更少。

O(log R)复杂度。

libblur::fast_gaussian( & mut bytes, stride, width0, height, radius, FastBlurChannels::Channels3);

模糊3000x4000 RGB 8位图像的单线程模式下的示例比较时间,半径为77。

时间
libblur 47.40ms
OpenCV -

模糊3000x4000 RGB 8位图像的多线程模式下的示例比较时间,半径为77。

时间
libblur 9.95ms
OpenCV -

模糊2828x4242 RGBA 8位图像的多线程模式下的示例比较时间,半径为77。

时间
libblur 9.74ms
OpenCV --

模糊2828x4242 RGBA 8位图像的单线程模式下的示例比较时间,半径为77。

时间
libblur 43.60ms
OpenCV --

快速高斯模糊

非常快。产生非常令人愉悦的结果,接近高斯。如果4K照片在10ms内模糊,这种方法将在15ms内完成。最大半径约为150-180个u8,对于u16会更少。

O(log R)复杂度。

libblur::fast_gaussian_next( & mut bytes, stride, width, height, radius, FastBlurChannels::Channels3);

模糊3000x4000 RGB 8位图像的单线程模式下的示例比较时间,半径为77。

时间
libblur 53.99ms
OpenCV -

模糊3000x4000 RGB 8位图像的多线程模式下的示例比较时间,半径为77。

时间
libblur 10.26ms
OpenCV -

帐篷模糊

2个连续的箱式模糊(理论)产生帐篷滤波器。中等速度,具有大半径帐篷的结果更加明显。

O(1)复杂度。

libblur::tent_blur(bytes, stride, & mut dst_bytes, stride, width, height, radius, FastBlurChannels::Channels3);

中值模糊

中值模糊(中值滤波器)。实现足够快。

O(log R)复杂度。

libblur::median_blur(bytes, stride, & mut dst_bytes, stride, width, height, radius, FastBlurChannels::Channels3);

在多线程模式下,模糊3000x4000 RGB 8位图像的示例比较时间,半径为35。

时间
libblur 468.47ms
OpenCV 725.89ms

在多线程模式下,模糊2828x4242 RGBA 8位图像的示例比较时间,半径为35。

时间
libblur 643.22ms
OpenCV 788.93ms

高斯模糊

结果出色。尽管有所改进,但速度远慢于任何近似慢的方法。当需要使用高斯方法时使用,例如平滑、抗锯齿、FFT、高级分析等。

核大小必须是奇数。如果核大小不是奇数,则将引发恐慌。

O(R)复杂度。

libblur::gaussian_blur( & bytes, src_stride, & mut dst_bytes, dst_stride, width, height, kernel_size, sigma, FastBlurChannels::Channels3);

在多线程模式下,模糊3000x4000 RGB 8位图像的示例比较时间,核大小为151。

时间
libblur 122.02ms
OpenCV 251.10ms

在多线程模式下,模糊2828x4242 RGBA 8位图像的示例比较时间,核大小为151。

时间
libblur 131.21ms
OpenCV 193.67ms

在多线程模式下,模糊3000x4000单平面8位图像的示例比较时间,核大小为151。

时间
libblur 41.65ms
OpenCV 75.94ms

高斯箱式模糊

通常3个连续的箱式模糊几乎是高斯模糊(理论),速度较慢,但结果非常好。中等速度。

O(1)复杂度。

libblur::gaussian_box_blur(bytes, stride, & mut dst_bytes, stride, width, height, radius, FastBlurChannels::Channels3);

箱式模糊

箱式模糊。以较差的外观结果为代价来妥协速度。中等速度。

O(1)复杂度。

libblur::box_blur(bytes, stride, & mut dst_bytes, stride, width, height, radius, FastBlurChannels::Channels3);

模糊3000x4000 RGB 8位图像的多线程模式下的示例比较时间,半径为77。

时间
libblur 14.08ms
OpenCV 96.41ms

模糊3000x4000 RGB 8位图像的单线程模式下的示例比较时间,半径为77。

时间
libblur 57.47ms
OpenCV 92.66ms

模糊2828x4242 RGBA 8位图像的多线程模式下的示例比较时间,半径为77。

时间
libblur 12.79ms
OpenCV 136.66ms

模糊2828x4242 RGBA 8位图像的单线程模式下的示例比较时间,半径为77。

时间
libblur 51.90ms
OpenCV 134.28ms

依赖项

~3.5MB
~75K SLoC