1.OpenCV:吊打高斯模糊的源码StackBlur加入
2.OpenCV Carotene 源码阅读(持续更新)
OpenCV:吊打高斯模糊的StackBlur加入
简化版 StackBlur API介绍
StackBlur 最近才加入到OpenCV中,将在下一个Release版本(4.7)中出现。源码C++用户可以尝试从源码编译OpenCV体验一下。源码Python 用户可以尝试用pip安装rolling版本的源码OpenCV:pip install opencv-python-rolling==4.6.0.。StackBlur是源码高斯模糊的近似,同样支持水平和垂直不对称的源码eclipse 查看类源码滤波。
为什么StackBlur的源码API中s小写?OpenCV中对API有严格控制,以作者名称开头的源码API可以大写(如Sobel、GaussianBlur),源码除此之外都小写字母开头。源码
StackBlur的源码使用建议和最后的实验结果如下:
建议当kernel size > 时,用stackBlur替换高斯模糊;当kernel size特别大时,源码OpenCV的源码所有模糊滤波器中只推荐stackBlur。
实验结果如下:测试环境为Mac M1,源码网站漏洞.测试源码8核,源码image size [ x ],数据类型:CV_8U3C。测试方法为跑一千次,选取最小作为耗时,测试脚本在这里。结论为stackBlur不会随着kernel size增加而增加耗时。
StackBlur算法的坑是由老瓦在年初挖的。当时他给了我一个任务,尝试增加一个新滤波器stackblur。最后在OpenCV上调通并产生正确模糊结果,但卡在了速度优化上。最近在优化OpenCV的异步和同步源码DNN模块,学会了一些并行加速的技巧,终于填上了这个坑。
本文主要介绍新加入OpenCV的模糊算法Stackblur,Stackblur是一种高斯模糊的快速近似,由Mario Klingemann发明。其计算耗时不会随着kernel size增大而增加,专为大kernel size的模糊滤波场景量身定制。本文从新加入OpenCV的cv::stackBlur API开始介绍,通过对比BoxBlur和高斯模糊,阐述Stackblur的优势。接着,详细介绍了Stackblur算法的原始论文及其计算过程,解释了Stack、源码 壹视助手StackOut和StackIn的运作方式。最后,总结了Stackblur的加速优化策略和实验结果,表明Stackblur在大kernel size下的速度优势。
StackBlur算法采用Queue和Stack计算方式,与传统滤波算法不同,其计算耗时不会随着kernel size的增大而增加,这得益于其独特的计算机制。Stackblur算法在2维图像上的实现,通过先在水平方向进行1维stackblur算法,然后在垂直方向进行1维stackblur算法,实现整体的模糊效果。同时,仿qq邮箱源码通过多线程并行加速、SIMD指令优化等策略,Stackblur算法在性能上实现了显著提升,甚至在某些情况下比BoxBlur更快。
StackBlur的计算优化包括使用乘法代替除法运算,以减少计算量。同时,针对不同数据格式和通道数,提供了一系列优化策略,以提高性能。实验结果显示,StackBlur在kernel size <= 5的情况下,速度接近高斯模糊,而在大kernel size下(如kernel size=),StackBlur的速度远超高斯模糊。
如果你对StackBlur的加速优化和性能测试感兴趣,欢迎在评论区留言讨论,分享建议和反馈。
OpenCV Carotene 源码阅读(持续更新)
OpenCV的Carotene库是NVIDIA为优化计算机视觉(CV)操作而精心设计的,特别针对ARM Neon架构,旨在加速诸如resize和Canny等关键算法。这款库以其清晰的代码和对SIMD编程初学者的友好性而备受赞誉。本文将深入探索Carotene的魅力,揭示其独特的功能点,如accumulate函数的多变接口,包括square accumulate和addweight,后者展示了创新的处理策略。
Carotene的Blur(k3x3_u8)处理方法与众不同,采用了seperateFilter算法,而非传统的O(1)复杂度,展示了其在效率优化上的独到之处。值得一提的是,行方向移位求和和normalize系数的量化计算,都被Carotene以精细的技巧逐一解析。要了解更多细节,不妨直接查看其源码,那里充满了值得学习的见解和实践经验。
Carotene在指令处理上展现出了高效能,如一次性执行乘系数、类型转换和右移等操作,通过vqrdmulhq_s等矢量化指令,实现了寄存器数据的复用。对于边界处理,left_border通过set_lane技术轻松搞定,而right_border的成本则更低。库中还包括了integral和sqrtIntegral的实现,行方向积分的向量化通过移位操作得以高效完成,即使在arm Neon缺乏element shift指令的情况下,Carotene也能通过uint_t标量移位巧妙解决。
在模糊处理上,GaussianBlur遵循Blur的优化思路,对gauss_kernel进行了量化。另外,还有诸如absdiff、add_weighted、add、bitwise以及channel_extract/combine等N-1种基础算子,它们巧妙地结合了neon指令和宏定义,为性能提升做出了贡献。这些细节的精心设计,充分体现了Carotene在提升OpenCV性能上的匠心独运。
总的来说,Carotene的源码是学习SIMD编程和OpenCV优化的绝佳资源,无论是对于开发者还是对性能追求者来说,都是一份值得深入探索的宝藏。如果你对这些技术感兴趣,不要犹豫,立即投身于源码的世界,你会发现其中隐藏的无数精彩。