用C语言实现一维数据的中值滤波
时间: 2024-01-25 14:03:12 浏览: 93
中值滤波程序 用C语言实现
5星 · 资源好评率100%
很高兴能为您解答问题!关于用C语言实现一维数据的中值滤波,可以参考以下代码实现:
```c
#include <stdio.h>
// 中值滤波
int median_filter(unsigned char *input, unsigned char *output, int length, int window_size)
{
int half = window_size / 2; // 滑动窗口大小的一半
unsigned char temp[window_size]; // 临时保存数据的数组
int i, j, k, top; // i: 表示窗口窗口左边界,j: 表示窗口右边界,k: 表示数据的下标,top: 为计数器
// 开始滤波,从第一个数据开始到倒数第二个数据
for (i = 0, j = window_size - 1, k = half; j < length; i++, j++, k++) {
// 将数据移入临时数组,进行排序
for (top = 0; top < window_size; top++) {
temp[top] = input[top + i];
}
// 冒泡排序
for (top = 0; top < window_size - 1; top++) {
for (int m = top + 1; m < window_size; m++) {
if (temp[top] > temp[m]) {
unsigned char t = temp[top];
temp[top] = temp[m];
temp[m] = t;
}
}
}
// 找到中间数
output[k] = temp[half];
}
return k - half; // 返回滤波后数据的长度
}
int main()
{
unsigned char input[] = { 10, 30, 20, 40, 50, 10, 30, 20, 50, 20 };
unsigned char output[10];
int length = sizeof(input) / sizeof(unsigned char);
int window_size = 3;
int result_length = median_filter(input, output, length, window_size);
printf("Input: ");
for (int i = 0; i < length; i++) {
printf("%d ", input[i]);
}
printf("\nOutput: ");
for (int i = 0; i < result_length; i++) {
printf("%d ", output[i]);
}
return 0;
}
```
代码中实现了一个简单的中值滤波算法,输入为一个一维数据(数组),输出为滤波后的数据。该算法采用滑动窗口的方式对数据进行处理,经过排序后找到每个窗口的中位数作为该窗口的输出。输入的数据和输出的数据都是 `unsigned char` 类型的数组, `length` 表示输入数据的长度, `window_size` 表示滑动窗口的大小。调用方式为 `median_filter(input, output, length, window_size)`,返回值为输出数据的长度。
阅读全文