使用c语言实现图像中值滤波,图像处理之中值滤波介绍及C实现
时间: 2024-01-06 18:07:14 浏览: 81
中值滤波是一种常用的图像处理方法,可以用于去除图像中的噪声。在中值滤波中,将图像中每个像素的灰度值替换为该像素周围邻域(如3x3、5x5等)像素灰度值的中值。这种方法可以有效地去除噪声,同时保留图像的边缘和细节信息。
下面是使用C语言实现中值滤波的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 3 // 邻域大小
// 计算邻域中的中值
int median(int arr[N*N]) {
int i, j, temp;
for(i = 0; i < N*N - 1; i++) {
for(j = i+1; j < N*N; j++) {
if(arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr[N*N/2];
}
// 中值滤波函数
void median_filter(unsigned char* img, int width, int height) {
int i, j, k, l, m, n, index;
unsigned char* tmp = (unsigned char*)malloc(width*height*sizeof(unsigned char));
int arr[N*N];
for(i = N/2; i < height-N/2; i++) {
for(j = N/2; j < width-N/2; j++) {
index = 0;
for(m = -N/2; m <= N/2; m++) {
for(n = -N/2; n <= N/2; n++) {
arr[index++] = img[(i+m)*width+(j+n)];
}
}
tmp[i*width+j] = median(arr);
}
}
for(i = 0; i < height; i++) {
for(j = 0; j < width; j++) {
img[i*width+j] = tmp[i*width+j];
}
}
free(tmp);
}
// 主函数
int main() {
int i, j;
int width = 5, height = 5;
unsigned char img[5*5] = {
255, 0, 255, 0, 255,
0, 255, 0, 255, 0,
255, 0, 255, 0, 255,
0, 255, 0, 255, 0,
255, 0, 255, 0, 255
};
printf("原图像:\n");
for(i = 0; i < height; i++) {
for(j = 0; j < width; j++) {
printf("%d ", img[i*width+j]);
}
printf("\n");
}
median_filter(img, width, height);
printf("中值滤波后的图像:\n");
for(i = 0; i < height; i++) {
for(j = 0; j < width; j++) {
printf("%d ", img[i*width+j]);
}
printf("\n");
}
return 0;
}
```
在上述代码中,我们先定义了邻域大小N为3,然后实现了一个计算邻域中的中值的函数median,接着实现了中值滤波函数median_filter,最后在主函数中测试了中值滤波的效果。
阅读全文