文件中包含:Median Filter in Constant Time.pdf
A fast median filter using AltiVec.pdfctmf.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%)算法也可以利用这个实现了。
算法的有些细节还在琢磨中,不过基本已经弄懂了,算法执行的耗时部分还是在直方图更行那一块。
1
2
3
4
5
6
7
|
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的),发现如果把这个子函数直接写到主函数中,速度反而会下降,通过反编译分析原因,应该是如果调用子函数,虽然有一些进栈和出栈的的操作,但是可以充分利用访问寄存器比访问内存快很多的特点来优化速度。