二、实现

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. Delphi和C++的语法区别 (关于构造和析构)

    目录 Delphi永远没办法在栈上创建一个对象 Delphi的构造函数更象是个类方法(静态成员函数) Delphi的析构函数中可以调用纯虚方法 Delphi在构造对象时自动将成员变量清零 Delphi ...

  2. Continuous integration: The answer to life, the universe, and everything?

    Continuous integration is not always the right answer. Here's why. https://techbeacon.com/continuous ...

  3. bzoj3136: [Baltic2013]brunhilda

    这个题为什么会放在数据结构啊 首先因为有决策包容性,对于一个n每次必然选择一个n%p最大的p,令n减n%p 设fi表示i变成0的步数的话,同样我们可以知道f是有单调性的 假如fd能转移到fk,首先d一 ...

  4. 重入锁ReentrantLock用法以及如何实现重进入

    在java多线程中,可以使用synchronized实现线程之间的同步互斥,但在jdk1.5中增加了ReentrantLock类也能达到同样的效果,而且在使用上更加灵活,扩展功能上更加强大. 创建My ...

  5. html5--6-60 阶段练习7-下拉菜单

    html5--6-60 阶段练习7-下拉菜单 学习要点 综合运用所学过的知识完成一个下拉菜单的小练习,加深对学过知识点的综合应用能力. <!DOCTYPE html> <html l ...

  6. 【转载】AsyncTask用法

    在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只 ...

  7. 【Maven】pom.xml(1)

    在pom.xml加入: <build> <finalName>oauth2</finalName> <resources> <resource&g ...

  8. I.MX6 boot from Micro SD

    /***************************************************************************** * I.MX6 boot from Mic ...

  9. [Java] public, private, protected

      同包不同类的成员 不同包中子类的成员 不同包非子类的成员 public √ √ √ protected √ √ × 默认 √ × × private × × ×

  10. [Selenium] Android HTML5 中 Web Storage

    在 HTML5 中,Web Storage 这个新特性可让用户将数据存储在本地的浏览器中.在早期的浏览器中可通过 cookies 来完成这个任务,但 Web Storage 会更加安全和高效,且 We ...