1.介绍
高斯滤波在图像处理中应该是一种常见的滤波器,用过Opencv的人应该都知道,Opencv是有自带可调用的高斯滤波函数GaussianBlur(src, dst2, cv::Size(3, 3), 3, 3),其中需要配置的参数有核的大小,核越大,此函数运行的时间越长
今天的猪脚就是用来解决高斯滤波和核大小无关的问题,其原理推导见下面或者参考论文:Recursive Implementation of the gaussian filter.
2.代码
在学习此算法的时候,我本想找一个基于Opencv的快速高斯模糊,但没找到,所以自己改写了一个,我目前放出来的代码并不是基于Opencv,建议读者先自己折腾一下,如果实在搞不出来,可以留言。
static void
gausssmooth (gfloat *in, gfloat *out, gint size, gint rowstride, gauss3_coefs *c)
{
/*
* Papers: "Recursive Implementation of the gaussian filter.",
* Ian T. Young , Lucas J. Van Vliet, Signal Processing 44, Elsevier 1995.
* formula: 9a forward filter
* 9b backward filter
* fig7 algorithm
*/
gint i,n, bufsize;
gfloat *w1,*w2;
/* forward pass */
bufsize = size+3;
size -= 1;
w1 = (gfloat *) g_try_malloc (bufsize * sizeof (gfloat));
w2 = (gfloat *) g_try_malloc (bufsize * sizeof (gfloat));
w1[0] = in[0];
w1[1] = in[0];
w1[2] = in[0];
for ( i = 0 , n=3; i <= size ; i++, n++)
{
w1[n] = (gfloat)(c->B*in[i*rowstride] +
((c->b[1]*w1[n-1] +
c->b[2]*w1[n-2] +
c->b[3]*w1[n-3] ) / c->b[0]));
}
/* backward pass */
w2[size+1]= w1[size+3];
w2[size+2]= w1[size+3];
w2[size+3]= w1[size+3];
for (i = size, n = i; i >= 0; i--, n--)
{
w2[n]= out[i * rowstride] = (gfloat)(c->B*w1[n] +
((c->b[1]*w2[n+1] +
c->b[2]*w2[n+2] +
c->b[3]*w2[n+3] ) / c->b[0]));
}
g_free (w1);
g_free (w2);
}
在Release下,将Opencv中高斯函数的核大小设置成3*3,其速度是比IIR快
当高斯函数的核大小设置成51*51的时候,其速度是比IIR慢
3.参考资料
版权声明:本文为m0_59023219原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。