图像去噪.docx
《图像去噪.docx》由会员分享,可在线阅读,更多相关《图像去噪.docx(11页珍藏版)》请在冰豆网上搜索。
![图像去噪.docx](https://file1.bdocx.com/fileroot1/2023-4/21/df1abcea-a3ec-45d0-a05e-2a25b4cd7578/df1abcea-a3ec-45d0-a05e-2a25b4cd75781.gif)
图像去噪
面向对象分析与设计大作业
(数字图像去噪)
学院:
计算机科学与工程学院
班级:
学生姓名:
学号:
指导老师:
张广渊
提交日期:
2014/4/14
山东交通学院
数字图像处理课程实验报告
实验题目:
___数字图像去噪_______
姓名:
______
学号:
______
班级:
_____
指导教师:
__张广渊_
实验概述
【实验目的及要求】
1.编写平滑滤波及中值滤波的C语言程序以及相应的显示程序来实现对图像的去噪。
2.创建3*3的加权模板,对指定图象进行平滑滤波增强,将增强后的图象显示于屏幕上,比较增强的效果。
3.创建3*3的模板,对指定图象进行中值滤波增强,将增强后的图象显示于屏幕上,比较增强的效果。
【实验原理】
平滑(均值)滤波原理:
在图像上对目标像素给一个加权滑动模板,再用模板中的对应像素点乘权值后求和再求平均值。
中值滤波原理:
设置一个奇数点的滑动模板,对当前模板下的像素灰度值进行排序将模板中心点的像素值用排序后的中值代替。
【实验环境】
VC6.0下安装Openvc1.0
配置Windows环境变量
检查C:
\ProgramFiles\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。
加入后需要注销当前Windows用户(或重启)后重新登陆才生效。
(可以在任务管理器里重启explorer.exe)
配置VisualC++6.0
全局设置
菜单Tools->Options->Directories:
先设置lib路径,选择Libraryfiles,在下方填入路径:
C:
\ProgramFiles\OpenCV\lib
然后选择includefiles,在下方填入路径:
C:
\ProgramFiles\OpenCV\cxcore\include
C:
\ProgramFiles\OpenCV\cv\include
C:
\ProgramFiles\OpenCV\cvaux\include
C:
\ProgramFiles\OpenCV\ml\include
C:
\ProgramFiles\OpenCV\otherlibs\highgui
C:
\ProgramFiles\OpenCV\otherlibs\cvcam\include
然后选择sourcefiles,在下方填入路径:
C:
\ProgramFiles\OpenCV\cv\src
C:
\ProgramFiles\OpenCV\cxcore\src
C:
\ProgramFiles\OpenCV\cvaux\src
C:
\ProgramFiles\OpenCV\otherlibs\highgui
C:
\ProgramFiles\OpenCV\otherlibs\cvcam\src\windows
最后点击“ok”,完成设置。
项目设置
每创建一个将要使用OpenCV的VCProject,都需要给它指定需要的lib。
菜单:
Project->Settings,然后将Settingfor选为AllConfigurations,然后选择右边的link标签,在Object/librarymodules附加上
cxcore.libcv.libml.libcvaux.libhighgui.libcvcam.lib
如果你不需要这么多lib,你可以只添加你需要的lib。
实验内容
【实验方案设计】
1.创建工程,在工程里配置环境,添加lib标签等。
2.在main函数里写入对图像进行操作的代码。
并自定义函数ImageStretchByHistogram实现直方图变换。
3.编译,链接,执行。
4.对代码进行修改调试
【实验过程】(实验步骤、记录、数据、分析)
1.新建一个支持MVC的ConsoleApplication工程,菜单:
Project->Settings,然后将Settingfor选为AllConfigurations,然后选择右边的link标签,在Object/librarymodules附加上cxcore.libcv.libml.libcvaux.libhighgui.libcvcam.lib
2.在工程目录下放置一个图片test.jpg
3.在cpp文件下添加显示图像代码:
#include"stdafx.h"
#include"cv.h"
#include"highgui.h"
#include
#include
usingnamespacestd;
#defineN3//模板大小,这里可以自行调整
intfilter[N][N]={{1,2,1},{2,4,2},{1,2,1}};//模板
//获取像素点的灰度值
inlineintpixel8Int(IplImage*img,intx,inty)
{
return((uchar*)(img->imageData+x*img->widthStep))[y];
}
//设置像素点的灰度值
inlinevoidsetPixelVal(IplImage*img,intx,inty,intval)
{
((uchar*)(img->imageData+x*img->widthStep))[y]=val;
}
//obtainthesumoftheweight
intweight()
{
intw=0;
for(intix=0;ixfor(intiy=0;iyw+=filter[ix][iy];
returnw;
}
//加权求值并赋值给对应中心的像素
intsmooth_compute(IplImage*src,intx,inty)
{
intvalue=0;
inttmp=(N-1)/2;
for(intix=0;ix{
for(intiy=0;iyvalue+=filter[ix][iy]*pixel8Int(src,x-tmp+ix,y-tmp+iy);//对应像素点乘权值后求和
}
returnvalue;
}
//对当前模板下的像素灰度值进行排序,取中间值...这里采用c++中库中提供的sort()
intmedian_compute(IplImage*src,intx,inty)
{
inttmp=(N-1)/2;
vectortamp;
for(intix=0;ixfor(intiy=0;iy{
intval=pixel8Int(src,x-tmp+ix,y-tmp+iy);
tamp.push_back(val);
}
vector:
:
iteratorfirst=tamp.begin();
vector:
:
iteratorlast=tamp.end();
sort(first,last);//默认是升序排列
returntamp[(N*N+1)/2];
}
/**利用如下3*3的加权模板创建平滑滤波器,对图像进行平滑处理并去噪
-------------
|1|2|1|
-------------
|2|4|2|
-------------
|1|2|1|
-------------
对于边界问题,处理方法一般有两种方法:
(1)补全边界点;即在边界复制一行或一列,这样在处理边界时会出现不良效果
(2)限制中心点的范围;在遍历图像像素时,如果模板边界与图像边界重合时,以此为最大范围
对于n*n的模板而言,中心点必须限制在距离图像边界不小于(n-1)/2个像素处
注:
此处采用第二种简单的处理方式
**/
voidsmoothFilter(IplImage*src,IplImage*dst)
{
inttmp=(N-1)/2;
for(intix=tmp;ixheight-tmp;++ix)
{
for(intiy=tmp;iywidth-tmp;++iy)
{
intval=smooth_compute(src,ix,iy)/weight();
setPixelVal(dst,ix,iy,val);
}
}
}
/**
中值滤波器:
对模板n*n范围的像素值进行排序,将中间值赋给中心点像素
注:
同样选择3*3模板
**/
voidmedianFilter(IplImage*src,IplImage*dst)
{
inttmp=(N-1)/2;
for(intix=tmp;ixheight-tmp;++ix)
{
for(intiy=tmp;iywidth-tmp;++iy)
{
intval=median_compute(src,ix,iy);
setPixelVal(dst,ix,iy,val);
}
}
}
intmain(intargc,char*argv[])
{
IplImage*src1,*src2,*dst1,*dst2;
cvNamedWindow("smoothFilter_test");
cvNamedWindow("medianFilter_test");
//smoothfilterprocesstheimage
if((src1=cvLoadImage("4.jpg",0))!
=NULL)
{
dst1=cvCreateImage(cvGetSize(src1),src1->depth,src1->nChannels);
cvCopy(src1,dst1);
smoothFilter(src1,dst1);
cvShowImage("smoothFilter_test",dst1);
}
//medianfilterprocesstheimage
if((src2=cvLoadImage("4.jpg",0))!
=NULL)
{
dst2=cvCreateImage(cvGetSize(src2),src2->depth,src2->nChannels);
cvCopy(src2,dst2);
medianFilter(src2,dst2);
cvShowImage("medianFilter_test",dst2);
}
cvWaitKey(0);
cvDestroyWindow("smoothFilter_test");
cvDestroyWindow("medianFilter_test");
cvReleaseImage(&src1);
cvReleaseImage(&src2);
cvReleaseImage(&dst1);
cvReleaseImage(&dst2);
return0;
}
3.编译,链接,执行。
【结论】
原图
运行程序显示结果平滑滤噪
运行程序显示结果中值滤噪
小结
通过本次实验,掌握了在计算机上进行图象去噪。
了解了平滑滤波原理和中值滤波原理。
指导教师评语及成绩
评语:
成绩:
指导教师签名:
批阅日期: