欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();
}

相关标签: 中值滤波