《中值滤波器设计及椒盐噪声滤除》由会员分享,可在线阅读,更多相关《中值滤波器设计及椒盐噪声滤除(20页珍藏版)》请在金锄头文库上搜索。
1、题目四:中值滤波器设计及椒盐噪声滤除一、实验背景在数字图像的生成与采集过程中,由于受工作环境,器件等性能的影响,使得一幅 未经处理的原始图像,都存在着一定的噪声干扰。这种噪声具有以下性质:1、图像上的噪声出现处呈现不规则分布;2、噪声的大小也是不规则的。这些噪声恶化了图像质量,使图像模糊甚至淹没目标特征,给后续的处理分析带来了困 难。因此需要对图像应该进行滤除噪声处理。二、实验目的1. 通过利用C程序实现数字信号处理的相关功能,巩固对信号处理原理知识的理 解,培养快速解决实际问题的能力提高实际编程和处理数据的综合能力,初步培养在 解决信号处理实际应用问题中所应具备的基本素质和要求。2. 培养独
2、立思考的能力与研发能力,通过设计实现不同的信号处理问题,初步掌握 在给定条件和功能的情况下,实现合理设计算法结构的能力。3. 提高资料查询和整理的能力。能够在短时间内找到适合自己的方法。并在文献整 理的过程中学会科技文献的写作,提高语言表达能力。三、实验内容1. 理解什么是椒盐噪声,中值滤波的原理及其特性。2. 设计一种中值滤波,对椒噪声滤波有效,并分析滤波器的适用范围。3. (扩展训练)对设计的滤波器针对椒、盐噪声滤除分别进行测试,并进行性能比较分 析,并讨论椒、盐噪声频度(噪声数目占图像实际像素的百分比)对滤波器实际效果的 影响。四、实验原理1.椒盐噪声 椒盐噪声又称脉冲噪声,是由图像传感
3、器,传输信道,解码处理等产生的黑白相 间的亮暗点噪声。椒盐噪声往往由图像切割引起。椒盐噪声的 PDF 是:az = az = b其他如果ba,灰度值b在图像中将显示为一个亮点,a的值将显示为一个暗点。若Pb 或 为零,则脉冲噪声称为单级脉冲。/如果P 和均不为零,尤其是他们近似相等时,脉冲噪声值将类似于随机分布在图像上的胡椒和盐粉微粒。形象的说,椒噪声在图像上是类似于黑胡椒颗粒的小点,而盐噪声在图像上是类似 于白色盐粒的小点。2、平滑化去噪声思想 如何从一副有噪声的图像中把噪声去除呢?此时,因有随机噪声而把像素的真值 隐藏起来,而不被知晓,可表现为图像变暗而不清楚。我们的目的是要把干扰的噪声
4、除去,得到视觉清晰的图像。如右图,噪声的浓度与其周围像素的浓度 间,存在着很大的浓度差,使人觉得很刺眼, 利用噪声的这种性质除去噪声的方法,一般称 为平滑化(smoothi ng )。3、中值滤波的原理及特性:中值滤波在图像处理中,常用于用来保护边缘信息,是一种经典的平滑噪声的方 法。(1) 中值滤波原理 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中 值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个拎域中各点值的 中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是去某种结 构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(
5、或下 降)的为二维数据序列。二维中值滤波输出为g (x,y) =medf(x-k,y-l),(k,l eW),其中,f(x,y) , g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为 2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。(2) 中值滤波器: 中值滤波器:用该像素相邻像素的灰度中值来代替该像素的值 :f (x, y) = median g (s, t)(s ,t )gSxy实现方法:a. 通过从图像中的某个采样窗口取出奇数个数据进行排序,位于采样窗中间的中 值作为输出;b. 丢弃最早的值,用排序后的中值取代要处理的数据即可。(3)中值滤波特性 中
6、值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。中值滤波方法以牺牲图像清晰度为代价消除图像中的椒盐噪声。中值滤波不能保 证把噪声去除,只能在有限的范围内减弱噪声对图像的影响。同时,中值滤波不能多 次使用,因为这样会使图像各个像素间趋于相同,整个图像就会变得越来越模糊。另外,通过查阅资料发现,中值滤波器的效果不仅仅和观察窗的大小有关,还和 观察窗的形状有关。五、实验步骤1、根据题目要求,先画出程序的流程图。结束2、源程序:(1)基础训练部分#include #include un sig ned char*pBmpBuf二NULL;/读入图像数据的指针un sig ned
7、 char*pBmpBuf2二NULL;/读入图像数据的指针int bmpWidth;/图像宽度int bmpHeight;/图像高度RGBQUAD *pColorTable;/颜色表指针int biBitCount; /图像类型,每像素的位数/读程序可读取8,24位图,本实验是对8位灰度图进行操作,满足要求bool readBmp(char *bmpName,int ImageWidth,int ImageHeight)int i,j;/行列数BYTE *B;/分别对应图像的RGB,本实验中RGB相等,故意义不大BYTE *R;BYTE *G;FILE *fp=fopen(bmpName,r
8、b);/打开文件if(fp=0) return 0;fseek(fp,sizeof(BITMAPFILEHEADER),0);/找出头文件BITMAPINFOHEADER head;fread(&head,sizeof(BITMAPINFOHEADER),1,fp);ImageWidth=head.biWidth;/图像宽度赋值ImageHeight=head.biHeight;/图像高度赋值bmpWidth=ImageWidth;bmpHeight=ImageHeight; biBitCount=head.biBitCount;int lineByte=(bmpWidth*biBitCoun
9、t/8+3)/4*4; /一行中信息点字节 if (biBitCount=8)pColorTable=new RGBQUAD256; fread(pColorTable,sizeof(RGBQUAD),256,fp);pBmpBuf=new unsigned charlineByte*bmpHeight; fread(pBmpBuf,1,lineByte*bmpHeight,fp);/开空间B=NULL;B=(BYTE*)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; ibmpHeight; i+)Bi = (BYTE*)malloc(sizeof(BYTE)
10、*bmpWidth);if(B=NULL)printf(fail to malloc Bn);exit(0);G=NULL;G=(BYTE*)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; ibmpHeight; i+)Gi = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);if(G=NULL)printf(fail to malloc Gn);exit(0);R=NULL;R=(BYTE*)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; ibmpHeight; i+)Ri = (BYTE*)mal
11、loc(sizeof(BYTE)*bmpWidth);if(R=NULL)printf(fail to malloc Rn);exit(0);/读图像的RGBif (biBitCount=8)for(i=0;ibmpHeight/50;i+)for(j=0;jbmpWidth/50;j+)Bij=*(pBmpBuf+i*lineByte+j);Gij=*(pBmpBuf+i*lineByte+j);Rij=*(pBmpBuf+i*lineByte+j); printf(B=%d,G=%d,R=%d)n,Bij,Gij,Rij);else if (biBitCount=24)for(i=0;ib
12、mpHeight/100;i+)for(j=0;jbmpWidth/100;j+)Bij=*(pBmpBuf+i*lineByte+j*3+0);Gij=*(pBmpBuf+i*lineByte+j*3+1);Rij=*(pBmpBuf+i*lineByte+j*3+2); printf(B=%d,G=%d,R=%d)n,Bij,Gij,Rij);fclose(fp);/释放空间for(i=0; ibmpHeight; +i)free(Bi);free(B);B=NULL;for(i=0; ibmpHeight; +i)free(Gi);free(G);G=NULL;for(i=0; ibmp
13、Height; +i)free(Ri);free(R);R=NULL;return 1;bool writeBmp(char *bmpName, int ImageWidth,int ImageHeight)unsigned char *imgBuf=pBmpBuf2;if(!imgBuf)return 0;int colorTablesize=0;if(biBitCount=8) colorTablesize=1024;int lineByte=(ImageWidth*biBitCount/8+3)/4*4;FILE *fp=fopen(bmpName,wb);if (fp=0) retur
14、n 0;BITMAPFILEHEADER fileHead;fileHead.bfType=0x4D42;fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*ImageHeight;fileHead.bfReserved1=0;fileHead.bfReserved2=0;fileHead.bfOffBits=54+colorTablesize; fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);BITMAPINFOHEADER head;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=ImageHeight;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*ImageHeight;head.biWidth=ImageWidth;head.biXPelsPerMeter=0;hea