常用滤波算法之中位值滤波算法
中位值滤波算法简介:
连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。这种方法能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。
中位值滤波C语言编码实现:
#include <stdio.h>
#include <stdlib.h>
#define MAX 255
#define WINDOW_SIZE 3
void sort(int arr[], int n) {
int i, j, temp;
for (i = ; i < n - 1; i++) {
for (j = ; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void medianFilter(int imgWidth, int imgHeight, unsigned char imgData[]) {
int i, j, k, l, m;
int window[WINDOW_SIZE * WINDOW_SIZE];
int windowCenter;
for (i = 1; i < imgHeight - 1; i++) {
for (j = 1; j < imgWidth - 1; j++) {
// Extract the 3x3 window
k = ;
for (l = -1; l <= 1; l++) {
for (m = -1; m <= 1; m++) {
window[k++] = imgData[(i + l) * imgWidth + (j + m)];
}
}
// Sort the window
sort(window, WINDOW_SIZE * WINDOW_SIZE);
// Replace the center pixel with the median value
windowCenter = window[WINDOW_SIZE * WINDOW_SIZE / 2];
imgData[i * imgWidth + j] = windowCenter;
}
}
}
int main() {
// Example usage
int imgWidth = 5;
int imgHeight = 5;
unsigned char imgData[imgWidth * imgHeight] = {
10, 20, 30, 4, 50,
60, 7, 80, 9, 100,
110, 120, 130, 140, 150,
160, 170, 180, 190, 200,
210, 220, 230, 240, 250
};
printf("Original Image:\n");
for (int i = ; i < imgHeight; i++) {
for (int j = ; j < imgWidth; j++) {
printf("%3d ", imgData[i * imgWidth + j]);
}
printf("\n");
}
medianFilter(imgWidth, imgHeight, imgData);
printf("\nFiltered Image:\n");
for (int i = ; i < imgHeight; i++) {
for (int j = ; j < imgWidth; j++) {
printf("%3d ", imgData[i * imgWidth + j]);
}
printf("\n");
}
return ;
}
代码解释:
sort函数:用于对窗口内的像素值进行排序。
medianFilter函数:实现中值滤波的核心逻辑。它遍历图像的每个像素(除了边界),提取3x3窗口,对窗口内的值进行排序,并用中值替换中心像素。
main函数:提供了一个简单的5x5图像数据示例,调用medianFilter函数进行滤波,并打印原始和滤波后的图像。