平滑滤波c语言
❶ 平滑滤波的滤波方法
图像的噪声滤波器有很多种,常用的有线性滤波器,非线性滤波器。采用线性滤波如邻域平滑滤波,对受到噪声污染而退化的图像复原,在很多情况下是有效的。但大多数线性滤波器具有低通特性,去除噪声的同时也使图像的边缘变模糊了。而另一种非线性滤波器如中值滤波,在一定程度上可以克服线性滤波器所带来的图像模糊问题,在滤除噪声的同时,较好地保留了图像的边缘信息。
邻域平滑滤波原理
邻域平均法[2]是一种利用Box模版对图像进行模版操作(卷积运算)的图像平滑方法,所谓Box模版是指模版中所有系数都取相同值的模版,常用的3×3和5×5模版如下:
邻域平均法的数学含义是:
(式4-1)
式中:x,y=0,1,…,N-1;S是以(x,y)为中心的邻域的集合,M是S内的点数。
邻域平均法的思想是通过一点和邻域内像素点求平均来去除突变的像素点,从而滤掉一定噪声,其优点是算法简单,计算速度快,其代价会造成图像在一定程度上的模糊。
中值滤波原理
中值滤波[2]就是用一个奇数点的移动窗口,将窗口的中心点的值用窗口内的各点中值代替。假设窗口内有五点,其值为80、90、200、110和120,那么此窗口内各点的中值及为110。
设有一个一维序列f1,f2,…,fn,取窗口长度(点数)为m(m为奇数),对其进行中值滤波,就是从输入序列中相继抽出m个数fi-v,…,fi-1,fi,fi+1,…,fi+v(其中fi为窗口中心值,v=(m-1)/2),再将这m个点按其数值大小顺序排序,取其序号的中心点的那个数作为滤波输出。数学公式表示为:
Yi=Med{fi-v,…,fi-1,fi,fi+1,…,fi+v} i∈N v=(m-1)/2 (式4-2)
Yi称为序列fi-v,…,fi-1,fi,fi+1,…,fi+v的中值
例如,有一序列{0,3,4,0,7},重新排序后为{0,0,3,4,7}则Med{0,0,3,4,7}=3。此列若用平滑滤波,窗口也取5,那么平滑滤波输出为(0+3+4+0+7)/5=2.8。
把一个点的特定长度或形状的邻域称作窗口。在一维情况下,中值滤波器是一个含有奇数个像素的滑动窗口。中值滤波很容易推广到二维,此时可以利用二维形式的窗口。
对于平面图像采用的二维中值滤波可以由下式表示:
(式4-3)
式中:A为窗口,{fij}为二维数据序列,即数字图像各点的灰度值。
对于本系统,由于采集到的是24位真彩色图像,每个像素点分别有R、G、B三个灰度分量,故要在窗口内分别找到这三个分量的中值,分别用这三个中值去代替窗口中心像素点的R、G、B三个灰度分量的值。
❷ c语言程序,本屌是初学者所以麻烦不要用太高级的语句谢谢QAQ
额 我的数字信号处理学的很差,但是我大概了解了下,是不是这个意思首先由两个sin函数构成了一个输入信号,在数字信号处理中叫做激励的东西,然后您给了一个平滑滤波的公式,于是您期望输出信号,也就是信号与系统中所说的Y(z)=H(z)*X(z)如果是的话。那么我就上图了。
intExcitationSignal(intN,float*OutSignalBuffer)
{
floatPi=3.14;
floatx=0;
inti;
for(i=0;i<=N;i++,x++)
{
*(OutSignalBuffer+i)=sin(0.05*Pi*x)+0.1*sin(0.7*Pi*x);
}
return0;
}
voidPrint(float*Buffer,intN)
{
inti=0;
for(i=0;i<N;i++)
printf(" [%d] [%f]
",i,*(Buffer+i));
}
voidtest()
{
float*InS;
InS=(float*)malloc(sizeof(float)*128);
float*OutS;
OutS=(float*)malloc(sizeof(float)*128);
ExcitationSignal(127,InS);
//Print(InS,127);
intj,i;
for(j=0;j<124;j++)
Smooth(i,j,3,InS,OutS);
Print(OutS,124);
}
intmain(void)
{
test();
getchar();
return0;
}
我程序中子函数中malloc但是没有free,你可以看情况free下。
❸ 低通平滑滤波
你是不懂低通,还是不懂平滑,还是不懂滤波啊.
先讲讲低通平滑滤波的作用吧.(这种知识10分有些少了)
信号采集有采集前滤波和采集后滤波.
以你的问题咱们把重点放在后滤波上.
咱们采集来的信号,如果它的数据信息在低频部分就需要使用低通平滑滤波.
这是为什么呢?
对于特定电路因为咱们采集来的信号中掺杂着很多高频干扰,使信号波形看上去很乱.如果咱们使用参数到位的低通滤波滤除高频干扰,这时咱们的信号就会很工整,很平滑.这就是低通平滑滤波.
补充:
kenyp我是个模拟电路工程师,没用过DSP.数字滤波器的知识只停留在书本阶段.
就我对信号采集的知识可能对你的需求不能带来实质性的成效.
我谈谈我的理解:
!!一般都是在AD转换前进行滤波处理
咱们常用的传感器会把物理量转化成 频率 或 电压.
转化成频率的在AD转换前一定要加滤波器.
转化成电压的则视工作环境而定.如果工厂里使用,AD转换前一定要加滤波器.
我做过一个民用室内产品,工作环境很稳定,但客户坚持要加滤波器.
你所说的"AD模块转换成的数据有无进行平滑滤波的必要"如果是对电压值进行采样的话,我的理解完全没有必要.(你用的温感也一定输出的是电压量不是频率量).首先,温度变化率很低,你的采样频率比它N倍.干吗要滤波?
你所说的"低通平滑滤波的实现是在哪个环节",我的理解低通平滑滤波就是去毛刺.由于毛刺频率很高,数字滤波器的性能好,适合滤除毛刺.比如说数字示波器 显示单元的前级一顶要用平滑滤波.
见笑了,我就懂那么多.
❹ 为什么平滑滤波相当于低通滤波器
平滑滤波的曲线频率是很低的,相当于低通滤波器,让低频通过。
❺ 如何用C语言实现PCM编码
PCM 脉冲编码调制是Pulse Code Molation的缩写。脉冲编码调制是数字通信的编码方式之一。主要过程是将话音、图像等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。
模拟信号数字化必须经过三个过程,即抽样、量化和编码,以实现话音数字化的脉冲编码调制(PCM,Pulse Coding Molation)技术。
抽样(Sampling)
抽样是把模拟信号以其信号带宽2倍以上的频率提取样值,变为在时间轴上离散的抽样信号的过程。例如,话音信号带宽被限制在0.3~3.4kHz内,用 8kHz的抽样频率(fs),就可获得能取代原来连续话音信号的抽样信号。对一个正弦信号进行抽样获得的抽样信号是一个脉冲幅度调制(PAM)信号,如下图对模拟正弦信号的抽样所示。对抽样信号进行检波和平滑滤波,即可还原出原来的模拟信号。
量化(quantizing)
抽样信号虽然是时间轴上离散的信号,但仍然是模拟信号,其样值在一定的取值范围内,可有无限多个值。显然,对无限个样值一一给出数字码组来对应是不可能的。为了实现以数字码表示样值,必须采用“四舍五入”的方法把样值分级“取整”,使一定取值范围内的样值由无限多个值变为有限个值。这一过程称为量化。
量化后的抽样信号与量化前的抽样信号相比较,当然有所失真,且不再是模拟信号。这种量化失真在接收端还原模拟信号时表现为噪声,并称为量化噪声。量化噪声的大小取决于把样值分级“取整”的方式,分的级数越多,即量化级差或间隔越小,量化噪声也越小。
编码(Coding)
量化后的抽样信号在一定的取值范围内仅有有限个可取的样值,且信号正、负幅度分布的对称性使正、负样值的个数相等,正、负向的量化级对称分布。若将有限个 量化样值的绝对值从小到大依次排列,并对应地依次赋予一个十进制数字代码(例如,赋予样值0的十进制数字代码为0),在码前以“+”、“-”号为前缀,来 区分样值的正、负,则量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流,即十进制数字信号。简单高效的数据系统是二进制码系统,因此,应将十 进制数字代码变换成二进制编码。根据十进制数字代码的总个数,可以确定所需二进制编码的位数,即字长。这种把量化的抽样信号变换成给定字长的二进制码流的 过程称为编码。例程:
#include<iostream>
usingnamespacestd;
intmain()
{
constintsect=8;//numberofsegement.
constintstartingVol[sect+1]={0,16,32,64,128,256,512,1024,2048};
//.
constintquanIntvl[sect]={1,1,2,4,8,16,32,64};
//,1equealto1/2048.
intpcmInd=0;//pcmcode'sindex.
intpcmCode[sect]={0,0,0,0,0,0,0,0};//8bitofpcmcodes.
intsampleValue=1270;
intstartPoint;//
//suchasstartingVol[startPoint]=16or128etc.
intfinePoint;//.
intquanValue;//it'.
intquanError;//errorcausedbyquantity.
//
intlow=0;
inthigh=sect;
intmid;
intloopInd1=0;//loopindextogetsegmentcode
intloopInd2=0;//
//getthefirst_digitcodeofpolarity
(sampleValue>0)?(pcmCode[pcmInd++]=1):(pcmCode[pcmInd]=0);
sampleValue=abs(sampleValue);//makesurethevoltageispositive
//
while(loopInd1<3)//
{
mid=(low+high)/2;
//after3loops,sampeValuefallsinstartingVol[mid]-startingVol[mid]or
//instartingVol[mid-1]-startingVol[mid]
if(sampleValue<startingVol[mid])
{
pcmCode[pcmInd++]=0;
high=mid;
startPoint=mid-1;
}
else
{
pcmCode[pcmInd++]=1;
low=mid;
startPoint=mid;
}
loopInd1++;
}//endwhile
//getthelastfourbitscodesofpcm
low=0;
high=16;//
while(loopInd2<4)
{
mid=(low+high)/2;
//.
quanValue=startingVol[startPoint]+mid*quanIntvl[startPoint];
cout<<startingVol[startPoint]<<"+"<<quanIntvl[startPoint]<<"*"<<mid<<"="
<<quanValue<<"?"<<sampleValue<<endl;
//.
if(sampleValue<startingVol[startPoint]+mid*quanIntvl[startPoint])
{
pcmCode[pcmInd++]=0;
high=mid;
finePoint=mid-1;
}
else
{
pcmCode[pcmInd++]=1;
low=mid;
finePoint=mid;
}
loopInd2++;
}//endwhile
quanValue=startingVol[startPoint]+finePoint*quanIntvl[startPoint];
quanValue+=quanIntvl[startPoint]/2;//finalquantityvalue.
quanError=abs(sampleValue-quanValue);//errorofquantity.
cout<<"Finalquantityvalueis:"<<quanValue<<endl;
cout<<"Errorofquantityis:"<<quanError<<endl;
cout<<"PCMcodesare:";
for(inti=0;i<8;i++)
{
cout<<pcmCode[i]<<"";
}//endfor
cout<<endl;
return0;
}
❻ 平滑滤波的介绍
平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
❼ 空间滤波的平滑、锐化滤波器的异同点及相互联系
空域滤波技术根据功能主要分为平滑滤波与锐化滤波。 平滑滤波能减弱或消除图像中的高频率分量而不影响低频分量,高频分量对应图像中的区域边缘等灰度值具有较大变化的部分,平滑滤波可将这些分量滤去减少局部灰度起伏,使图像变得比较平滑。也可用于消除噪声,或在提取较大目标前去除太小的细节或将目标的小间断连接起来。
锐化滤波正好相反,锐化滤波常用于增强被模糊的细节或目标的边缘,强化图像的细节。 忘采纳~
❽ 平滑滤波的其他方式
频率域滤波是将图像从空间或时间域转换到频率域,再利用变换系数反映某些图像特征的性质进行图像滤波的方法。傅立叶变换是一种常用的变换。在傅立叶变换域,频谱的直流分量正比于图像的平均亮度,噪声对应于频率较高的区域,图像实体位于频率较低的区域。图像在变换具有的这些内在特性可被用于图像滤波。可以构造一个低通滤波器,使低频分量顺利通过而有效地阻于高频分量,即可滤除图像的噪声,再经过反变换来取得平滑的图像。
低通的数学表达式如下式所示:
G(u,v)=F(u,v)H(u,v)
式中F (u, v)一含有噪声的原图像的傅立叶变换;
H (u, v)一为传递函数,也称转移函数(即低通滤波器);
G (u, v)一为经低通滤波后输出图像的傅立叶变换。
H滤波滤去高频成分,而低频信息基本无损失地通过。滤波后,经傅立叶变换反变换可得平滑图像,即选择适当的传递函数H (u, v),对频率域低通滤波关系重大。常用的传递函数有梯形函数、指数函数、巴特沃思函数等。频域常用的几种低通滤波器为理想低通滤波器(Ideal circular Iow-passfilter)、巴特沃思(Butterworth)低通滤波器、指数低通滤波器及梯形低通滤波器。这些低通滤波器,都能在图像内有噪声干扰成分时起到改善的作用。
常用的平面空间域滤波法有两类
一类是拟合图像的方法,包括n阶多项式拟合、离散正交多项式拟合、二次曲面拟合等多种方法;另一类是平滑图像的方法,包括领域平均法、中值滤波法、梯度倒数加权法、选择式掩模法等。
首先是高斯滤波器
高斯滤波器是平滑线性滤波器的一种,线性滤波器很适合于去除高斯噪声。而非线性滤波则很适合用于去除脉冲噪声,中值滤波就是非线性滤波的一种。平滑滤波器就是用滤波掩模确定的邻域内像素的平均灰度值去替代图像的每个像素点的值,这很容易用硬件实现。而高斯滤波器是带有权重的平均值,即加权平均,中心的权重比邻近像素的权重更大,这样就可以克服边界效应。高斯滤波如果采用3×3掩模的具体公式如下:
g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16;
其中,f(x,y)为原图像中(x,y)像素点的灰度值,g(x,y)为经过高斯滤波和的值。
上述的公式可以结构化为3×3的掩模如下:
×1/16
从结构化掩模中可以看到,处于掩模中心的位置比其他任何像素的权值都大,因此在均值计算中给定的这一像素显得更为重要。而距离掩模中心较远的像素就显得不太重要,这样做是为了减小平滑处理中的模糊。当然可以采取其他的权重达到相同的目的,其中16=1+2+1+2+4+2+1+2+1。但是由于1、2、4、16都是2的整数次幂很便于硬件的实现。
具体的参考数字图像处理的经典书——冈萨雷斯的《数字图像处理(matlab版)》借此机会希望有更多喜欢“图像处理+FPGA”的同学一同探讨这本书上的精华。
其次是中值滤波器
中值滤波器是统计滤波器的一种,属于非线性的的空间滤波器。正如其名,它是将像素(中值计算中包括的原像素值)邻域内灰度的中值代替该像素的值。中值滤波器的使用非常普遍,这是因为对于一定类型的随机噪声,它提供了优秀的去噪能力,比小尺寸的线性平滑滤波器的模糊程度明显要低。中值滤波器对处理脉冲噪声非常有效。中值滤波器在FPGA上实现起来相对高斯滤波的难度更大一点。因为它要对相邻的像素进行排序,需要用到一些比较器。
虽然说中值滤波器对脉冲信号很有效,但是仅采用简单的中值滤波将不可避免的丢失图像的细节,造成视觉效果的模糊。于是后来又些人提出了一些改进的方法,如基于个数判断的脉冲噪声的中值滤波器、自适应门限的中值滤波器、多窗口下的自适应中值滤波器等等。
❾ 讨论于平滑处理的滤波器和用于锐化处理的滤波器之间的区别和联系
1.相同点:都能减弱或消除傅里叶空间的某些分量,而不影响或较少影响其他分量,从而达到增强某些频率分量的效果。
2.不同点:频率滤波器减弱或消除了傅里叶空间的高频分量,所以达到了增强某些低频分量、平滑图像中细节的效果。锐化滤波器减弱或消除傅里叶空间的低频分量,所以达到了增强了高频分量、锐化图像中细节效果。
3.联系:两者效果相反,互为补充,从原始图像中减去平滑滤波器的结果得到锐化滤波器的效果,而从原始图像中减去锐化滤波器的结果则可以得到平滑滤波器的效果。
❿ 数字图像处理中,既然平滑滤波器会造成图像模糊,那么这到底是退化呢还是增强呢
增强,你既然有这个疑问那你也知道滤波器多种多样每一种滤波器功能是独特的,而且其用途也是独特的,因此并不是任何场合下都可以使用平滑滤波器,从人的角度来讲,人总是希望图像能够朝着有利于人观察或者是有利于人的后续处理的方向变化,比如说在一幅图像中存在很多噪声,但是我仅仅希望得到其中很大的一个物品的轮廓,那么使用平滑去噪就可以将噪声模糊掉,这样一来就使得图像朝着我希望的方向变化。