中值滤波降噪c语言代码
时间: 2024-10-15 07:02:43 浏览: 28
中值滤波是一种非线性的图像处理技术,常用于去除噪声,尤其是椒盐噪声。在C语言中,我们可以创建一个简单的中值滤波函数,通过邻域内的像素值找到中位数作为新像素的值。以下是一个简化的例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻域大小(这里假设是3x3)
#define SIZE 3
int median(int arr[], int n) {
// 对数组进行排序并计算中位数
qsort(arr, n, sizeof(int), compare);
if (n % 2 == 0)
return (arr[n / 2 - 1] + arr[n / 2]) / 2; // 如果元素个数偶数,取中间两个的平均值
else
return arr[n / 2]; // 如果元素个数奇数,直接返回中间的那个数
}
void medfilt(int src[], int dest[], int width, int height) {
for (int y = 1; y < height - 1; y++) { // 避免除边界影响
for (int x = 1; x < width - 1; x++) {
int subarray[SIZE * SIZE];
for (int i = 0; i < SIZE * SIZE; i++) {
int row = y + (i / SIZE) - 1;
int col = x + (i % SIZE) - 1;
if (row >= 0 && row < height && col >= 0 && col < width)
subarray[i] = src[row * width + col];
}
dest[y * width + x] = median(subarray, SIZE * SIZE);
}
}
}
// 比较函数,用于qsort排序
int compare(const void* a, const void* b) {
return (*(const int*)a - *(const int*)b);
}
int main() {
// 假设src[]是你原始的图像数据,width和height是图像尺寸
int src_data[...], dest_data[...], width, height;
medfilt(src_data, dest_data, width, height);
// 这里dest_data将是处理后的图像数据
// 输出结果或保存到文件等...
return 0;
}
```
阅读全文