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