快速均值滤波算法—C代码
(整理)11种滤波方法+范例代码.

软件滤波算法(转载)这几天做一个流量检测的东西,其中用到了对数据的处理部分,试了很多种方法,从网上找到这些个滤波算法,贴出来记下需要注意的是如果用到求平均值的话,注意总和变量是否有溢出,程序没必要照搬,主要学习这些方法,相信做东西的时候都能用得上1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰平滑度差2、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM7、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
一些软件滤波算法的原理和程序源代码

一些软件滤波算法的原理和程序源代码滤波算法是信号处理中常用的技术,用于去除信号中的噪声或抽取感兴趣的信号特征。
在本文中,我将介绍几种常见的软件滤波算法的原理和程序源代码,包括均值滤波、中值滤波和高斯滤波。
1.均值滤波均值滤波是一种简单直观的滤波算法。
其原理是通过计算像素周围邻近像素的平均值,来替换掉原始图像像素的值。
均值滤波的算法步骤如下:-创建一个大小为n的窗口(n通常为奇数),以当前像素为中心。
-计算窗口中所有像素的平均值。
-将当前像素的值替换为计算得到的平均值。
-按顺序处理所有像素。
以下是均值滤波的C++程序源代码示例:```cppvoid meanFilter(const cv::Mat& src, cv::Mat& dst, int kernelSize)int kernelHalfSize = kernelSize / 2;dst.create(src.size(, src.type();for (int y = 0; y < src.rows; y++)for (int x = 0; x < src.cols; x++)cv::Vec3f sum = cv::Vec3f(0, 0, 0);int numPixels = 0;for (int ky = -kernelHalfSize; ky <= kernelHalfSize; ky++) for (int kx = -kernelHalfSize; kx <= kernelHalfSize; kx++) int px = x + kx;int py = y + ky;if (px >= 0 && py >= 0 && px < src.cols && py < src.rows) sum += src.at<cv::Vec3b>(py, px);numPixels++;}}}cv::Vec3f average = sum / numPixels;dst.at<cv::Vec3b>(y, x) = average;}}```2.中值滤波中值滤波是一种非线性滤波算法,主要用于去除图片中的椒盐噪声。
c语言均值滤波

c语言均值滤波C语言中的均值滤波是一种常见的图像处理算法,它可以有效地去除图像中的噪声,提高图像的质量。
本文将介绍均值滤波的原理、实现方法以及应用场景。
一、均值滤波的原理均值滤波是一种线性滤波器,它通过计算像素周围邻域的平均值来获得滤波后的像素值。
具体而言,对于图像中的每个像素,将其邻域内的像素灰度值进行平均,然后用平均值来替代原始像素值。
这样做的效果是将邻域内的噪声平均掉,从而达到去噪的目的。
二、均值滤波的实现方法在C语言中,可以通过双重循环遍历图像的每个像素,并计算邻域内像素的平均值来实现均值滤波。
具体步骤如下:1. 定义一个与原始图像大小相同的二维数组用于存储滤波后的图像。
2. 双重循环遍历原始图像的每个像素,对于每个像素,再次进行双重循环遍历其邻域内的像素。
3. 将邻域内所有像素的灰度值相加,并除以邻域内像素的总数,得到平均值。
4. 将平均值赋给滤波后的图像对应位置的像素。
5. 最后得到的二维数组即为经过均值滤波后的图像。
三、均值滤波的应用场景均值滤波广泛应用于图像处理领域,主要用于去除图像中的噪声。
噪声对于图像处理来说是一个常见的问题,它会影响图像的质量和视觉效果。
通过应用均值滤波算法,可以有效地降低图像中的噪声水平,提高图像的清晰度和细节。
均值滤波在以下情况下特别有用:1. 数字相机拍摄的图像中存在的高频噪声,如椒盐噪声等。
2. 手持设备上拍摄的图像,由于手部晃动引起的模糊噪声。
3. 传感器采集数据时引入的噪声,如温度传感器、压力传感器等。
四、均值滤波的优缺点均值滤波作为一种简单而有效的滤波算法,具有以下优点:1. 实现简单,计算速度快。
2. 对于高斯噪声等轻度噪声有较好的去噪效果。
3. 不会产生新的伪影或图像失真。
然而,均值滤波也存在一些缺点:1. 对于图像中的细节边缘部分,可能会模糊或丢失细节信息。
2. 对于噪声强度较大的图像,均值滤波效果有限。
五、总结均值滤波是C语言中常用的图像处理算法,通过计算像素周围邻域的平均值来去除图像中的噪声。
中值滤波和均值滤波C++代码

中值滤波和均值滤波C++代码均值滤波和中值滤波代码2008-11-24 16:07:36| 分类: |举报|字号//------------------均值滤波器bool FilterAV(unsigned char *image,int height,int width){int i,j;unsigned char *p=(unsigned char*)malloc(height*width);for(i=1;i<height-1;i++){for(j=1;j<width-1;j++){p[i*width+j]=(unsigned char)(((int)image[(i-1)*width+j-1]+(int)image[(i-1)*width+j]+(int)image[(i-1)*width+j+1]+(int)image[i*width+j-1]+(int)image[i*width+j]+(int)image[i*width+j+1]+(int)image[(i+1)*width+j-1]+(int)image[(i+1)*width+j]+(int)image[(i+1)*width+j+1])/9);}}for(i=1;i<height-1;i++){for(j=1;j<width-1;j++){image[i*width+j]=p[i*width+j];}}free(p);return true;}//----------------------------中值滤波器bool FilterMid(unsigned char *image,int height,int width){int i,j,k,l;int pos;unsigned char temp;unsigned char psr[9];unsigned char *p=(unsigned char*)malloc(height*width); for(i=1;i<height-1;i++){for(j=1;j<width-1;j++){ //---3*3窗⼝矩阵psr[0]=image[(i-1)*width+j-1];psr[1]=image[(i-1)*width+j];psr[2]=image[(i-1)*width+j+1];psr[3]=image[i*width+j-1];psr[4]=image[i*width+j];psr[5]=image[i*width+j+1];psr[6]=image[(i+1)*width+j-1];psr[7]=image[(i+1)*width+j];psr[8]=image[(i+1)*width+j+1];//--------选择排序for(k=0;k<9;k++){pos=k;for(l=k;l<9;l++){if(psr[l]<psr[pos])pos=l;}temp=psr[k];psr[k]=psr[pos];psr[pos]=temp;}//------取中值p[i*width+j]=psr[4];}}for(i=1;i<height-1;i++){for(j=1;j<width-1;j++){image[i*width+j]=p[i*width+j]; }}free(p);return true;}。
十一种滤波方法及C语言程序

一.十一种通用滤波算法(转)1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰平滑度差2、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则) 把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4 B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM7、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
【论文设计】平均值法数字滤波器的C语言算法及其实现

防脉冲干扰移动平均值法数字滤波器的C语言算法及其实现在许多的数据采集系统中,现场的强电设备较多,不可避免地会产生尖脉冲干扰,这种干扰一般持续时间短,峰值大,对这样的数据进行数字滤波处理时,仅仅采用算术平均或移动平均滤波时,尽管对脉冲干扰进行了1/n的处理,但,其剩余值仍然较大。
这种场合最好的策略是:将被认为是受干扰的信号数据去掉,这就是防脉冲干扰平均值滤波法的原理。
防脉冲干扰平均值滤波法的算法是:对连续的n个数据进行排序,去掉其中最大和最小的2个数据,将剩余数据示平均值。
在一般8051单片机的应用中为了加快数据处理速度,n可以取值6。
而对于具有较快速度的处理器,则n值可以适当取大一些。
但最好是n=2^k+2, k为整数,因为这样在求平均值average=SUM/(n-2)=SUM/2^k 时,可以写成average=SUM>>k,用移位的方法,可以加快处理速度。
上述算法显然还存在一个不足之处,就是每采集一个数据就要进行一次排序,这样会大量占用系统宝贵的时间。
这可以通过存储当前数据中的最大值和最小值来改进。
具体做法是:系统中用两个变量来存储当前n个数据的最大值和最小值在这个数组中的偏移量(也就是数组下标,存储数组下标而直接不存储数据本身是因为:在一般的系统中,n不会超无符号短整形的表示范围,因此用一个char形变量就可以存储了而如果直接存储数据本身,则许多情况下要用int形变量,甚至更长的类型)。
这样只要在当前输入的数据将要覆盖的数据正好是当前的最大值或最小值时才在下个数组中查找最大值或最小值,而其他情况下则只要将输入的数据与最大值和最小值比较就可以修改下最大值和最小值了,而且不用进行数据排序。
这个算法很简单,下面是对应的C语言代码实现,可以很方便的应用的具体的51单片机,或其他处理器上,只须做少量的修改。
#i nclude"stdio.h"#define dtype unsigned int // 采集数据的数据类型#define uint8 char#define LEN 6 //移动算术平均的个数+2=SHIFT<<2+2#define SHIFT 2 //2^SHIFTuint8 pdata; //移动指针uint8 pmax,pmin; //记录数据表中最大值和最小值的位置,//在一般的数据采集系统中,数据的长度>=8,//因此用指针记录而不是直接记录最大值和最小值dtype datas[LEN];dtype szlb(dtype _data){/****************************//* 在调用此子程序前必须对 *//* pdata,datas[]数组, *//* pmax,pmin进行初始化 *//****************************/uint8 i;dtype average=0; //清零,用来计算平均值pdata=(pdata+1)%LEN; //指针下标在0到LEN-1上滑动datas[pdata]=_data; //采样所得数据存入数据表中for(i=0;i<LEN;i++)average+=datas[i]; //求所有数据总和/*******去除被认为是脉冲的数据******/if(_data>datas[pmax])pmax=pdata; //得到最大值的指针else if(_data<datas[pmin])pmin=pdata; //得到最小值的指针if(pdata==pmax) //如果当前输入值将存入当前最大值的位置时 { //由以上方法将不可行,必须从其他位置中查找极值for(i=0;i<LEN;i++)if(datas[i]>datas[pmax])pmax=i;}else if(pdata==pmin)//如果当前输入值将存入当前最大值的位置时 { //由以上方法将不可行,必须从其他位置中查找极值for(i=0;i<LEN;i++)if(datas[i]<datas[pmin])pmin=i;}average=average-datas[pmax]-datas[pmin];//减去脉冲return (average>>SHIFT); //求算术平均值}/******以下是在VC++6.0环境下运行的测试程序**//***通过手动输入来模拟数据采集过程****/void main(){uint8 i;dtype _data;pdata=0;pmax=0;pmin=0;for(i=0;i<LEN;i++)datas[i]=0;printf("数据: 最大 最小\n");while(1){scanf("%u",&_data);szlb(_data);for(i=0;i<LEN;i++)printf("%-3u ",datas[i]);printf(" %-3u %-3u",datas[pmax],datas[pmin]); printf("\n");}}本文来自互联网,原文地址:/user1/349/archives/2006/7707.html。
(完整版)经典滤波算法及C语言程序

经典的滤波算法(转)1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰平滑度差2、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM递推平均滤波法对偶然出现的脉冲性干扰的抑制作用较差4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM7、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
c语言平均值滤波

c语言平均值滤波C语言平均值滤波引言:平均值滤波是一种常用的数字信号处理方法,用于消除信号中的噪声。
在C语言中,我们可以通过简单的算法实现平均值滤波,提高信号的质量和准确性。
本文将介绍平均值滤波的原理、实现方法以及一些注意事项。
一、平均值滤波的原理平均值滤波是一种线性滤波方法,通过计算信号的邻近数据点的平均值来减小噪声的影响。
其原理可以简单描述为:对信号中的每个数据点,取其前后若干个数据点的平均值作为滤波后的结果。
二、平均值滤波的实现方法在C语言中,我们可以使用数组和循环结构来实现平均值滤波。
以下是一个简单的平均值滤波函数的实现:```cvoid average_filter(int data[], int size, int window_size) {int filtered_data[size];int half_window = window_size / 2;for (int i = 0; i < size; i++) {int sum = 0;for (int j = i - half_window; j <= i + half_window; j++) {if (j >= 0 && j < size) {sum += data[j];}}filtered_data[i] = sum / window_size;}// 输出滤波后的结果for (int i = 0; i < size; i++) {printf("%d ", filtered_data[i]);}}```以上代码中,`data`是输入的原始信号数据,`size`是数据点的个数,`window_size`是滤波窗口的大小。
函数中首先定义了一个与原始数据点个数相同大小的数组`filtered_data`,用于保存滤波后的结果。
然后,通过两层循环的方式,计算每个数据点周围窗口范围内数据的平均值,并将结果保存在`filtered_data`数组中。