Opencv之快速高斯模糊(IIR递归高斯模糊)

文章介绍了如何使用递归实现的IIR滤波器来解决高斯滤波中核大小影响效率的问题。通过提供的C代码示例,展示了如何改写高斯模糊算法以提高处理速度,特别是在小核大小时比Opencv自带的GaussianBlur函数更快。然而,当核增大到51x51时,IIR方法的效率降低。
摘要由CSDN通过智能技术生成

 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.参考资料

    IIR型高斯滤波的原理及实现_聚沙塔的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值