用C语言怎么对图像进行中值滤波
时间: 2023-09-10 14:06:15 浏览: 207
中值滤波是一种常用的图像处理方法,可以去除图像中的噪声。下面是用C语言实现中值滤波的代码:
1. 定义一个函数,输入参数为原始图像数据、图像宽度、图像高度和滤波器大小。
2. 在函数内部,先定义一个新的数组,大小为原始图像数据大小加上滤波器大小。
3. 将原始图像数据复制到新数组中,并在新数组两端分别复制一份原始数据,以处理边缘部分。
4. 对于每个像素,以它为中心,取出滤波器大小范围内的所有像素值,将它们排序,取中间值作为该像素的新值。
5. 将所有像素的新值存入一个输出数组中。
6. 返回输出数组即为中值滤波后的图像数据。
下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
void median_filter(unsigned char* in_data, unsigned char* out_data, int width, int height, int filter_size) {
int size = filter_size / 2;
int new_width = width + 2 * size;
int new_height = height + 2 * size;
// 申请新的数组,存放复制后的原始数据
unsigned char* new_data = (unsigned char*) malloc(new_width * new_height * sizeof(unsigned char));
// 复制原始数据,两端各复制一份
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
new_data[(i+size)*new_width+j+size] = in_data[i*width+j];
}
}
for (int i = 0; i < size; i++) {
for (int j = 0; j < width; j++) {
new_data[i*new_width+j+size] = in_data[(size-i-1)*width+j];
new_data[(new_height-1-i)*new_width+j+size] = in_data[(height-size+i)*width+j];
}
}
for (int i = 0; i < new_height; i++) {
for (int j = 0; j < size; j++) {
new_data[i*new_width+j] = new_data[i*new_width+2*size-j-1];
new_data[i*new_width+new_width-1-j] = new_data[i*new_width+new_width-2*size+j];
}
}
// 中值滤波
for (int i = size; i < new_height-size; i++) {
for (int j = size; j < new_width-size; j++) {
int* values = (int*) malloc(filter_size * filter_size * sizeof(int));
int k = 0;
for (int ii = i-size; ii <= i+size; ii++) {
for (int jj = j-size; jj <= j+size; jj++) {
values[k++] = new_data[ii*new_width+jj];
}
}
qsort(values, filter_size*filter_size, sizeof(int), compare);
out_data[(i-size)*width+(j-size)] = values[filter_size*filter_size/2];
free(values);
}
}
free(new_data);
}
int main() {
// 读取原始图像数据
FILE* fp = fopen("lena.raw", "rb");
unsigned char* in_data = (unsigned char*) malloc(512 * 512 * sizeof(unsigned char));
fread(in_data, sizeof(unsigned char), 512 * 512, fp);
fclose(fp);
// 中值滤波
unsigned char* out_data = (unsigned char*) malloc(512 * 512 * sizeof(unsigned char));
median_filter(in_data, out_data, 512, 512, 5);
// 保存中值滤波后的图像数据
fp = fopen("lena_median.raw", "wb");
fwrite(out_data, sizeof(unsigned char), 512 * 512, fp);
fclose(fp);
free(in_data);
free(out_data);
return 0;
}
```
阅读全文