上次提到产生高斯噪声的算法,我们知道,椒盐噪声是可以通过中值滤波来修复的,高斯噪声也可以通过均值滤波来还原。
顾名思义,均值滤波也是构建一个 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 ----- */