29个版本 (5个重大变更)
新 0.13.4 | 2024年8月22日 |
---|---|
0.13.1 | 2024年7月22日 |
#89 在 图像 中
每月347次下载
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