中值滤波C语言实现
时间: 2023-08-20 09:11:26 浏览: 182
中值滤波是一种常用的数字图像处理方法,可以用于去除图像中的噪声。下面是中值滤波的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 中值滤波函数
void median_filter(int *input, int *output, int width, int height, int size) {
int i, j, m, n, k;
int *mask = (int*)malloc(sizeof(int) * size * size);
int temp;
// 对于边缘像素,不做处理
for (i = 0; i < width; i++) {
for (j = 0; j < height; j++) {
if (i < size / 2 || i >= width - size / 2 || j < size / 2 || j >= height - size / 2) {
output[i * height + j] = input[i * height + j];
}
else {
// 生成掩模
k = 0;
for (m = 0; m < size; m++) {
for (n = 0; n < size; n++) {
mask[k++] = input[(i + m - size / 2) * height + (j + n - size / 2)];
}
}
// 排序
for (m = 0; m < size * size - 1; m++) {
for (n = m + 1; n < size * size; n++) {
if (mask[m] > mask[n]) {
temp = mask[m];
mask[m] = mask[n];
mask[n] = temp;
}
}
}
// 取中值
output[i * height + j] = mask[size * size / 2];
}
}
}
free(mask);
}
// 测试函数
int main() {
int input[5][5] = {
{10, 20, 30, 20, 10},
{20, 30, 40, 30, 20},
{30, 40, 50, 40, 30},
{20, 30, 40, 30, 20},
{10, 20, 30, 20, 10}
};
int output[5][5];
median_filter((int*)input, (int*)output, 5, 5, 3);
int i, j;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", output[i][j]);
}
printf("\n");
}
return 0;
}
```
在上面的代码中,我们使用了一个大小为size*size的掩模,对于每个像素,我们将其周围的像素值放入掩模中,并进行排序,最后取中值作为该像素的新值。需要注意的是,对于边缘像素,由于其周围的像素值无法凑齐size*size个,因此不做处理。
阅读全文