### OpenCV 中的滤波函数实现图像滤波
#### 1. **均值滤波 (boxFilter 和 blur)**
均值滤波通过计算邻域像素的平均值来平滑图像,从而减少噪声。`cv.boxFilter()` 是一种灵活的方式,可以指定是否标准化核矩阵。
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("image.jpg", IMREAD_GRAYSCALE);
if (src.empty()) return -1;
Mat dst_box, dst_blur;
// 使用 boxFilter 进行均值滤波
boxFilter(src, dst_box, src.depth(), Size(5, 5), Point(-1, -1), true); // normalized=true 表示标准均值滤波[^1]
// 使用 blur 函数进行均值滤波
blur(src, dst_blur, Size(5, 5));
imshow("Original Image", src);
imshow("Box Filter Result", dst_box);
imshow("Blur Function Result", dst_blur);
waitKey(0);
return 0;
}
```
---
#### 2. **中值滤波 (medianBlur)**
中值滤波是一种非线性滤波方法,适用于去除椒盐噪声而不模糊边缘细节。
```cpp
Mat dst_median;
// ksize 必须为正奇数
medianBlur(src, dst_median, 5);
imshow("Median Blur Result", dst_median);
```
此代码片段展示了如何利用 `medianBlur` 对输入图像应用中值滤波。
---
#### 3. **高斯滤波 (GaussianBlur)**
高斯滤波通过对图像施加权重更高的中心像素和逐渐减小的周围像素来进行平滑处理。
```cpp
Mat dst_gauss;
GaussianBlur(src, dst_gauss, Size(5, 5), 1.5); // 高斯核大小为 5x5,sigmaX=1.5
imshow("Gaussian Blur Result", dst_gauss);
```
上述代码实现了基于高斯分布的卷积核对图像进行平滑的操作[^2]。
---
#### 4. **双边滤波 (bilateralFilter)**
双边滤波不仅考虑空间距离还考虑颜色差异,因此可以在保留边界的同时去噪。
```cpp
Mat dst_bilat;
bilateralFilter(src, dst_bilat, 9, 75, 75); // d=9, sigmaColor=75, sigmaSpace=75
imshow("Bilateral Filter Result", dst_bilat);
```
这段代码说明了如何使用 `bilateralFilter` 来执行既保护边缘又消除噪声的任务[^3]。
---
#### 5. **平方盒滤波 (sqrBoxFilter)**
`sqrBoxFilter` 计算给定区域内的平方和并存储到目标图像中,通常用于后续统计分析。
```cpp
Mat dst_sqr;
sqrBoxFilter(src, dst_sqr, CV_32F, Size(5, 5)); // 结果类型设置为浮点型
normalize(dst_sqr, dst_sqr, 0, 255, NORM_MINMAX, CV_8U); // 归一化以便可视化
imshow("Square Box Filter Result", dst_sqr);
```
这里解释了如何调用 `sqrBoxFilter` 并将其结果转换回可显示的形式。
---
### 总结
以上介绍了五种常见的图像滤波技术及其对应的 OpenCV 实现方式。每种方法都有其特定的应用场景:均值滤波适合一般降噪;中值滤波擅长去除脉冲噪声;高斯滤波提供自然过渡的效果;双边滤波兼顾边界的清晰度;而平方盒滤波则更多应用于高级统计运算之中[^4]。