c++实现中值滤波
程序员文章站
2022-07-14 16:16:07
...
中值滤波是一种非线性平滑技术。
中值滤波的原理通俗的讲就是排序,取中间值代替当前值。
对椒盐噪声有明显效果。
知道原理,实现起来就不难了,代码如下
#include "stdio.h"
//滤波长度
#define N_filter 20
//中值滤波
unsigned char medFilter(int * DataBuffer){
int i, j;// 循环变量
unsigned char temp;
// 用冒泡法对数组进行排序
for (j = 0; j < N_filter - 1; j++)
{
for (i = 0; i < N_filter - j - 1; i++)
{
if (DataBuffer[i] > DataBuffer[i + 1])
{
temp = DataBuffer[i];
DataBuffer[i] = DataBuffer[i + 1];
DataBuffer[i + 1] = temp;
}
}
}
// 计算中值
if ((N_filter & 1) > 0)
{
// 数组有奇数个元素,返回中间一个元素
temp = DataBuffer[N_filter / 2];
//printf("%d", temp);
}
else
{
// 数组有偶数个元素,返回中间两个元素平均值
temp = (DataBuffer[N_filter / 2-1] + DataBuffer[N_filter / 2]) / 2;
//printf("%d\n", DataBuffer[N_filter / 2]);
//printf("%d\n", DataBuffer[N_filter / 2]+1);
}
//printf("%d", temp);
return temp;
}
//仿真
void main()
{
//数据
int temp_buf[N_filter] = { 1,2,3,8,9,14,15,16,17,10,12,20,13,18,19,4,5,6,7,21 };
unsigned char ret;
//存放数据buf
int buf[N_filter] = { 0 };
int i, j;
//将最新数据放到buf最后一位,其他数据前移一位
for ( i = 0; i<20; i++)
{
for ( j = 0; j<19; j ++)
{
buf[j] = buf[j + 1];
}
buf[j] = temp_buf[i];
//更新的数据进行中值滤波
ret = medFilter(buf);
printf("%d\n", ret);
}
//printf("%d", ret);
getchar();
}
上一篇: Thread.sleep/wait