完整教程: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 // 边界处理方式
);
三、主要参数详细解释
| 参数名 | 类型 | 说明 |
|---|---|---|
src | InputArray | 输入图像(8位或32位,单通道或三通道均可) |
dst | OutputArray | 输出图像,与输入大小相同 |
ksize | cv::Size | 滤波核大小,必须为奇数(例如 3x3, 5x5) |
sigmaX | double | X方向高斯分布标准差(控制模糊程度) |
sigmaY | double | Y方向标准差(若为0,则等于 sigmaX) |
borderType | int | 边界扩展模式,常用:BORDER_DEFAULT、BORDER_REPLICATE、BORDER_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_REFLECT 或 BORDER_REPLICATE:
GaussianBlur(src, dst, Size(5,5), 1.0, 1.0, BORDER_REFLECT);
❓2. 结果图像灰度变暗?
✅ 原因:原图为单通道,显示时未进行归一化。
解决:确保输入类型正确或归一化:
normalize(dst, dst, 0, 255, NORM_MINMAX);
❓3. 滤波结果过于模糊?
✅ 原因:σ 或 核太大。
解决:减小 sigmaX 或 ksize,如:
GaussianBlur(src, dst, Size(3,3), 0.5);

浙公网安备 33010602011771号