中值滤波

作者: 渔父歌 | 来源:发表于2019-04-11 23:30 被阅读0次

    中值滤波使用当前像素点和它周围的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;
    }
    

    相关文章

      网友评论

        本文标题:中值滤波

        本文链接:https://www.haomeiwen.com/subject/qemfwqtx.html