二、实现

GIMP中有IIR型高斯滤波的实现,代码位于contrast-retinex.c中,读者可自行查看。下面给出本人实现的核心代码:

#include"stdafx.h"
typedef struct
{
float B;
float b[];
} gauss_coefs; //参数计算
void compute_coefs3(gauss_coefs *c,float sigma)
{
float q, q2, q3;
if (sigma >= 2.5)
{
q = 0.98711 * sigma - 0.96330;
}
else if ((sigma >= 0.5) && (sigma < 2.5))
{
q = 3.97156 - 4.14554 * (float) sqrt ((float) - 0.26891 * sigma);
}
else
{
q = 0.1147705018520355224609375;
}
q2 = q * q;
q3 = q * q2;
c->b[] = /(1.57825+(2.44413*q)+(1.4281 *q2)+(0.422205*q3));
c->b[] = ( (2.44413*q)+(2.85619*q2)+(1.26661 *q3)) *c->b[];
c->b[] = ( -((1.4281*q2)+(1.26661 *q3)))*c->b[];
c->b[] = ( (0.422205*q3)) *c->b[];
c->B = 1.0-(c->b[]+c->b[]+c->b[]); } //IIR型高斯滤波
//**************************************************************//
//参考文献:Recursive implementation of the Gaussian filter
//Src:输入图像
//Dest:输出图像
//sigma:高斯标准差
//**************************************************************//
IS_RET IIRGaussianFilter(TMatrix *Src,TMatrix *Dest,float sigma)
{
int X,Y,Width=Src->Width,Height=Src->Height,Stride=Src->WidthStep,Channel=Src->Channel;
gauss_coefs c;
compute_coefs3(&c,sigma);
unsigned char *LinePS,*LinePD;
float *Buff,*BPointer,*w1,*w2;
Buff=(float*)malloc(sizeof(float)*Height*Width);//缓存
if(Buff==NULL){return IS_RET_ERR_OUTOFMEMORY;}
for(int i=;i<Channel;i++)
{
LinePS=Src->Data+i;
LinePD=Dest->Data+i;
//拷贝原图至缓存Buff
BPointer=Buff;
for (Y=;Y<Height;Y++)
{
for (X=;X<Width;X++)
{
BPointer[]=float(LinePS[]);
BPointer++;
LinePS+=Channel;
}
LinePS+=Stride-Width*Channel;
}
//横向滤波
BPointer=Buff;
w1=(float*)malloc(sizeof(float)*(Width+));
if(w1==NULL){return IS_RET_ERR_OUTOFMEMORY;}
w2=(float*)malloc(sizeof(float)*(Width+));
if(w2==NULL){return IS_RET_ERR_OUTOFMEMORY;}
for(Y=;Y<Height;Y++)
{
//前向滤波
w1[]=w1[]=w1[]=BPointer[];
for(int n=,i=;i<Width;n++,i++)
{
w1[n]=c.B*BPointer[i]+(c.b[]*w1[n-]+c.b[]*w1[n-]+c.b[]*w1[n-]);
}
//后向滤波
w2[Width]=w2[Width+]=w2[Width+]=w1[Width+];
for(int n=Width-;n>=;n--)
{
BPointer[n]=w2[n]=c.B*w1[n+]+(c.b[]*w2[n+]+c.b[]*w2[n+]+c.b[]*w2[n+]);
}
BPointer+=Width;
} //纵向滤波
BPointer=Buff;
w1=(float*)realloc(w1,sizeof(float)*(Height+));
if(w1==NULL){return IS_RET_ERR_OUTOFMEMORY;}
w2=(float*)realloc(w2,sizeof(float)*(Height+));
if(w2==NULL){return IS_RET_ERR_OUTOFMEMORY;}
for (X=;X<Width;X++)
{
//前向滤波
w1[]=w1[]=w1[]=BPointer[];
for(int n=,i=;i<Height;n++,i++)
{
w1[n]=c.B*BPointer[i*Width]+(c.b[]*w1[n-]+c.b[]*w1[n-]+c.b[]*w1[n-]);
}
//后向滤波
w2[Height]=w2[Height+]=w2[Height+]=w1[Height+];
for(int n=Height-;n>=;n--)
{
BPointer[n*Width]=w2[n]=c.B*w1[n+]+(c.b[]*w2[n+]+c.b[]*w2[n+]+c.b[]*w2[n+]);
}
BPointer++;
}
//拷贝缓存至结果
BPointer=Buff;
for(Y=;Y<Height;Y++)
{
for(X=;X<Width;X++)
{
LinePD[]=BPointer[];
if(BPointer[]>)LinePD[]=;
if(BPointer[]<)LinePD[]=;
BPointer++;
LinePD+=Channel;
}
LinePD+=Stride-Width*Channel;
}
free(w1);
free(w2);
}
return IS_RET_OK;
}

实验结果:对一幅1024*1024的彩色图像,算法耗时175ms。

参考文献

Young I T, Van Vliet L J. Recursive implementation of the Gaussian filter[J]. Signal processing, 1995, 44(2): 139-151.

IIR型高斯滤波的原理及实现的更多相关文章

  1. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  2. 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

    本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...

  3. matlab做gaussian高斯滤波

    原文链接:https://blog.csdn.net/humanking7/article/details/46826105 核心提示 在Matlab中高斯滤波非常方便,主要涉及到下面两个函数: 函数 ...

  4. matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波

    来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...

  5. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  6. OpenCV实现的高斯滤波探究_1(《学习OpenCV》练习题第五章第三题ab部分)

    首先看下OpenCV 官方文档对于cvSmooth各个参数的解释: Smooths the image in one of several ways. C: void cvSmooth(const C ...

  7. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...

  8. 基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存

    如题:使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换.高斯滤波.canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存 ...

  9. opencv3.2.0图像处理之高斯滤波GaussianBlur API函数

    /*高斯滤波:GaussianBlur函数 函数原型: void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double s ...

随机推荐

  1. Immutable学习及 React 中的实践

    为什么用immutable.js呢.有了immutable.js可以大大提升react的性能. JavaScript 中的对象一般是可变的(Mutable),因为使用了引用赋值,新的对象简单的引用了原 ...

  2. php网站前台utf-8格式有时会出现莫名其妙的空白行,重新保存下编码格式就可以了

    php网站前台utf-8格式有时会出现莫名其妙的空白行,重新保存下编码格式就可以了.

  3. 简易SQL语句

    /*创建 模式 为用户 User1*/ CREATE SCHEMA test authorization User1; CREATE SCHEMA test USER User1; CREATE TA ...

  4. bzoj4169: Lmc的游戏

    终于有道我会的了... int f[2][maxn],g[2][maxn],tot[maxn];//构造叶子编号时希望最大/小result 先手取子树最小/大的编号的排名 tot是子树中叶子个数 如果 ...

  5. jsp项目上传到服务器

    我们通过Myeclipse完成一个Java web项目时只能通过本地访问来查看,但是我们想把它上传到服务器上使用外网访问应该怎么做呢,首先肯定是要有一台服务器 个人调试项目试手的话我建议去买阿里云的云 ...

  6. Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索

    Lucene 的四大索引查询  清单1:使用布尔操作符 Java代码      //Test boolean operator blic void testOperator(String indexD ...

  7. Java类成员访问控制权限

    类成员访问控制权限 在JAVA中有四种访问控制权限,分别为:private, default, protected, public 1.Private 如果一个成员方法或变量名前使用了private, ...

  8. POJ2689:Prime Distance(大数区间素数筛)

    The branch of mathematics called number theory is about properties of numbers. One of the areas that ...

  9. HDU5890:Eighty seven(Bitset优化背包)

    Mr. Fib is a mathematics teacher of a primary school. In the next lesson, he is planning to teach ch ...

  10. 你真的懂redis吗?

    Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难.作为一名在互联网技术行业打击过成百上千名[请允许我夸张一下]的资深技术面试官 ...