二、实现

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. nyoj 题目10 skiing —— 南阳oj

    题目信息例如以下: skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区 ...

  2. c#生成PDF准考证

    项目中需要做一个生成PDF准考证的功能,在这里跟大家分享一下思路.. 1.首先是下载Adobe Acrobat 9 Pro,安装破解(高版本的貌似破解,不了,自带正版意识的略过..随意下载) 2.新建 ...

  3. dubbo简单配置与使用

    dubbo简介 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时 ...

  4. Hadoop spark mongo复制集

    启动hadoop cd /usr/local/hadoop/hadoop $hadoop namenode -format # 启动前格式化namenode $./sbin/start-all.sh ...

  5. Cocos2d-js异步图片加载

    这里说的是在需要的使用加载图片,比如游戏中的某个关卡的图片,不用在游戏一开始就加载(万一用户玩不到那关,岂不是很冤,流量费了那么多),否则 载入速度也慢.这种方式加载资源要用到cc.loader官方文 ...

  6. spring boot 使用Ehcache

    1-引入maven依赖: 2-增加ehcache.xml 3-bootstrap.yml配置ehcache.xml的路径 4-启动类加注解@EnableCaching 5-使用处加注解@Cacheab ...

  7. linux内存操作--ioremap和mmap

    最近在做视频输出相关的东西,对于预留给framebuffer的内存使用不是很清楚,现在找到一些资料整理一下,以备使用.if (想看使用方法)  goto   使用方法: 对于一个系统来讲,会有很多的外 ...

  8. ubuntu中使用apt-get安装zbar

    apt-get是linux中常用的shell命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统.apt-get命令一般需要root权限执行,所以 ...

  9. Android应用开发完全退出程序的通用方法

    在开发一个android应用时,有可能有N个Activity,而在每个Activity里的菜单里有个"退出程序"菜单,这里就要完全退出程序了,所以今天给大家分享的是Android应 ...

  10. 6-10 SVM支持向量机1

    都是特征加上分类器.还将为大家介绍如何对这个数据进行训练.如何训练得到这样一组数据. 其实SVM支持向量机,它的本质仍然是一个分类器.既然是一个分类器,它就具有分类的功能.我们可以使用一条直线来完成分 ...