C++ 实现一阶高斯滤波
项目介绍
高斯滤波是信号处理和图像处理中常用的一种滤波方法,其作用是通过一个高斯函数来平滑数据或图像。高斯滤波可以减少信号中的噪声,并且由于其平滑特性,广泛应用于图像模糊、信号降噪等领域。
在一维情况下,高斯滤波器可以通过卷积操作将信号与高斯函数进行卷积。对于一阶高斯滤波,它实际上是对信号进行平滑处理,利用高斯函数的参数(如均值和标准差)来计算滤波器的权重。
本项目将实现一个简单的一阶高斯滤波器,该滤波器通过高斯函数的权重对输入信号进行加权平均,从而去除信号中的噪声。
项目实现思路
-
高斯函数:
- 高斯函数的公式为:
其中,σ 为标准差,控制高斯函数的宽度。
- 高斯函数的公式为:
-
滤波过程:
- 将输入信号与高斯核进行卷积处理。对于每个信号点,计算其周围点的加权平均值,权重由高斯核给出。
-
实现步骤:
- 计算高斯核:根据给定的标准差 σ 计算高斯核。
- 滤波操作:将高斯核与输入信号进行卷积,得到平滑后的信号。
C++ 代码实现
#include <iostream>
#include <vector>
#include <cmath>
// 计算高斯核
std::vector<double> computeGaussianKernel(int size, double sigma) {
std::vector<double> kernel(size);
int halfSize = size / 2;
double sum = 0.0;
for (int i = 0; i < size; ++i) {
int x = i - halfSize;
kernel[i] = (1.0 / (std::sqrt(2 * M_PI) * sigma)) * std::exp(-(x * x) / (2 * sigma * sigma));
sum += kernel[i];
}
// 归一化
for (int i = 0; i < size; ++i) {
kernel[i] /= sum;
}
return kernel;
}
// 一阶高斯滤波
std::vector<double> applyGaussianFilter(const std::vector<double>& input, double sigma) {
int size = static_cast<int>(6 * sigma); // 通常选择 6*sigma 为核的大小
if (size % 2 == 0) size++; // 确保大小为奇数
std::vector<double> kernel = computeGaussianKernel(size, sigma);
int halfSize = size / 2;
std::vector<double> output(input.size(), 0.0);
// 卷积操作
for (int i = 0; i < input.size(); ++i) {
double sum = 0.0;
for (int j = -halfSize; j <= halfSize; ++j) {
int index = i + j;
if (index >= 0 && index < input.size()) {
sum += input[index] * kernel[j + halfSize];
}
}
output[i] = sum;
}
return output;
}
int main() {
// 输入信号
std::vector<double> input = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
// 设置高斯滤波器的标准差
double sigma = 1.0;
// 应用高斯滤波
std::vector<double> output = applyGaussianFilter(input, sigma);
// 输出结果
std::cout << "Input signal: ";
for (double val : input) {
std::cout << val << " ";
}
std::cout << std::endl;
std::cout << "Filtered signal: ";
for (double val : output) {
std::cout << val << " ";
}
std::cout << std::endl;
return 0;
}
代码解释
-
computeGaussianKernel(int size, double sigma)
:- 该函数用于计算高斯核。根据给定的核大小和标准差 σ\sigmaσ,它生成一个高斯函数权重的数组,并且通过归一化处理,确保权重和为 1。
size
是核的大小,通常选择 6×σ6 \times \sigma6×σ,确保高斯核的支持区域足够宽,包含了大部分的权重。
-
applyGaussianFilter(const std::vector<double>& input, double sigma)
:- 该函数用于对输入信号应用高斯滤波。首先调用
computeGaussianKernel
计算高斯核,然后通过卷积操作将核与信号进行加权平均,生成平滑后的输出信号。
- 该函数用于对输入信号应用高斯滤波。首先调用
-
main()
:- 在
main
函数中,我们创建了一个示例信号input
,设置标准差sigma
,然后调用applyGaussianFilter
对信号进行滤波,最后输出滤波前后的信号。
- 在
输出示例
Input signal: 1 2 3 4 5 6 7 8 9 10
Filtered signal: 2.52768 3.17507 3.6998 4.01625 4.14969 4.12627 3.96388 3.68866 3.32825 2.89847
项目总结
本项目实现了一阶高斯滤波器,使用高斯函数的权重对输入信号进行平滑处理。通过卷积操作,信号中的噪声得到了有效的抑制,结果是信号的平滑版本。
该方法的优点是平滑效果较好,尤其适合处理带有随机噪声的信号,且高斯函数的平滑特性使得滤波效果自然,避免了过度平滑或锐化的现象。高斯滤波广泛应用于图像处理、信号降噪等领域。
可以根据实际需求调整 sigma
参数来控制滤波器的平滑程度,或者调整滤波核的大小。