西安工业大学opencv大作业Word格式文档下载.docx
《西安工业大学opencv大作业Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西安工业大学opencv大作业Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。
3、椒盐(Saltandpepper)噪声:
主要是图像切割引起的黑图像上的白点噪声或光电转换过程中产生泊松噪声。
4、量化噪声:
此类噪声与输入图像信号无关,是量化过程存在量化误差,再反映到接收端而产生,其大小显示出数字图像和原始图像差异。
本文为了分析不同去噪方法的应用范围,将原图像分别加入高斯噪声及椒盐噪声,运用Matalab编程实现两种不同滤波方法的去噪结果,并据此进行比较得出相应结论。
下面几幅图为本文所选用的经过灰度变换后得到的图像、添加椒盐噪声和高斯噪声后的图像:
2.去噪的三种常用方法
2.1.均值滤波
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。
其基本原理是用均值替代原图像中的各个像素值,即对待处理的当前像素点
选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点
作为处理后图像在该点上的灰度
即
其中,
为模板,
为该模板中包含当前像素在内的像素总个数。
如下即分别为用中值滤波对加有高斯噪声、椒盐噪声、的图像处理后的对比图:
2.2.中值滤波
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。
其实现原理如下:
将某个像素邻域中的像素按灰度值进行排序,然后选择该序列的中间值作为输出的像素值,让周围像素灰度值的差比较大的像素改取与周围的像素值接近的值,从而可以消除孤立的噪声点。
其具体的操作是:
首先确定一个以某个像素为中心点的领域,一般为方形领域(如3*3、5*5的矩形领域),然后将领域中的各个像素的灰度值进行排序。
假设其排序为:
取排好序的序列的中间值作
为中心点像素灰度的新值,这里的邻域通常被称为窗口。
当窗口在图像中上下左右进行移动后,利用中值滤波算法可以很好地对图像进行平滑处理。
如下即分别为用中值滤波对加有高斯噪声、椒盐噪声的图像处理后的对比图:
2.3高斯滤波
由于高斯函数的傅立叶变换仍是高斯函数,因此高斯函数能构成一个在频域具有平滑性能的低通滤波器。
可以通过在频域做乘积来实现高斯滤波。
均值滤波是对是对信号进行局部平均,以平均值来代表该像素点的灰度值。
矩形滤波器(AveragingBoxFilter)对这个二维矢量的每一个分量进行独立的平滑处理。
通过计算和转化,得到一幅单位矢量图。
这个512×
512的矢量图被划分成一个8×
8的小区域,再在每一个小区域中,统计这个区域内的主要方向,亦即将对该区域内点方向数进行统计,最多的方向作为区域的主方向。
于是就得到了一个新的64×
64的矢量图。
这个新的矢量图还可以采用一个3×
3模板进行进一步的平滑。
3.结果对比与分析
根据以上实验结果进行对比分析,可以得出以下结论:
(1)对于均值滤波,由以上处理后的图像可以看到:
均值滤波对高斯噪声的抑制是比较好的,处理后的图像边缘模糊较少。
但对椒盐噪声的影响不大,因为在削弱噪声的同时整幅图像内容总体也变得模糊,其噪声仍然存在。
(2)对于中值滤波,由图像处理的结果可以看出,它只影响了图像的基本信息,说明中值滤波对高斯噪声的抑制效果不明显。
这是因为高斯噪声使用随机大小的幅值污染所有的点,因此无论怎样进行数据选择,得到的始终还是被污染的值。
而由图还可以看出,中值滤波对去除“椒盐”噪声可以起到很好的效果,因为椒盐噪声只在画面中的部分点上随机出现,所以根据中值滤波原理可知,通过数据排序的方法,将图像中未被噪声污染的点代替噪声点的值的概率比较大,因此噪声的抑制效果很好,同时画面的轮廓依然比较清晰。
由此看来,对于椒盐噪声密度较小时,尤其是孤立噪声点,用中值滤波的效果非常好的。
均值滤波对高斯噪声有较好的抑制作用,而对于椒盐噪声的处理中值滤波要略微有优势。
中值滤波使得那些更亮(或者更暗)的点更像他周围的值。
所以它在滤除噪音的同时,可以较好地保留细节轮廓。
为了验证上述结论,我先给一幅图像加入椒盐噪声,然后用分别用中值滤波、均值滤波处理图像,进行对比:
带噪声图像均值滤波
4.设计总结
八周的opencv的学习,在老师的指导和同学相互帮助下,我学到了不少东西。
针对本次大实验,我已经比较熟悉opencv,通过前几次对opencv的学习,能操作一些基本的图像显示,及其基本的图像处理,这次对图像复原和增强进行处理,通过查阅资料,比较了他们方法之间的优点和缺点,对我重新认识了opencv对图像处理的能力,虽然仍有很多未学会,在编码阶段也遇到过一些困难,不过经过询问都一一解决,通过对这门课的实践学习让我意识到理论学习很重要,更重要的是让我看到了将理论与实际相结合,看到了将理论与实际相结合才能更好的发挥理论的作用和产生实际的效果,才更能发挥我们所学的知识的作用,更好的掌握理论知识和提高实践能力。
5.参考资料
[1]《学习OpenCV中文版》,译者:
于仕琪
刘瑞祯,清华大学出版社
6.程序源代码
#include"
cv.h"
highgui.h"
#include<
iostream>
usingnamespacestd;
boolFilterAV(IplImage*&
image,intk);
boolFilterAV2(IplImage*&
boolFilterMid(IplImage*&
boolFilterMid2(IplImage*&
boolFeatureTrack(IplImage*&
image);
boolEdgeTrack(IplImage*&
image,intthreshold1,intthreshold2);
intmain(intargc,char*argv[])//argc指变量的个数,*argv指向字符变量
{
IplImage*img=0;
intheight,width,step,channels;
uchar*data;
//载入图像
//img=cvLoadImage("
OpenCvDemo.jpg"
0);
//转化为单通道,灰度图像5
img=cvLoadImage("
if(!
img)
printf("
couldnotloadimagefile:
%s\n"
"
);
exit(0);
}
//获取图像数据
height=img->
height;
width=img->
width;
step=img->
widthStep;
channels=img->
nChannels;
data=(uchar*)img->
imageData;
processinga%dx%dimagewith%dchannels\n"
height,width,channels);
//创建窗口
cvNamedWindow("
mainWin"
CV_WINDOW_AUTOSIZE);
cvMoveWindow("
100,100);
//移动窗口,以屏幕左上角的起点的偏移量
//FilterAV2(img,3);
//FilterAV(img,3);
//FilterMid(img,3);
//FilterMid2(img,3);
FeatureTrack(img);
//EdgeTrack(img,60,80);
//显示图像
cvShowImage("
img);
//waitforakey
cvWaitKey(0);
//releasetheimage
cvReleaseImage(&
img);
return0;
image,intk)
{//均值滤波
IplImage*image2=cvCreateImage(cvSize(image->
width,image->
height),image->
depth,1);
uchar*p=(uchar*)image2->
//申请image2图像空间
intm=(k-1)/2;
for(intx=m;
xheight-m;
++x)
for(inty=m;
ywidth-m;
++y)
intSumData=0;
for(inti=-m;
i
for(intj=-m;
j
{//k为奇数,计算k*k区域的灰度和
SumData+=(int)((uchar*)image->
imageData)[(x+i)*image->
widthStep+y+j];
p[x*image->
widthStep+y]=SumData/(k*k);
image=cvCloneImage(image2);
//拷贝给原图像
image2);
//销毁临时变量
returntrue;
{//调用cvSmooth函数实现
IplImage*dstImage=0;
dstImage=cvCreateImage(cvGetSize(image),image->
cvSmooth(image,dstImage,CV_BLUR,k,k);
//CV_BLUR在3*3大小进行均值滤波
image=cvCloneImage(dstImage);
dstImage);
{//中值滤波函数
uchar*ImagePix=(uchar*)image2->
ucharPixArray[100];
intt=0;
for(intj=-m;
{//赋值操作
PixArray[t++]=((uchar*)image->
for(inti=0;
for(intj=0;
{//起泡法快速排序
if(PixArray[j]>
PixArray[j+1])
uchark=PixArray[j];
PixArray[j]=PixArray[j+1];
PixArray[j+1]=k;
ImagePix[x*image->
widthStep+y]=PixArray[(k*k-1)/2];
//IplImage*dstImage=0;
//dstImage=cvCreateImage(cvGetSize(image),image->
//cvSmooth(image,dstImage,CV_MEDIAN,k,k);
////CV_BLUR在3*3大小进行均值滤波
//image=cvCloneImage(dstImage);
//cvReleaseImage(&
cvSmooth(image,image,CV_MEDIAN,k,k);
//角点检测与边缘检测
image)
CvPoint2D32fcorners[100000];
intCornerCount=0;
IplImage*corners1=0,*corners2=0;
corners1=cvCreateImage(cvGetSize(image),image->
depth,1);
corners2=cvCreateImage(cvGetSize(image),image->
cvGoodFeaturesToTrack(image,corners1,corners2,corners,&
CornerCount,0.05,20,0);
cout<
<
"
Trackover!
;
//drawcirclesateachcornerlocationinthegrayimageand
//printoutalistthecorners
cvCircle(image,cvPoint((int)corners[i].x,(int)corners[i].y),5,cvScalar(255,255,255),2);
corners1);
corners2);
image,intthreshold1,intthreshold2)
IplImage*edge=0;
edge=cvCreateImage(cvGetSize(image),image->
//cvNot(image,edge);
//数组取反操作,没用我觉得
cvCanny(image,image,threshold1,threshold2,3);
//threshold1,threshold2中较小的控制边缘连接,大的控制边缘的初始分割