圖像的中值濾波(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++代碼:
#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