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;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&&colCvScalars=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&&colCvScalars=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&&colCvScalars=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&&colCvScalars=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&&colCvScalars=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。
实验代码参照问题一,选择彩色图片、算术均值滤波器和几何均值滤波器进行彩色图像去噪。
实验结果如下图(以椒盐噪声为例):
利用算术均值滤波器:
利用几何均值滤波器:
实验中的问题
实验问题:
几何均值滤波以及谐波、逆谐波滤波没有对应的库函数
解决方法:
通过学习书本对应章节,根据公式写出程序
实验结果