从GIMP的Retinex算法里发现了一种高斯模糊的快速实现方法【开发记录】。
从GIMP的Retinex算法里发现了一种高斯模糊的快速实现方法【开发记录】。
abcijkxyz 发表于1年前
从GIMP的Retinex算法里发现了一种高斯模糊的快速实现方法【开发记录】。
  • 发表于 1年前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

     这段时间在研究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); }

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

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 59
博文 6195
码字总数 1876
×
abcijkxyz
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: