C语言对图像进行中值滤波
时间: 2023-10-04 20:12:41 浏览: 147
中值滤波 C语言
中值滤波是一种常见的图像处理技术,可以用来去除图像中的噪声和杂点。以下是使用C语言实现的中值滤波算法:
1. 定义一个二维数组来存储图像数据,假设图像大小为M×N。
2. 定义一个中值滤波的窗口大小,如3×3、5×5等。
3. 遍历整张图像,对于每个像素点,求取它所在窗口内的像素值的中位数,并将该中位数作为该像素点的新值。
4. 对于边缘像素点,由于窗口无法完全包含它们,需要进行特殊处理。一种常见的方法是将窗口外的像素值设置为边缘像素点的值。
下面是一段简单的C语言代码,实现了一个3×3的中值滤波算法:
```c
#include <stdio.h>
#define M 10
#define N 10
#define WINDOW_SIZE 3
int image[M][N] = {{1,2,3,4,5,6,7,8,9,10},
{11,12,13,14,15,16,17,18,19,20},
{21,22,23,24,25,26,27,28,29,30},
{31,32,33,34,35,36,37,38,39,40},
{41,42,43,44,45,46,47,48,49,50},
{51,52,53,54,55,56,57,58,59,60},
{61,62,63,64,65,66,67,68,69,70},
{71,72,73,74,75,76,77,78,79,80},
{81,82,83,84,85,86,87,88,89,90},
{91,92,93,94,95,96,97,98,99,100}};
int median(int arr[]) {
int temp;
for(int i = 0; i < WINDOW_SIZE*WINDOW_SIZE-1; i++) {
for(int j = 0; j < WINDOW_SIZE*WINDOW_SIZE-i-1; j++) {
if(arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr[WINDOW_SIZE*WINDOW_SIZE/2];
}
int main() {
int temp_arr[WINDOW_SIZE*WINDOW_SIZE];
int new_image[M][N];
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++) {
int cnt = 0;
for(int k = i-WINDOW_SIZE/2; k <= i+WINDOW_SIZE/2; k++) {
for(int l = j-WINDOW_SIZE/2; l <= j+WINDOW_SIZE/2; l++) {
if(k < 0 || k >= M || l < 0 || l >= N) {
temp_arr[cnt] = image[i][j];
}
else {
temp_arr[cnt] = image[k][l];
}
cnt++;
}
}
new_image[i][j] = median(temp_arr);
}
}
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++) {
printf("%d ", new_image[i][j]);
}
printf("\n");
}
return 0;
}
```
在这个例子中,我们使用了一个10×10的二维数组来模拟原始图像数据,然后定义了一个3×3的中值滤波窗口。程序遍历整张图像,对于每个像素点,求取它所在窗口内的像素值的中位数,并将该中位数作为该像素点的新值。最后输出中值滤波后的图像数据。
阅读全文