完整教程:C++高斯滤波GaussianBlur函数用法(附带源码)

一、函数背景与原理介绍

1.1 什么是高斯滤波(Gaussian Blur)

高斯滤波(Gaussian Filtering) 是一种常用的图像平滑方法,用于去除噪声、减少图像细节、突出主要结构。


1.2 高斯滤波的作用

功能说明
去除高频噪声平滑图像,抑制噪声点
降低细节复杂度模糊细节,为边缘检测做预处理
提高鲁棒性在边缘检测(如 Canny)前常使用
特征提取前预处理保留低频信息,去除细小纹理

二、函数定义与语法结构

在 OpenCV(C++)中,高斯滤波函数定义如下:

void cv::GaussianBlur(
    InputArray src,       // 输入图像
    OutputArray dst,      // 输出图像
    Size ksize,           // 高斯核大小(奇数,如 Size(3,3)、Size(5,5))
    double sigmaX,        // X方向标准差
    double sigmaY = 0,    // Y方向标准差(默认与sigmaX相同)
    int borderType = BORDER_DEFAULT // 边界处理方式
);


三、主要参数详细解释

参数名类型说明
srcInputArray输入图像(8位或32位,单通道或三通道均可)
dstOutputArray输出图像,与输入大小相同
ksizecv::Size滤波核大小,必须为奇数(例如 3x3, 5x5)
sigmaXdoubleX方向高斯分布标准差(控制模糊程度)
sigmaYdoubleY方向标准差(若为0,则等于 sigmaX)
borderTypeint边界扩展模式,常用:BORDER_DEFAULTBORDER_REPLICATEBORDER_REFLECT

四、使用示例与效果展示

/*******************************************************************************************
 * 文件名 : gaussian_blur_demo.cpp
 * 功能   : 演示 OpenCV 中 GaussianBlur 函数的使用方法
 * 编译   : g++ gaussian_blur_demo.cpp -o gaussian_blur_demo `pkg-config --cflags --libs opencv4`
 *******************************************************************************************/
#include 
#include 
using namespace cv;
using namespace std;
int main() {
    // 1. 读取原始图像
    Mat src = imread("test.jpg");
    if (src.empty()) {
        cerr << "图像加载失败!" << endl;
        return -1;
    }
    // 2. 创建输出图像
    Mat dst1, dst2, dst3;
    // 3. 不同参数下的高斯滤波
    GaussianBlur(src, dst1, Size(3, 3), 0, 0);
    GaussianBlur(src, dst2, Size(5, 5), 1.0);
    GaussianBlur(src, dst3, Size(9, 9), 2.5);
    // 4. 显示结果
    imshow("原图", src);
    imshow("高斯滤波 3x3", dst1);
    imshow("高斯滤波 5x5, σ=1.0", dst2);
    imshow("高斯滤波 9x9, σ=2.5", dst3);
    waitKey(0);
    return 0;
}

五、代码功能解读

代码段功能说明
GaussianBlur(src, dst1, Size(3, 3), 0, 0);使用默认标准差的3×3滤波核进行轻微模糊
GaussianBlur(src, dst2, Size(5, 5), 1.0);明确指定σ=1.0,适度平滑
GaussianBlur(src, dst3, Size(9, 9), 2.5);核大且σ大,图像更模糊
imshow()显示不同滤波结果

六、核大小(ksize)与σ(sigma)的关系

若你不指定 σ,OpenCV 会自动根据核大小推算:

σ=0.3×((ksize−1)2−1)+0.8\sigma = 0.3 \times \left( \frac{(ksize-1)}{2} - 1 \right) + 0.8σ=0.3×(2(ksize−1)​−1)+0.8

核大小自动σ近似值模糊程度
3×3≈ 0.8轻微
5×5≈ 1.2适中
9×9≈ 2.0强模糊

七、与其他平滑方法对比

方法OpenCV函数特点
均值滤波blur()简单平均,边缘不保留
中值滤波medianBlur()去除椒盐噪声,保留边缘
高斯滤波GaussianBlur()平滑自然,边缘损失较少
双边滤波bilateralFilter()保留边缘同时平滑噪声,计算量大

八、常见问题与解决方案

❓1. 为什么图像边缘会变暗或模糊不均?
✅ 原因:边界扩展方式不合适。
解决:可改为 BORDER_REFLECTBORDER_REPLICATE

GaussianBlur(src, dst, Size(5,5), 1.0, 1.0, BORDER_REFLECT);


❓2. 结果图像灰度变暗?
✅ 原因:原图为单通道,显示时未进行归一化。
解决:确保输入类型正确或归一化:

normalize(dst, dst, 0, 255, NORM_MINMAX);


❓3. 滤波结果过于模糊?
✅ 原因:σ 或 核太大。
解决:减小 sigmaXksize,如:

GaussianBlur(src, dst, Size(3,3), 0.5);

posted @ 2025-11-30 14:09  yangykaifa  阅读(0)  评论(0)    收藏  举报