高斯滤波及高斯卷积核C++实现

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

高斯滤波的过程其实就是对整幅图像进行加权平均操作的过程。滤波后图像上每一个像素的灰度值大小,由其本身和邻域内的其他像素共同决定。具体实现是:用一个大小为(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的数组内:



  • 15
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
高斯滤波是一种图像处理算法,可以平滑图像并减少噪声。它基于高斯函数,通过对图像中每个像素及其周围像素的加权平均值进行计算来实现。 以下是基于C语言实现高斯滤波的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX_IMAGE_WIDTH 1024 #define MAX_IMAGE_HEIGHT 1024 int image[MAX_IMAGE_HEIGHT][MAX_IMAGE_WIDTH]; // 图像数组 float gaussianKernel[5][5] = { // 高斯 {0.003, 0.013, 0.022, 0.013, 0.003}, {0.013, 0.059, 0.097, 0.059, 0.013}, {0.022, 0.097, 0.159, 0.097, 0.022}, {0.013, 0.059, 0.097, 0.059, 0.013}, {0.003, 0.013, 0.022, 0.013, 0.003} }; int Clamp(int value, int min, int max) { // 限制像素值在最大值和最小值之间 if(value < min) { return min; } else if(value > max) { return max; } else { return value; } } int main() { int imageWidth; int imageHeight; int row, col, i, j; int sum; int kernelSize = 5; // 高斯大小 // 读取图像 FILE* fp = fopen("input.raw", "rb"); fread(&imageWidth, sizeof(int), 1, fp); fread(&imageHeight, sizeof(int), 1, fp); fread(image, sizeof(int), imageWidth*imageHeight, fp); fclose(fp); // 对每个像素应用高斯滤波 for(row = 0; row < imageHeight; row++) { for(col = 0; col < imageWidth; col++) { sum = 0; for(i = -kernelSize/2; i <= kernelSize/2; i++) { for(j = -kernelSize/2; j <= kernelSize/2; j++) { sum += (int)(gaussianKernel[i+kernelSize/2][j+kernelSize/2] * (float)image[Clamp(row+i, 0, imageHeight-1)][Clamp(col+j, 0, imageWidth-1)]); } } image[row][col] = sum; } } // 保存图像 fp = fopen("output.raw", "wb"); fwrite(&imageWidth, sizeof(int), 1, fp); fwrite(&imageHeight, sizeof(int), 1, fp); fwrite(image, sizeof(int), imageWidth*imageHeight, fp); fclose(fp); return 0; } ``` 该代码会读取名为“input.raw”的原始图像,并将处理后的图像保存到名为“output.raw”的文件中。注意,该代码仅支持灰度图像,如果您要处理彩色图像,则需要将其转换为灰度图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值