C语言可以实现各种滤波算法,以下是一些常见的滤波算法:
-
均值滤波(Mean Filter):将图像中每一个像素周围一定区域内的灰度值取平均值作为该像素的新灰度值,用于去除高斯噪声等随机噪声。
下面是一个简单的 C 语言均值滤波的例程,它使用了一个3x3的模板对输入图像进行滤波,输出结果为经过平均后的图像。 #include <stdio.h> #define WIDTH 640 #define HEIGHT 480 unsigned char src_img[WIDTH][HEIGHT]; unsigned char dst_img[WIDTH][HEIGHT]; void mean_filter(unsigned char src[][HEIGHT], unsigned char dst[][HEIGHT], int width, int height) { int i, j, k, l; int sum; for (i = 1; i < width - 1; i++) { for (j = 1; j < height - 1; j++) { sum = 0; for (k = -1; k <= 1; k++) { for (l = -1; l <= 1; l++) { sum += src[i + k][j + l]; } } dst[i][j] = (unsigned char)(sum / 9); } } } int main() { FILE *fp_in, *fp_out; int i, j; fp_in = fopen("input.raw", "rb"); if (!fp_in) { printf("failed to open input file\n"); return -1; } fp_out = fopen("output.raw", "wb"); if (!fp_out) { printf("failed to open output file\n"); fclose(fp_in); return -1; } fread(src_img, sizeof(unsigned char), WIDTH * HEIGHT, fp_in); mean_filter(src_img, dst_img, WIDTH, HEIGHT); fwrite(dst_img, sizeof(unsigned char), WIDTH * HEIGHT, fp_out); fclose(fp_in); fclose(fp_out); return 0; } 该例程读入一个名为 "input.raw" 的原始图像文件,然后对其进行均值滤波处理,将结果存储到名为 "output.raw" 的文件中。在滤波函数中,使用了两个循环来遍历输入图像的每一个像素,并采用3x3的模板计算平均值,最后将结果赋值给输出图像的对应像素。
-
中值滤波(Median Filter):将图像中每一个像素周围一定区域内的灰度值排序,然后取中间值作为该像素的新灰度值,用于去除椒盐噪声等脉冲噪声。
下面是一个简单的 C 语言中值滤波的例程,它使用了一个3x3的模板对输入图像进行滤波,输出结果为经过中值滤波后的图像。 c #include <stdio.h> #include <stdlib.h> #define WIDTH 640 #define HEIGHT 480 unsigned char src_img[WIDTH][HEIGHT]; unsigned char dst_img[WIDTH][HEIGHT]; void swap(unsigned char *a, unsigned char *b) { unsigned char temp = *a; *a = *b; *b = temp; } void median_filter(unsigned char src[][HEIGHT], unsigned char dst[][HEIGHT], int width, int height) { int i, j, k, l; int count; unsigned char buf[9]; for (i = 1; i < width - 1; i++) { for (j = 1; j < height - 1; j++) { count = 0; for (k = -1; k <= 1; k++) { for (l = -1; l <= 1; l++) { buf[count++] = src[i + k][j + l]; } } for (k = 0; k < 8; k++) { for (l = k + 1; l < 9; l++) { if (buf[k] > buf[l]) { swap(&buf[k], &buf[l]); } } } dst[i][j] = buf[4]; } } } int main() { FILE *fp_in, *fp_out; int i, j; fp_in = fopen("input.raw", "rb"); if (!fp_in) { printf("failed to open input file\n"); return -1; } fp_out = fopen("output.raw", "wb"); if (!fp_out) { printf("failed to open output file\n"); fclose(fp_in); return -1; } fread(src_img, sizeof(unsigned char), WIDTH * HEIGHT, fp_in); median_filter(src_img, dst_img, WIDTH, HEIGHT); fwrite(dst_img, sizeof(unsigned char), WIDTH * HEIGHT, fp_out); fclose(fp_in); fclose(fp_out); return 0; } 该例程读入一个名为 "input.raw" 的原始图像文件,然后对其进行中值滤波处理,将结果存储到名为 "output.raw" 的文件中。在滤波函数中,使用了两个循环来遍历输入图像的每一个像素,并采用3x3的模板将周围的9个像素存储到一个数组中,然后对数组进行排序,并取其中位数作为输出图像的对应像素。
-
高斯滤波(Gaussian Filter):根据高斯分布函数生成一个二维高斯核,将其应用于图像中的每一个像素,以加权平均的方式计算该像素的新灰度值,用于去除高斯噪声和平滑图像。
-
边缘检测滤波(Edge Detection Filter):使用一些特殊的卷积核对图像进行卷积操作,以突出图像中的边缘和轮廓,常见的滤波器有Sobel、Prewitt和Laplace等。
-
自适应滤波(Adaptive Filter):根据局部像素之间的相关性调整滤波器的权值,以获得更好的滤波效果,常见的算法有NL-Means和Bilateral Filter等。
这些滤波算法可以根据具体应用场景进行选择和优化,以达到最佳的图像处理效果。