均值滤波使用像素点周围一定区域的像素的均值替换当前像素点的值。均值滤波可以平滑图像,但是对噪声几乎没有效果,最多只能让噪点变得更模糊。
如果图片中某一块像素的数值如下,取扫描窗口大小为3:
120 130 134
122 123 122
125 146 124
则使用均值滤波后中间像素点的值替换为 (120+130+134+122+123+122+125+146+124) / 9=1146 / 9 = 127
均值滤波的C语言实现为:
void meanBlur(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 = offset; i < img.cols - offset; i++) {
for (int k = offset; k < img.rows - offset; k++) {
//获取周围的元素
int count = 0;
for (int n = i - offset; n < i + offset + 1; n++) {
for (int m = k - offset; m < k + offset + 1; m++) {
window[count] = int(img.at<uchar>(m, n));
count++;
}
}
//求和
int sum = 0;
for (int n = 0; n < count; n++) {
sum += window[n];
}
dst.at<uchar>(k, i) = sum / (ksize*ksize);
}
}
delete[] window;
}