• 从GIMP的Retinex算法里发现了一种高斯模糊的快速实现方法【开发记录】。


         这段时间在研究Retinex 技术,看例程代码时翻到了GIMP的源代码,结果却找到了一种简单而又快速的高斯模糊的实现方式。

         这种高斯模糊的实现同GIMP内嵌的高斯模糊算法也有所不同,并且速度上还有一定的优势,具体的代码可以参考GIMP下的contrast-retinex.c里面的代码。

         GIMP自带的高斯模糊的代码在 blur-gauss里。

         不过使用Retinex里的高斯模糊的代码会有一个小问题,就是多次模糊会发现图像像素整体向右下角或某个方向偏移,这个问题的解决很简单,有朋友遇到的时候在来问问,这里先卖个关子。

          具体的算法论文可以再百度搜索 : Recursive Implementation of the gaussian filter.

          贴一段核心代码:

    View Code
    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);
    }

          这段代码的优化还有很大的空间, 并且高斯模糊算法很容易并行化。 

  • 相关阅读:
    python异常触发及自定义异常类
    python for i in range(x)应用的问题
    季羡林 暮年沉思录
    再谈python的list类型参数及复制
    Python 列表推导式
    JavaScript:垃圾数据是如何自动回收的?
    JavaScript:this的用法
    JavaScript:浅谈闭包及其回收原则
    ES6:async / await ---使用同步方式写异步代码
    五大主流浏览器与四大浏览器内核
  • 原文地址:https://www.cnblogs.com/Imageshop/p/2849782.html
Copyright © 2020-2023  润新知