高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,在图像处理的降噪、平滑中应用较多,特别是对抑制或消除服从正态分布的噪声非常有效。

高斯滤波的过程其实就是对整幅图像进行加权平均操作的过程。滤波后图像上每一个像素的灰度值大小,由其本身和邻域内的其他像素共同决定。具体实现是:用一个大小为(2*N+1)的模板(或称卷积核、掩模)依次扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度替代模板中心像素点的灰度值。

一维、二维高斯分布


一维高斯函数表述为:

对应图形:

二维高斯函数表述为:

对应图形:

一些重要特性说明:

1. 一维二维高斯函数中μ是服从正态分布的随机变量的均值,称为期望或均值影响正态分布的位置,实际的图像处理应用中一般取μ=0;σ是标准差,σ^2是随机变量的方差,σ定义了正态分布数据的离散程度,σ越大,数据分布越分散,σ越小,数据分布越集中。

在图形或滤波效果上表现为:σ越大,曲线越扁平,高斯滤波器的频带就越宽,平滑程度就越好,σ越小,曲线越瘦高,高斯滤波的频带就越窄,平滑程度也越弱;

2. 二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向;

3. 高斯函数是单值函数。这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的。这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真;

4.  相同条件下,高斯卷积核的尺寸越大,图像的平滑效果越好,表现为图像越模糊,同时图像细节丢失的越多;尺寸越小,平滑效果越弱,图像细节丢失越少;

以下对比一下不同大小标准差σ(Sigma)对图像平滑的影响:

原图:

卷积核尺寸5*5,σ=0.1:

卷积核尺寸5*5,σ=1:

对比可以看到,Sigma(σ)越大,平滑效果越明显。

C++对高斯卷积核参数求解:

#include "iostream"
#include "math.h" using namespace std;
using namespace cv; //******************高斯卷积核生成函数*************************
//第一个参数gaus是一个指向含有3个double类型数组的指针;
//第二个参数size是高斯卷积核的尺寸大小;
//第三个参数sigma是卷积核的标准差
//*************************************************************
void GetGaussianKernel(double **gaus, const int size,const double sigma); int main(int argc,char *argv[])
{
int size=5; //定义卷积核大小
double **gaus=new double *[size];
for(int i=0;i<size;i++)
{
gaus[i]=new double[size]; //动态生成矩阵
}
cout<<"尺寸 = 3*3,Sigma = 1,高斯卷积核参数为:"<<endl;
GetGaussianKernel(gaus,3,1); //生成3*3 大小高斯卷积核,Sigma=1;
cout<<"尺寸 = 5*5,Sigma = 10,高斯卷积核参数为:"<<endl;
GetGaussianKernel(gaus,5,10); //生成5*5 大小高斯卷积核,Sigma=1;
system("pause");
return 0;
} //******************高斯卷积核生成函数*************************
void GetGaussianKernel(double **gaus, const int size,const double sigma)
{
const double PI=4.0*atan(1.0); //圆周率π赋值
int center=size/2;
double sum=0;
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
gaus[i][j]=(1/(2*PI*sigma*sigma))*exp(-((i-center)*(i-center)+(j-center)*(j-center))/(2*sigma*sigma));
sum+=gaus[i][j];
}
} for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
gaus[i][j]/=sum;
cout<<gaus[i][j]<<" ";
}
cout<<endl<<endl;
}
return ;
}

求得的高斯卷积核参数存放在一个大小为N*N的数组内:

高斯滤波及高斯卷积核C++实现的更多相关文章

  1. SIFT四部曲之——高斯滤波

    本文为原创作品,未经本人同意,禁止转载 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 或 ...

  2. matlab做gaussian高斯滤波

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

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

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

  4. 图像处理之基础---滤波器之高斯低通滤波器的高斯模板生成c实现

    ()代码实现 对原图进行高斯平滑,去除图像中的计算噪声void Bmp::MakeGauss(double sigma,double **pdKernel,int *pnWindowSize){ // ...

  5. opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)

    图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...

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

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

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

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

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

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

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

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

随机推荐

  1. Tool-DB:Navicat

    ylbtech-Tool-DB:Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小企业的 ...

  2. linux压缩(解压缩)命令详解

    一.tar命令          tar可以为文件和目录创建档案.利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar 最初被用来在磁带上创 ...

  3. KCP kcptun

    简介 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果.纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者 ...

  4. 格式化日期字符串 FormatSettings使用

    如果 你想要得到 YYYY-MM/DD 这样的字符串 你肯定说这太简单了  直接 ShowMessage(FormatDateTime('YYYY-MM/DD',now)); 运行结果 YYYY-MM ...

  5. struts2学习之基础笔记4

    拦截器 1.自定义拦截器类,必须继承AbstractInterceptor类(抽象类) 重写public String intercept (ActionInvocation arg0) 2.在Str ...

  6. 洛谷P4016 负载平衡问题(最小费用最大流)

    题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...

  7. EXCEL 表格保护破解

    'Alt + F11 进入vb编辑器,插入代码,然后在宏查看器里执行,大概等1-2分钟,完成.   Public Sub AllInternalPasswords() ' Breaks workshe ...

  8. SpringMVC视频

    视频内容: 1.下载spring mvc以及spring mvc示例演示http://pan.baidu.com/s/1kTHRfDH 2.配置完善&初步探究控制器拦截http://pan.b ...

  9. Win10 build package error collections

    1. 打包Released的时候出现问题意思是说 本地项目,类里有这个Visibility属性不能进行序列化 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 error CS0029: 无法将 ...

  10. 腾讯测试工程师:你以为会打LOL就能做测试了?

    周日参加完公司团建,回家路上拼到一个IT界的老司机,他和几个朋友组件团队承接开发项目,知道我是做测试的,问了我一个问题: “你们大公司的测试都做什么?” “测试应该不好模仿吧?” 刚开始我也不清楚他的 ...