opencv图像去噪实验说课讲解.docx
- 文档编号:7590448
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:30
- 大小:3.10MB
opencv图像去噪实验说课讲解.docx
《opencv图像去噪实验说课讲解.docx》由会员分享,可在线阅读,更多相关《opencv图像去噪实验说课讲解.docx(30页珍藏版)》请在冰豆网上搜索。
opencv图像去噪实验说课讲解
实验名称
实验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;k<8000;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;k<8000;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;k<8000;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*5
IplImage*ArithmeticMeanFilter(IplImage*src)
{
IplImage*dst=cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
cvSmooth(src,dst,CV_BLUR,5);
returndst;
}
//几何均值滤波器——模板大小5*5
IplImage*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;i
for(intj=0;j
mul[0]=1.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&&row 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*5 IplImage*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;i for(intj=0;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&&row 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*5 IplImage*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;i for(intj=0;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&&row 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,src->nChannels); cvSmooth(src,dst,CV_BLUR,7); introw,col; inth=src->height; intw=src->width; intmn; doubleZxy; doubleZmed; doubleSxy; doubleSl; doubleSn=100; for(inti=0;i for(intj=0;j CvScalarxy=cvGet2D(src,i,j); Zxy=xy.val[0]; CvScalardxy=cvGet2D(dst,i,j); Zmed=dxy.val[0]; Sl=0; mn=0; for(intm=-3;m<=3;m++){ row=i+m; for(intn=-3;n<=3;n++){ col=j+n; if(row>=0&&row CvScalars=cvGet2D(src,row,col); Sxy=s.val[0]; Sl=Sl+pow(Sxy-Zmed,2); mn++; } } } Sl=Sl/mn; CvScalard; d.val[0]=Zxy-Sn/Sl*(Zxy-Zmed); cvSet2D(dst,i,j,d); } } returndst; } 实验结果如图: 4、实验步骤: 自适应中值滤波(以椒盐噪声为例),先为灰度图像添加椒盐噪声,再利用7*7尺寸的模板对图像进行自适应中值滤波。 核心代码如下: IplImage*SelfAdaptMedianFilter(IplImage*src){ IplImage*dst=cvCreateImage(cvGetSize(src),src->depth,src->nChannels); introw,col; inth=src->height; intw=src->width; doubleZmin,Zmax,Zmed,Zxy,Smax=7; intwsize; //计算每个像素的去噪后color值 for(inti=0;i for(intj=0;j //统计邻域 wsize=1; while(wsize<=3){ Zmin=255.0; Zmax=0.0; Zmed=0.0; CvScalarxy=cvGet2D(src,i,j); Zxy=xy.val[0]; intmn=0; for(intm=-wsize;m<=wsize;m++){ row=i+m; for(intn=-wsize;n<=wsize;n++){ col=j+n; if(row>=0&&row CvScalars=cvGet2D(src,row,col); if(s.val[0]>Zmax){ Zmax=s.val[0]; } if(s.val[0] Zmin=s.val[0]; } Zmed=Zmed+s.val[0]; mn++; } } } Zmed=Zmed/mn; CvScalard; if((Zmed-Zmin)>0&&(Zmed-Zmax)<0){ if((Zxy-Zmin)>0&&(Zxy-Zmax)<0){ d.val[0]=Zxy; }else{ d.val[0]=Zmed; } cvSet2D(dst,i,j,d); break; }else{ wsize++; if(wsize>3){ CvScalard; d.val[0]=Zmed; cvSet2D(dst,i,j,d); break; } } } } } returndst; } 实验结果如图: 5、实验步骤: 利用OpenCV对彩色图像RGB三个通道的像素进行操作,利用算术均值滤波器和几何均值滤波器进行彩色图像去噪。 模板大小为5*5。 实验代码参照问题一,选择彩色图片、算术均值滤波器和几何均值滤波器进行彩色图像去噪。 实验结果如下图(以椒盐噪声为例): 利用算术均值滤波器: 利用几何均值滤波器: 实验中的问题 实验问题: 几何均值滤波以及谐波、逆谐波滤波没有对应的库函数 解决方法: 通过学习书本对应章节,根据公式写出程序 实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- opencv 图像 实验 讲解