任意半径中值滤波的快速算法共享(O(1) 时间复杂度)。

laviewpbt 2013-02-27 08:54:44
加精
有很多朋友可能都已经看到过这些算法。不过还是共享给那些还在找寻的朋友吧。

文件中包含:Median Filter in Constant Time.pdf
A fast median filter using AltiVec.pdf
ctmf.c
ctmf.h

参考资料下载:http://files.cnblogs.com/Imageshop/MedianFilter.rar

Median Filter in Constant Time.pdf这篇文章的算法很简单明了,算法的时间复杂度为o(1),对半径基本不敏感,算法的主要优化思想是粗分直方图和细分直方图,利用高位和低位缩小寻中值的时间。当然,这个算法对搞图像效果的朋友来说更实际,因为一般实际需求不会要特大半径的中值模糊。

通过编码和速度比较,在小半径时,算法的速度比不上PS,但是在大半径,比如100的时候,针对4000*3000*24的图像,上述算法用时大概在7S,PS要25S。

稍微更改下,就可以实现任意百分比算法了,中值可以看成是50%百分比的特例,PS的最大值(100%)和最小值(0%)算法也可以利用这个实现了。



算法的有些细节还在琢磨中,不过基本已经弄懂了,算法执行的耗时部分还是在直方图更行那一块。


static inline void histogram_add( const uint16_t x[16], uint16_t y[16] )
{
int i;
for ( i = 0; i < 16; ++i ) {
y[i] += x[i];
}
}


类似这个函数建议把循环展开,速度能提高不少。

还有我在实际实践的时候(我用的是C#,没有inline的),发现如果把这个子函数直接写到主函数中,速度反而会下降,通过反编译分析原因,应该是如果调用子函数,虽然有一些进栈和出栈的的操作,但是可以充分利用访问寄存器比访问内存快很多的特点来优化速度。


...全文
1520 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32708105 2015-11-21
  • 打赏
  • 举报
回复
怎么改进中值滤波算子啊
cgstian 2013-05-29
  • 打赏
  • 举报
回复
呵呵,还有锐化等算法,这是数字图像处理课程中的,效率问题我倒是没有考虑过。
THU_Wm 2013-05-29
  • 打赏
  • 举报
回复
附的程序里直接使用了SSE和MMX等特性,看起来很高端……不过现在的编译器(比如我用VS2010)应该可以在编译时自动优化吧?
dianyancao 2013-03-15
  • 打赏
  • 举报
回复
O(1)的256灰度级表很大啊,空间O(256*N) 开闭运算的实现用索引计数排序时间O(1),空间O(N)
Trent1985 2013-02-28
  • 打赏
  • 举报
回复
引用 4 楼 laviewpbt 的回复:
自己Up下。
呵呵,搞图像的兄弟姐妹们都来UP啊!
laviewpbt 2013-02-28
  • 打赏
  • 举报
回复
自己Up下。
jimette 2013-02-27
  • 打赏
  • 举报
回复
Trent1985 2013-02-27
  • 打赏
  • 举报
回复
laviewpbt 2013-02-27
  • 打赏
  • 举报
回复

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧