c++实现一阶高斯滤波(附带源码)

C++ 实现一阶高斯滤波

项目介绍

高斯滤波是信号处理和图像处理中常用的一种滤波方法,其作用是通过一个高斯函数来平滑数据或图像。高斯滤波可以减少信号中的噪声,并且由于其平滑特性,广泛应用于图像模糊、信号降噪等领域。

在一维情况下,高斯滤波器可以通过卷积操作将信号与高斯函数进行卷积。对于一阶高斯滤波,它实际上是对信号进行平滑处理,利用高斯函数的参数(如均值和标准差)来计算滤波器的权重。

本项目将实现一个简单的一阶高斯滤波器,该滤波器通过高斯函数的权重对输入信号进行加权平均,从而去除信号中的噪声。


项目实现思路

  1. 高斯函数

    • 高斯函数的公式为: 其中,σ 为标准差,控制高斯函数的宽度。
  2. 滤波过程

    • 将输入信号与高斯核进行卷积处理。对于每个信号点,计算其周围点的加权平均值,权重由高斯核给出。
  3. 实现步骤

    • 计算高斯核:根据给定的标准差 σ 计算高斯核。
    • 滤波操作:将高斯核与输入信号进行卷积,得到平滑后的信号。

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;
}

代码解释

  1. computeGaussianKernel(int size, double sigma)

    • 该函数用于计算高斯核。根据给定的核大小和标准差 σ\sigmaσ,它生成一个高斯函数权重的数组,并且通过归一化处理,确保权重和为 1。
    • size 是核的大小,通常选择 6×σ6 \times \sigma6×σ,确保高斯核的支持区域足够宽,包含了大部分的权重。
  2. applyGaussianFilter(const std::vector<double>& input, double sigma)

    • 该函数用于对输入信号应用高斯滤波。首先调用 computeGaussianKernel 计算高斯核,然后通过卷积操作将核与信号进行加权平均,生成平滑后的输出信号。
  3. 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 参数来控制滤波器的平滑程度,或者调整滤波核的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值