#include <stdio.h>
#include <memory.h>
//选择排序(升序)
void SelectSort(double* pArr, int len)
{
int i, j, index;
for (i = 0; i < len - 1; i++)
{
index = i;
for (j = i + 1; j < len; j++)
{
if (pArr[j] < pArr[index])
index = j;
}
if (index != i)
{
double temp = pArr[i];
pArr[i] = pArr[index];
pArr[index] = temp;
}
}
}
//只考虑窗口大小为奇数的情况,偶数时取的是中间两个数的平均值
void medfilt1(double* pXn, int len, int nWndSize)
{
if (pXn == NULL || nWndSize <= 0 || nWndSize % 2 == 0 || nWndSize == 1)
return;
int extendNum = nWndSize / 2;//两端扩展的部分
int totalLen = len + 2 * extendNum;//扩展后的数组总长
double* pWorkArr = (double*)malloc(totalLen*sizeof(double));
memcpy(pWorkArr+ extendNum, pXn, len*sizeof(double));
//两端补0
for (int i = 0; i < extendNum;i++)
{
pWorkArr[i] = 0;
pWorkArr[totalLen - extendNum + i] = 0;
}
//滑动窗口
double* window = (double*)malloc(nWndSize*sizeof(double));
for (int i = 0; i <= totalLen- nWndSize; i++)
{
//将工作数组中的数据复制到滑动窗口
for (int j = 0; j < nWndSize; j++)
window[j] = pWorkArr[i + j];
SelectSort(window, nWndSize);//排序
pXn[i] = window[nWndSize / 2];//取中值
}
free(pWorkArr);
free(window);
}
void print(double* p,int len)
{
for (int i = 0; i < len;i++)
{
printf("%g ",p[i]);
}
printf("\n");
}
void main()
{
double a1[] = {-7,9,100,1,5,3,6,7,-5,10};
print(a1,sizeof(a1)/sizeof(double));
medfilt1(a1, sizeof(a1) / sizeof(double), 3);
print(a1, sizeof(a1) / sizeof(double));
getchar();
}
中值滤波实验
最新推荐文章于 2022-09-13 14:44:06 发布