帮我写一个平滑滤波的C语言代码
时间: 2023-08-20 21:17:49 浏览: 129
自编平滑滤波C语言代码
4星 · 用户满意度95%
平滑滤波是图像处理中常用的一种滤波方法,可以使图像变得更加平滑,去除一些噪点。以下是一个简单的平滑滤波的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define ROWS 512
#define COLS 512
void smooth_filter(unsigned char *input, unsigned char *output, int rows, int cols)
{
int i, j, m, n;
int sum, count;
int kernel[3][3] = {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}}; // 3x3的平滑滤波器
int kernel_size = 3; // 滤波器大小
for(i = 0; i < rows; i++)
{
for(j = 0; j < cols; j++)
{
sum = 0;
count = 0;
for(m = -kernel_size/2; m <= kernel_size/2; m++)
{
for(n = -kernel_size/2; n <= kernel_size/2; n++)
{
if(i+m >= 0 && i+m < rows && j+n >= 0 && j+n < cols) // 图像边缘处理
{
sum += kernel[m+kernel_size/2][n+kernel_size/2] * input[(i+m)*cols + (j+n)];
count += kernel[m+kernel_size/2][n+kernel_size/2];
}
}
}
output[i*cols + j] = sum / count; // 输出像素值
}
}
}
int main()
{
unsigned char *input = (unsigned char *)malloc(ROWS * COLS * sizeof(unsigned char));
unsigned char *output = (unsigned char *)malloc(ROWS * COLS * sizeof(unsigned char));
FILE *fp_in, *fp_out;
int i;
fp_in = fopen("input.raw", "rb"); // 读取原始图像数据
fread(input, sizeof(unsigned char), ROWS * COLS, fp_in);
fclose(fp_in);
smooth_filter(input, output, ROWS, COLS); // 执行平滑滤波
fp_out = fopen("output.raw", "wb"); // 输出平滑滤波后的图像数据
fwrite(output, sizeof(unsigned char), ROWS * COLS, fp_out);
fclose(fp_out);
free(input);
free(output);
return 0;
}
```
这里我们使用了一个 3x3 的平滑滤波器,对于每个像素,我们计算其周围 3x3 的像素的加权平均值作为输出像素值。需要注意的是,对于图像边缘的像素,我们需要进行特殊处理,此处我们采用了简单的边缘扩展方法。
阅读全文