实验名称实验4:图像去噪实验目的1、掌握算术均值滤波器、几何均值滤波器、谐波和逆谐波均值滤波器进行图像去噪的算法2、掌握利用中值滤波器进行图像去噪的算法3、掌握自适应中值滤波算法4、掌握自适应局部降低噪声滤波器去噪算法5、掌握彩色图像去噪步骤实验内容1、均值滤波具体内容:利用OpenCV对灰度图像像素进行操作,分别利用算术均值滤波器、几何均值滤波器、谐波和逆谐波均值滤波器进行图像去噪。模板大小为5*5。(注:请分别为图像添加高斯噪声、胡椒噪声、盐噪声和椒盐噪声,并观察滤波效果)2、中值滤波具体内容:利用OpenCV对灰度图像像素进行操作,分别利用5*5和9*9尺寸的模板对图像进行中值滤波。(注:请分别为图像添加胡椒噪声、盐噪声和椒盐噪声,并观察滤波效果)3、自适应均值滤波。具体内容:利用OpenCV对灰度图像像素进行操作,设计自适应局部降低噪声滤波器去噪算法。模板大小7*7(对比该算法的效果和均值滤波器的效果)4、自适应中值滤波具体内容:利用OpenCV对灰度图像像素进行操作,设计自适应中值滤波算法对椒盐图像进行去噪。模板大小7*7(对比中值滤波器的效果)5、彩色图像均值滤波具体内容:利用OpenCV对彩色图像RGB三个通道的像素进行操作,利用算术均值滤波器和几何均值滤波器进行彩色图像去噪。模板大小为5*5。实验完成情况1、实验步骤:先为灰度图像添加高斯噪声、胡椒噪声、盐噪声和椒盐噪声,再分别利用算术均值滤波器、几何均值滤波器、谐波和逆谐波均值滤波器进行图像去噪。模板大小为5*5。核心代码如下:添加各类噪声:IplImage*AddGuassianNoise(IplImage*src)//添加高斯噪声{IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);IplImage*noise=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);CvRNGrng=cvRNG(-1);cvRandArr(&rng,noise,CV_RAND_NORMAL,cvScalarAll(0),cvScalarAll(15));cvAdd(src,noise,dst);returndst;}IplImage*AddPepperNoise(IplImage*src)//添加胡椒噪声,随机黑色点{IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);cvCopy(src,dst);for(intk=0;k8000;k++){inti=rand()%src-height;intj=rand()%src-width;CvScalars=cvGet2D(src,i,j);if(src-nChannels==1){s.val[0]=0;}elseif(src-nChannels==3){s.val[0]=0;s.val[1]=0;s.val[2]=0;}cvSet2D(dst,i,j,s);}returndst;}IplImage*AddSaltNoise(IplImage*src)//添加盐噪声,随机白色点{IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);cvCopy(src,dst);for(intk=0;k8000;k++){inti=rand()%src-height;intj=rand()%src-width;CvScalars=cvGet2D(src,i,j);if(src-nChannels==1){s.val[0]=255;}elseif(src-nChannels==3){s.val[0]=255;s.val[1]=255;s.val[2]=255;}cvSet2D(dst,i,j,s);}returndst;}IplImage*AddPepperSaltNoise(IplImage*src)//添加椒盐噪声,随机黑白点{IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);cvCopy(src,dst);for(intk=0;k8000;k++){inti=rand()%src-height;intj=rand()%src-width;intm=rand()%2;CvScalars=cvGet2D(src,i,j);if(src-nChannels==1){if(m==0){s.val[0]=255;}else{s.val[0]=0;}}elseif(src-nChannels==3){if(m==0){s.val[0]=255;s.val[1]=255;s.val[2]=255;}else{s.val[0]=0;s.val[1]=0;s.val[2]=0;}}cvSet2D(dst,i,j,s);}returndst;}各类滤波器实现://算术均值滤波器——模板大小5*5IplImage*ArithmeticMeanFilter(IplImage*src){IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);cvSmooth(src,dst,CV_BLUR,5);returndst;}//几何均值滤波器——模板大小5*5IplImage*GeometryMeanFilter(IplImage*src){IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);introw,col;inth=src-height;intw=src-width;doublemul[3];doubledc[3];intmn;//计算每个像素的去噪后color值for(inti=0;isrc-height;i++){for(intj=0;jsrc-width;j++){mul[0]=1.0;mn=0;//统计邻域内的几何平均值,邻域大小5*5for(intm=-2;m=2;m++){row=i+m;for(intn=-2;n=2;n++){col=j+n;if(row=0&&rowh&&col=0&&colw){CvScalars=cvGet2D(src,row,col);mul[0]=mul[0]*(s.val[0]==0?1:s.val[0]);//邻域内的非零像素点相乘mn++;}}}//计算1/mn次方CvScalard;dc[0]=pow(mul[0],1.0/mn);d.val[0]=dc[0];//统计成功赋给去噪后图像。cvSet2D(dst,i,j,d);}}returndst;}//谐波均值滤波器——模板大小5*5IplImage*HarmonicMeanFilter(IplImage*src){IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);introw,col;inth=src-height;intw=src-width;doublesum[3];doubledc[3];intmn;//计算每个像素的去噪后color值for(inti=0;isrc-height;i++){for(intj=0;jsrc-width;j++){sum[0]=0.0;mn=0;//统计邻域,5*5模板for(intm=-2;m=2;m++){row=i+m;for(intn=-2;n=2;n++){col=j+n;if(row=0&&rowh&&col=0&&colw){CvScalars=cvGet2D(src,row,col);sum[0]=sum[0]+(s.val[0]==0?255:255/s.val[0]);mn++;}}}CvScalard;dc[0]=mn*255/sum[0];d.val[0]=dc[0];//统计成功赋给去噪后图像。cvSet2D(dst,i,j,d);}}returndst;}//逆谐波均值大小滤波器——模板大小5*5IplImage*InverseHarmonicMeanFilter(IplImage*src){IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);//cvSmooth(src,dst,CV_BLUR,5);introw,col;inth=src-height;intw=src-width;doublesum[3];doublesum1[3];doubledc[3];doubleQ=2;//计算每个像素的去噪后color值for(inti=0;isrc-height;i++){for(intj=0;jsrc-width;j++){sum[0]=0.0;sum1[0]=0.0;//统计邻域for(intm=-2;m=2;m++){row=i+m;for(intn=-2;n=2;n++){col=j+n;if(row=0&&rowh&&col=0&&colw){CvScalars=cvGet2D(src,row,col);sum[0]=sum[0]+pow(s.val[0]/255,Q+1);sum1[0]=sum1[0]+pow(s.val[0]/255,Q);}}}//计算1/mn次方CvScalard;dc[0]=(sum1[0]==0?0:(sum[0]/sum1[0]))*255;d.val[0]=dc[0];//统计成功赋给去噪后图像。cvSet2D(dst,i,j,d);}}returndst;}实验结果如图所示:(从左至右,从上至下分别为原图像、加噪图像、算术均值处理图像、几何均值处理图像、谐波均值处理图像、逆谐波均值处理图像)(1)高斯噪声:(2)胡椒噪声:(3)盐噪声(4)椒盐噪声2、实验步骤:先为灰度图像添加胡椒噪声、盐噪声和椒盐噪声,再分别利用5*5和9*9尺寸的模板对图像进行中值滤波。核心代码如下:IplImage*MedianFilter_5_5(IplImage*src){IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);cvSmooth(src,dst,CV_MEDIAN,5);returndst;}IplImage*MedianFilter_9_9(IplImage*src){IplImage*dst=cvCreateImage(cvGetSize(src),src-depth,src-nChannels);cvSmooth(src,dst,CV_MEDIAN,9);returndst;}实验结果如下图(灰度图像和加噪图像第一问中已给出,下面只列出分别利用5*5和9*9尺寸的模板对图像进行中值滤波后的图像):灰度图像加胡椒噪声,分别利用5*5和9*9尺寸的模板对图像进行中值滤波。灰度图像加盐噪声,分别利用5*5和9*9尺寸的模板对图像进行中值滤波。灰度图像加椒盐噪声,分别利用5*5和9*9尺寸的模板对图像进行中值滤波。3、实验步骤:自适应均值滤波(以高斯噪声为例),先为灰度图像添加高斯噪声,再利用7*7尺寸的模板对图像进行自适应均值滤波。核心代码如下:IplImage*SelfAdaptMeanFilter(IplImage*src){IplImage*dst=cvCreateImage(cvGetSize(src),src-depth