C++实现一维数组的高斯滤波

C++实现一维数组的高斯滤波(Gaussian Filter)

高斯滤波(Gaussian filter)实质上是一种信号的滤波器,其用途为信号的平滑处理。对一个数进行高斯滤波(模糊)可以理解成将该数取附近矩形窗口所有值的加权平均值,距离处理数越近的点权重越大,距离处理点越远的点权重越小。因此如果取的矩形窗口越大,那么对处理点的模糊效果越强烈。因为数值和图像都是连续的,越靠近待处理点的点关系越密切,越远离待处理点的点关系越疏远,直接使用简单平均是不合理的,用加权平均更合理,即距离越近的点权重越大,距离越远的点权重越小。之所以把这种滤波方式叫做高斯滤波,是因为权重值是由高斯函数决定。
一维高斯分布函数:
G ( x ) = 1 2 π σ e − x 2 2 σ 2 G(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^2}{2\sigma^2}} G(x)=2π σ1e2σ2x2

C++完整代码为:

#include<iostream>
#include <iomanip>
#include<math.h>

using namespace std;

int main() 
{
	int i = 0, j = 0;
	double temp = 0.0;
	double data[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
	11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
	double data_temp[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
	11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
	int size = sizeof(data)/sizeof(data[0]);
	
	int len = 3; 
	double sigma = 1;
	// 计算高斯核
	double* kernel = new double[len];
	int halfSize = len / 2; 
	double sum = 0.0; 
	for (i = -halfSize; i <= halfSize; ++i) 
	{
		double x = i; 
		double value = exp(-(x * x) / (2 * sigma * sigma)) / (sqrt(2 * PAI) * sigma);
		kernel[i + halfSize] = value;
		sum += value;
	}

	for(i=0; i<len; i++) // 归一化权重
		kernel[i] /= sum;

	// 滤波 
	//	for (i=(len-1)/2; i<(size-(len-1)/2); i++)
	for(i=0; i<size; ++i)
	{
		sum = 0.0;
		for(j=-halfSize; j<=halfSize; ++j)
		{
			int idx = i+j;
			if(idx >= 0 && idx < size)
				sum += data_temp[idx] * kernel[j+halfSize];
		}
		data[i] = sum;
	}
	
	for(i=0; i<size; i++)
		cout << data[i] << endl;
	return 0; 
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值