图像的中值滤波(Median Filtering)是一种非线性数字滤波技术,常用于图像处理以减少噪声,同时保留图像边缘细节。其基本思想是用图像中某个窗口内像素的中值替代该窗口中心像素的值。具体步骤如下:
-
选择窗口:定义一个窗口(也称为滤波器或核),通常为3x3、5x5或7x7的方形矩阵。窗口的大小可以根据需要调整。
-
移动窗口:将窗口滑动到图像中的每一个像素点,使得每次窗口覆盖一个像素和其周围的像素。
-
排序并取中值:对于窗口内的所有像素值进行排序,然后选择排序后的中值。这一步是中值滤波的核心。
-
替换中心像素:用排序后的中值替代窗口中心像素的值。
-
重复:对图像中的每一个像素重复上述步骤,直到整个图像都经过滤波处理。
示例
假设有一个3x3的窗口,中心像素值为125,周围像素值如下:
[100, 102, 104]
[120, 125, 130]
[135, 140, 150]
- 排序 :将窗口内的所有像素值排序得到:
[100, 102, 104, 120, 125, 130, 135, 140, 150]
- 取中值:排序后的中值是125
- 替换中心像素:将中心像素值(125)替换为中值(125)
优点
- 噪声抑制:中值滤波对抑制椒盐噪声(salt-and-pepper noise)特别有效。
- 保留边缘:相比于均值滤波,中值滤波更能保留图像的边缘细节,不会模糊图像的边缘。
缺点
- 计算复杂度较高:中值滤波需要对窗口内的像素值进行排序,计算量较大。
- 边界处理:在处理图像边缘像素时,窗口可能超出图像范围,需要特殊处理,如填充边界。
中值滤波是一种常用的图像处理技术,广泛应用于去噪声、图像增强等领域。
下面是使用OpenCV实现中值滤波的C++代码:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat src = cv::imread("image.jpg", cv::IMREAD_COLOR);
if (src.empty()) {
std::cerr << "无法读取图像文件!" << std::endl;
return -1;
}
// 应用中值滤波
cv::Mat dst;
int kernel_size = 5; // 滤波器大小
cv::medianBlur(src, dst, kernel_size);
// 显示结果
cv::imshow("原始图像", src);
cv::imshow("中值滤波后的图像", dst);
cv::waitKey(0);
// 保存结果图像
cv::imwrite("median_filtered.jpg", dst);
return 0;
}
使用OpenCV和MATLAB实现中值滤波的代码见本博文原文,链接:
https://www.hhai.cc/thread-247-1-1.html