当前位置:文档之家› 中值和均值滤波算法

中值和均值滤波算法

作业:对lean.raw文件,采用中值滤波和均值滤波,完成图象去噪中值滤波:/***************************************************************************函数名称:*MedianFilter()**参数:*LPSTR lpDIBBits-指向源DIB图像指针*LONG lWidth-源图像宽度(象素数)*LONG lHeight-源图像高度(象素数)*int iFilterH-滤波器的高度*int iFilterW-滤波器的宽度*int iFilterMX-滤波器的中心元素X坐标*int iFilterMY-滤波器的中心元素Y坐标**返回值:*BOOL-成功返回TRUE,否则返回FALSE。

**说明:*该函数对DIB图像进行中值滤波。

*************************************************************************/ BOOL WINAPI MedianFilter(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,int iFilterH,int iFilterW,int iFilterMX,int iFilterMY){//指向源图像的指针unsigned char*lpSrc;//指向要复制区域的指针unsigned char*lpDst;//指向复制图像的指针LPSTR lpNewDIBBits;HLOCAL hNewDIBBits;//指向滤波器数组的指针unsigned char*aValue;HLOCAL hArray;//循环变量LONG i;LONG j;LONG k;LONG l;//图像每行的字节数LONG lLineBytes;//计算图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*8);//暂时分配内存,以保存新图像hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight);//判断是否内存分配失败if(hNewDIBBits==NULL){//分配内存失败return FALSE;}//锁定内存lpNewDIBBits=(char*)LocalLock(hNewDIBBits);//初始化图像为原始图像memcpy(lpNewDIBBits,lpDIBBits,lLineBytes*lHeight);//暂时分配内存,以保存滤波器数组hArray=LocalAlloc(LHND,iFilterH*iFilterW);//判断是否内存分配失败if(hArray==NULL){//释放内存LocalUnlock(hNewDIBBits);LocalFree(hNewDIBBits);//分配内存失败return FALSE;}//锁定内存aValue=(unsigned char*)LocalLock(hArray);//开始中值滤波//行(除去边缘几行)for(i=iFilterMY;i<lHeight-iFilterH+iFilterMY+1;i++){//列(除去边缘几列)for(j=iFilterMX;j<lWidth-iFilterW+iFilterMX+1;j++){//指向新DIB第i行,第j个象素的指针lpDst=(unsigned char*)lpNewDIBBits+lLineBytes*(lHeight-1-i)+j;//读取滤波器数组for(k=0;k<iFilterH;k++){for(l=0;l<iFilterW;l++){//指向DIB第i-iFilterMY+k行,第j-iFilterMX+l个象素的指针lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i+iFilterMY-k)+j-iFilterMX+l;//保存象素值aValue[k*iFilterW+l]=*lpSrc;}}//获取中值*lpDst=GetMedianNum(aValue,iFilterH*iFilterW);}}//复制变换后的图像memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight);//释放内存LocalUnlock(hNewDIBBits);LocalFree(hNewDIBBits);LocalUnlock(hArray);LocalFree(hArray);//返回return TRUE;}均值滤波:/************************************************************************** *函数名称:*GetMedianNum()**参数:*unsigned char*bpArray-指向要获取中值的数组指针*int iFilterLen-数组长度**返回值:*unsigned char-返回指定数组的中值。

**说明:*该函数用冒泡法对一维数组进行排序,并返回数组元素的中值。

*************************************************************************/ unsigned char WINAPI GetMedianNum(unsigned char*bArray,int iFilterLen){//循环变量int i;int j;//中间变量unsigned char bTemp;//用冒泡法对数组进行排序for(j=0;j<iFilterLen-1;j++){for(i=0;i<iFilterLen-j-1;i++){if(bArray[i]>bArray[i+1]){//互换bTemp=bArray[i];bArray[i]=bArray[i+1];bArray[i+1]=bTemp;}}}//计算中值if((iFilterLen&1)>0){//数组有奇数个元素,返回中间一个元素bTemp=bArray[(iFilterLen+1)/2];} else{//数组有偶数个元素,返回中间两个元素平均值bTemp=(bArray[iFilterLen/2]+bArray[iFilterLen/2+1])/2;}//返回中值return bTemp;}///<summary>9///中值滤波算法处理10///</summary>11///<param name="bmp">原始图片</param>12///<param name="bmp">是否是彩色位图</param>13///<param name="windowRadius">过滤半径</param>14public Bitmap ColorfulBitmapMedianFilterFunction(Bitmap srcBmp,int windowRadius, bool IsColorfulBitmap)15{16if(windowRadius<1)17{18throw new Exception("过滤半径小于1没有意义");19}20//创建一个新的位图对象21Bitmap bmp=new Bitmap(srcBmp.Width,srcBmp.Height);2223//存储该图片所有点的RGB值24byte[,]mR,mG,mB;25mR=new byte[srcBmp.Width,srcBmp.Height];26if(IsColorfulBitmap)27{28mG=new byte[srcBmp.Width,srcBmp.Height];29mB=new byte[srcBmp.Width,srcBmp.Height];30}31else32{33mG=mR;34mB=mR;35}3637for(int i=0;i<=srcBmp.Width-1;i++)38{39for(int j=0;j<=srcBmp.Height-1;j++)40{41mR[i,j]=srcBmp.GetPixel(i,j).R;42if(IsColorfulBitmap)43{44mG[i,j]=srcBmp.GetPixel(i,j).G;45mB[i,j]=srcBmp.GetPixel(i,j).B;46}47}48}4950mR=MedianFilterFunction(mR,windowRadius);51if(IsColorfulBitmap)52{53mG=MedianFilterFunction(mG,windowRadius);54mB=MedianFilterFunction(mB,windowRadius);55}56else57{58mG=mR;59mB=mR;60}61for(int i=0;i<=bmp.Width-1;i++)62{63for(int j=0;j<=bmp.Height-1;j++)64{65bmp.SetPixel(i,j,Color.FromArgb(mR[i,j],mG[i,j],mB[i,j]));66}67}68return bmp;69}7071///<summary>72///对矩阵M进行中值滤波73///</summary>74///<param name="m">矩阵M</param>75///<param name="windowRadius">过滤半径</param>76///<returns>结果矩阵</returns>77private byte[,]MedianFilterFunction(byte[,]m,int windowRadius)78{79int width=m.GetLength(0);80int height=m.GetLength(1);8182byte[,]lightArray=new byte[width,height];8384//开始滤波85for(int i=0;i<=width-1;i++)86{87for(int j=0;j<=height-1;j++)88{89//得到过滤窗口矩形90Rectangle rectWindow=new Rectangle(i-windowRadius,j-windowRadius,2* windowRadius+1,2*windowRadius+1);91if(rectWindow.Left<0)rectWindow.X=0;92if(rectWindow.Top<0)rectWindow.Y=0;93if(rectWindow.Right>width-1)rectWindow.Width=width-1-rectWindow.Left;94if(rectWindow.Bottom>height-1)rectWindow.Height=height-1-rectWindo w.Top;95//将窗口中的颜色取到列表中96List<byte>windowPixelColorList=new List<byte>();97for(int oi=rectWindow.Left;oi<=rectWindow.Right-1;oi++)98{99for(int oj=rectWindow.Top;oj<=rectWindow.Bottom-1;oj++)100{101windowPixelColorList.Add(m[oi,oj]);102}103}104//排序105windowPixelColorList.Sort();106//取中值107byte middleValue=0;108if((windowRadius*windowRadius)%2==0)109{110//如果是偶数111middleValue=Convert.ToByte((windowPixelColorList[windowPixelColorList.C ount/2]+windowPixelColorList[windowPixelColorList.Count/2-1])/2);112}113else114{115//如果是奇数116middleValue=windowPixelColorList[(windowPixelColorList.Count-1)/2]; 117}118//设置为中值119lightArray[i,j]=middleValue;120}121}122return lightArray;123}MATLAB算法实现的方法一个均值滤波的例子:I=imread('cameraman.tif');%读入图像J=imnoise(I,'salt&pepper',0.02);%给图像添加椒盐噪声K=imnoise(I,'gaussian',0,0.005);%给图像添加均值为0,方差为0.005的高斯噪声subplot(231),imshow(I)title('原图像')subplot(232),imshow(J)title('添加椒盐噪声图像')subplot(233),imshow(K)title('添加高斯噪声图像')subplot(234),imshow(I)title('原图像')K1=filter2(fspecial('average',3),J)/255;%使用3×3模板均值滤波subplot(235),imshow(K1)title('3*3椒盐噪声均值滤波')K2=filter2(fspecial('average',3),K)/255;%使用3×3模板均值滤波subplot(236),imshow(K2)title('3*3高斯噪声均值滤波')一个中值滤波的例子:I=imread('cameraman.tif');%读入图像J=imnoise(I,'salt&pepper',0.02);%给图像添加椒盐噪声K=imnoise(I,'gaussian',0,0.005);%给图像添加均值为0,方差为0.005的高斯噪声subplot(231),imshow(I)title('原图像')subplot(232),imshow(J)title('添加椒盐噪声图像')subplot(233),imshow(K)title('添加高斯噪声图像')subplot(234),imshow(I)title('原图像')K1=medfilt2(J,[3,3]);%使用3×3模板中值滤波subplot(235),imshow(K1)title('3*3椒盐噪声中值滤波')K2=medfilt2(K,[3,3]);%使用3×3模板中值滤波subplot(236),imshow(K2)title('3*3高斯噪声中值滤波')3、均值滤波与中值滤波的对比I=imread('cameraman.tif');%读入图像J=imnoise(I,'salt&pepper',0.02);%给图像添加椒盐噪声K=imnoise(I,'gaussian',0,0.005);%给图像添加均值为0,方差为0.005的高斯噪声subplot(331),imshow(I)title('原图像')subplot(332),imshow(J)title('添加椒盐噪声图像')subplot(333),imshow(K)title('添加高斯噪声图像')subplot(334),imshow(I)title('原图像')K1=filter2(fspecial('average',3),J)/255;%使用3×3模板均值滤波subplot(335),imshow(K1)title('3*3椒盐噪声均值滤波')K2=filter2(fspecial('average',3),K)/255;%使用3×3模板均值滤波subplot(336),imshow(K2)title('3*3高斯噪声均值滤波')subplot(337),imshow(I)title('原图像')K3=medfilt2(J,[3,3]);%使用3×3模板中值滤波subplot(338),imshow(K3)title('3*3椒盐噪声中值滤波')K4=medfilt2(K,[3,3]);%使用3×3模板中值滤波subplot(339),imshow(K4)title('3*3高斯噪声中值滤波')。

相关主题