C++实现一维数组的中值滤波(Median Filter)
中值滤波是一种非线性的滤波方法,其核心思想是用数据序列中一定范围内数据的中值来代替该范围内的原始数据。中值滤波可以有效的去除脉冲干扰等不稳定噪声,同时保留数据的边缘和细节。
中值滤波的步骤如下:
- 确定滤波窗口大小,即要取多少个数据进行计算;
- 将窗口对准数据序列的第一个数据点,计算该窗口内数据的中值,并将该中值放置于窗口中心的位置;
- 移动窗口,计算下一个数据点的中值,重复步骤2。
C++完整代码为:
#include<iostream>
#include <iomanip>
#include<math.h>
using namespace std;
int main()
{
int i = 0, j = 0;
double temp = 0.0;
double data[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
double data_temp[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
int size = sizeof(data)/sizeof(data[0]);
// 中值滤波
int len = 3;
int halfSize = len / 2;
int idx;
double* kernel = new double[len];
//
for (i=(len-1)/2; i<(size-(len-1)/2); i++)
{
int index = 0;
for(j=-halfSize; j<=halfSize; ++j)
{
idx = i+j;
kernel[index] = data_temp[idx];
index++;
}
int temp;
for (int m=0; m<len-1; m++)
{
for(int n=m+1; n<len; n++)
{
if(kernel[m] > kernel[n])
{
temp = kernel[m];
kernel[m] = kernel[n];
kernel[n] = temp;
}
}
}
data[i] = kernel[(len/2)];
}
for(i=0; i<size; i++)
cout << data[i] << endl;
return 0;
}