上次提到产生高斯噪声的算法,我们知道,椒盐噪声是可以通过中值滤波来修复的,高斯噪声也可以通过均值滤波来还原。

顾名思义,均值滤波也是构建一个 n*n 的模板,然后取其平均值来替代模板中间的值。这样做出的效果明显不如用中值滤波修复椒盐噪声的效果好,不过当 n 取很大值的时候,图片看起来像是高斯模糊,不知道是不是一个原理……

看效果,n=3 时:

n=11 时:

算法更加简单,有以前的基础不成问题:

BmpPixmap & BmpPixmap::mean_filter (int n)
{
    assert (n >= 3 && n % 2);int ii, jj, nn, sum [3];
    BmpPixmap *temp = new BmpPixmap (*this);
    for (i = n / 2; i < height - n / 2; i++) {
        for (j = n / 2; j < width - n / 2; j++) {
            for (nn = 0; nn < 3; nn++) {
                sum [nn] = 0;
            }
            /*-----------------------------------------------------------------------------
             *  Calculate the average of the model.
             *-----------------------------------------------------------------------------*/
            for (ii = i - n / 2, nn = 0; ii <= i + n / 2; ii++) {
                for (jj = j - n / 2; jj <= j + n / 2; jj++, nn++) {
                    sum [0] += pdata [ii][jj]->get_blue ();
                    sum [1] += pdata [ii][jj]->get_green ();
                    sum [2] += pdata [ii][jj]->get_red ();
                }
            }
            temp->pdata [i][j]->set (sum [0] / (n * n), sum [1] / (n * n), sum [2] / (n * n));
        }
    }
    return *temp;
}  /* -----  end of method BmpPixmap::mean_filter  ----- */

评论