圖像去噪極簡教程(2)——中值濾波

中值濾波使用當前像素點和它周圍的8個像素點的中值來代替當前點額像素點,這個辦法對去除椒鹽噪聲非常有效。

如果圖片中某一塊像素的數值如下:
120 130 134
122 123 122
125 146 124

9個數值排序後爲:120 122 122 123 124 125 130 134 146
所以使用中值濾波後中間的像素點會替換爲 124

中值濾波的 C語言實現:

void medianBlur(Mat img, Mat dst, int ksize) {
    //ksize必須爲奇數
    if (ksize % 2 == 0 && (ksize - 1) / 2 - 1 < img.cols && (ksize - 1) / 2 - 1 < img.rows) {
        return;
    }

    //邊到中心點的距離
    int offset = (ksize - 1) / 2;
    int* window = new int[ksize * ksize];
    for (int i = 0; i < img.cols; i++) {
        for (int k = 0; k < img.rows; k++) {
            //獲取周圍的元素
            int count = 0;
            for (int n = i - offset; n < i + offset + 1; n++) {
                if (n < 0 || n >= img.cols) {
                    continue;
                }

                for (int m = k - offset; m < k + offset + 1; m++) {
                    if (m < 0 || m >= img.rows) {
                        continue;
                    }

                    window[count] = int(img.at<uchar>(m, n));
                    count++;
                }
            }
            //排序
            for (int n = 0; n < count - 1; n++) {
                for (int m = n + 1; m < count; m++) {
                    if (window[m] < window[n]) {
                        int t = window[m];
                        window[m] = window[n];
                        window[n] = t;
                    }
                }
            }

            dst.at<uchar>(k, i) = window[count / 2];
        }
    }

    delete[] window;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章