opencv图像去噪实验.docx

上传人:b****6 文档编号:8441894 上传时间:2023-01-31 格式:DOCX 页数:30 大小:3.10MB
下载 相关 举报
opencv图像去噪实验.docx_第1页
第1页 / 共30页
opencv图像去噪实验.docx_第2页
第2页 / 共30页
opencv图像去噪实验.docx_第3页
第3页 / 共30页
opencv图像去噪实验.docx_第4页
第4页 / 共30页
opencv图像去噪实验.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

opencv图像去噪实验.docx

《opencv图像去噪实验.docx》由会员分享,可在线阅读,更多相关《opencv图像去噪实验.docx(30页珍藏版)》请在冰豆网上搜索。

opencv图像去噪实验.docx

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;iheight;i++){

for(intj=0;jwidth;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=0&&col

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;iheight;i++){

for(intj=0;jwidth;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=0&&col

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;iheight;i++){

for(intj=0;jwidth;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=0&&col

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;iheight;i++){

for(intj=0;jwidth;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=0&&col

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;iheight;i++){

for(intj=0;jwidth;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=0&&col

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。

实验代码参照问题一,选择彩色图片、算术均值滤波器和几何均值滤波器进行彩色图像去噪。

实验结果如下图(以椒盐噪声为例):

利用算术均值滤波器:

利用几何均值滤波器:

实验中的问题

实验问题:

几何均值滤波以及谐波、逆谐波滤波没有对应的库函数

解决方法:

通过学习书本对应章节,根据公式写出程序

实验结果

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 机械仪表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1