转自:IIR型高斯滤波的原理及实现

二、实现

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

#include"stdafx.h"
typedef struct
{float B;float b[4];
} 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) 1 - 0.26891 * sigma);}else{q = 0.1147705018520355224609375;}q2 = q * q;q3 = q * q2;c->b[0] = 1/(1.57825+(2.44413*q)+(1.4281 *q2)+(0.422205*q3));c->b[1] = (        (2.44413*q)+(2.85619*q2)+(1.26661 *q3)) *c->b[0];c->b[2] = (                   -((1.4281*q2)+(1.26661 *q3)))*c->b[0];c->b[3] = (                                 (0.422205*q3)) *c->b[0];c->B = 1.0-(c->b[1]+c->b[2]+c->b[3]);}//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=0;i<Channel;i++){LinePS=Src->Data+i;LinePD=Dest->Data+i;//拷贝原图至缓存BuffBPointer=Buff;for (Y=0;Y<Height;Y++){for (X=0;X<Width;X++){BPointer[0]=float(LinePS[0]);BPointer++;LinePS+=Channel;}LinePS+=Stride-Width*Channel;}//横向滤波BPointer=Buff;w1=(float*)malloc(sizeof(float)*(Width+3));if(w1==NULL){return IS_RET_ERR_OUTOFMEMORY;}w2=(float*)malloc(sizeof(float)*(Width+3));if(w2==NULL){return IS_RET_ERR_OUTOFMEMORY;}for(Y=0;Y<Height;Y++){//前向滤波w1[0]=w1[1]=w1[2]=BPointer[0];for(int n=3,i=0;i<Width;n++,i++){w1[n]=c.B*BPointer[i]+(c.b[1]*w1[n-1]+c.b[2]*w1[n-2]+c.b[3]*w1[n-3]);}//后向滤波w2[Width]=w2[Width+1]=w2[Width+2]=w1[Width+2];for(int n=Width-1;n>=0;n--){BPointer[n]=w2[n]=c.B*w1[n+3]+(c.b[1]*w2[n+1]+c.b[2]*w2[n+2]+c.b[3]*w2[n+3]);}BPointer+=Width;}//纵向滤波BPointer=Buff;w1=(float*)realloc(w1,sizeof(float)*(Height+3));if(w1==NULL){return IS_RET_ERR_OUTOFMEMORY;}w2=(float*)realloc(w2,sizeof(float)*(Height+3));if(w2==NULL){return IS_RET_ERR_OUTOFMEMORY;}for (X=0;X<Width;X++){//前向滤波w1[0]=w1[1]=w1[2]=BPointer[0];for(int n=3,i=0;i<Height;n++,i++){w1[n]=c.B*BPointer[i*Width]+(c.b[1]*w1[n-1]+c.b[2]*w1[n-2]+c.b[3]*w1[n-3]);}//后向滤波w2[Height]=w2[Height+1]=w2[Height+2]=w1[Height+2];for(int n=Height-1;n>=0;n--){BPointer[n*Width]=w2[n]=c.B*w1[n+3]+(c.b[1]*w2[n+1]+c.b[2]*w2[n+2]+c.b[3]*w2[n+3]);}BPointer++;}//拷贝缓存至结果BPointer=Buff;for(Y=0;Y<Height;Y++){for(X=0;X<Width;X++){LinePD[0]=BPointer[0];if(BPointer[0]>255)LinePD[0]=255;if(BPointer[0]<0)LinePD[0]=0;    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. 【图像处理】之高斯滤波:原理、代码实现和优化加速

    文章目录 声明 概念 高斯滤波性质 高斯模糊原理 高斯函数 高斯核(高斯模板) 高斯滤波计算 边界处理 优化:高斯函数分离特性 代码实现 参考资料 声明 本文整合了网上内容,引用出处见文末参考链接,如 ...

  2. 中值滤波与高斯滤波的原理和应用场合

    中值滤波属于非线性滤波的一种,高斯滤波属于线性滤波的一种.在Opencv中有高斯滤波的函数,但是中值滤波需要通过排序实现. 一.中值滤波 原理:中值滤波使用一个围绕当前像素的矩形,查找区域内像素的中值 ...

  3. 高斯滤波与双边滤波原理、MATLAB实现及结果对照

    本文详细介绍高斯滤波和双边滤波的原理并给出MATLAB实现,最后对照高斯滤波与双边滤波的效果. 目录 一.滤波原理 1.1 一维高斯分布 1.2 二维高斯分布 1.3 高斯滤波总结 二.双边滤波 1. ...

  4. 直方图均衡化高斯滤波

    直方图均衡化高斯滤波 直方图 原理 py实现 均衡化 原理 py实现 高斯滤波 原理 py实现 直方图 原理 直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹 ...

  5. 图像处理:高斯滤波算法

    目录 前言 概念介绍 基本原理 卷积核的大小 卷积核的形状和权重比 卷积核的归一化 结论 Opencv实现高斯滤波 Python手写实现高斯滤波 参考文章 前言 在此之前,我曾在此篇中推导过图像处理: ...

  6. NR基础篇上——均值滤波、高斯滤波、双边滤波、NLM

    人类的世界就是一个信号传输的世界,所以噪声无处不在,图像作为一种信号传输的方式当然也无法幸免.为了尽量减少噪声对图像质量的影响,还原物体的本来状态就提出了一系列降噪的方法,本文就简单介绍几种常见的降噪 ...

  7. 数字图像处理之高斯滤波加速优化

    在上一篇文章中,我们讲了高斯滤波以及分离高斯滤波的原理与C++实现.本文将在此基础上,分别详细讲解使用SSE指令和CUDA来对分离高斯滤波算法的优化加速. 一.SSE指令优化 我们知道,SSE指令优化 ...

  8. python一维平滑滤波_高斯滤波器的原理及其实现过程(附模板代码)

    本文主要介绍了高斯滤波器的原理及其实现过程高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像.其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出.其窗口模板的系数和均值滤波器不同 ...

  9. 高斯模糊(高斯滤波)原理以及计算过程

    高斯模糊/高斯滤波 通常,图像处理软件会提供模糊滤镜,使图片产生模糊效果. 模糊的算法有很多,其中有一种叫高斯模糊(Gaussian Blur),它将正态分布用于图像处理. 文本介绍了高斯模糊的算法, ...

  10. python高斯滤波和降噪_高斯滤波原理及python实现

    高斯滤波器时一种线性平滑滤波器,主要适用处理高斯噪声,所以在了解高斯滤波之前,我们首先熟悉一下高斯噪声.噪声在图像中表现的通常是引起视觉效果的孤立像素点和像素块,简单说噪声点就是会给图像带来干扰,让图 ...

最新文章

  1. 软件开发人员维护代码指南
  2. 关于 URL 的一些不可不知的知识
  3. 日常生活小技巧 -- 惠普 Windows10 进入安全模式
  4. 图文结合,白话 Go 的垃圾回收原理
  5. Unix/Linux/BSD 它们之间的关系以及各自派系的介绍
  6. Mschart图表制作
  7. excel宏计算机,Excel怎么设置宏 Excel宏设置图文教程-电脑教程
  8. 在没有原始数据的情况下, 我把列线图转换成了网页计算器
  9. “_CRT_SECURE_NO_DEPRECATE”: 未定义宏或在预编译头使用后定义发生改变
  10. php rsa 模数 指数,密码:使用模数和指数生成RSA私钥
  11. 手机网站(wap)广告展示一般都有哪些表现形式?
  12. Jetson TX2零基础学习(一)——连线、刷机
  13. Twitter API
  14. 高斯滤波及高斯卷积核C++实现
  15. 00无人机简介以及课程介绍2020-07-03
  16. 【腾讯云原生降本增效大讲堂】云原生混部技术标准解读
  17. LVTTL转LVDS GM8285C,28位LVDS发送器,替代GM8283
  18. 详解pandas中的groupy机制
  19. c#中const与readonly区别
  20. 【Windows】Window中的常用快捷键

热门文章

  1. 非阻塞connect的作用及代码示例
  2. C++11 chrono库
  3. 排序算法之九 基数排序(C++版本)
  4. linux磁盘健康监控,MegaCli监控RAID磁盘健康信息
  5. ipad连接电脑显示不在充电_笔记本电脑和投影仪连接后为什么投影仪不能显示电脑内容?...
  6. zk和redis分布式锁比较
  7. IDEA中单元测试使用Scanner控制台无法输入
  8. c语言自动化课题设计,自动化专业C语言程序设计课堂教学方案设计和实践.doc
  9. java filter param_Java过滤器Filter使用详解
  10. nginx fastcgi python_Nginx+FastCGI+Python