完整版图像处理本科毕业设计.docx

上传人:b****6 文档编号:7042510 上传时间:2023-01-16 格式:DOCX 页数:63 大小:1.08MB
下载 相关 举报
完整版图像处理本科毕业设计.docx_第1页
第1页 / 共63页
完整版图像处理本科毕业设计.docx_第2页
第2页 / 共63页
完整版图像处理本科毕业设计.docx_第3页
第3页 / 共63页
完整版图像处理本科毕业设计.docx_第4页
第4页 / 共63页
完整版图像处理本科毕业设计.docx_第5页
第5页 / 共63页
点击查看更多>>
下载资源
资源描述

完整版图像处理本科毕业设计.docx

《完整版图像处理本科毕业设计.docx》由会员分享,可在线阅读,更多相关《完整版图像处理本科毕业设计.docx(63页珍藏版)》请在冰豆网上搜索。

完整版图像处理本科毕业设计.docx

完整版图像处理本科毕业设计

摘要

本文以VC++6.0做为编程语言,对图像降噪技术进行研究。

本文通过介绍位图的基本操作以及在图像中加入椒盐噪声的操作,从而进一步引出几种降噪方法。

本文分别介绍“均值滤波”、“中值滤波”以及“傅里叶降噪”和“小波降噪”四种算法,实现图像降噪。

详细介绍了其基本原理、实现方法以及具体算法,并对降噪效果加以比较与分析。

“均值滤波”把每个像素都用周围的8个像素来做均值操作,可以平滑图像,速度快,算法简单。

“中值滤波”是常用的非线性滤波方法,也是图像处理技术中最常用的预处理技术。

同时在“低通滤波”及“小波降噪”中分别引入“快速傅里叶变换”和“Mallat算法”,使得其取得更快速的计算,有效地解决了其计算量太大,运算时间过长的弊端,从而达到更好的综合降噪效果。

关键词:

图像降噪;滤波;傅里叶降噪;小波降噪

Abstract

TakingVC++6.0astheprogramminglanguage,thispaperisastudyaboutimagenoisereductiontechnology.Furthermore,introducingseveralnoisereducingmeasuresthroughtheintroductionofthebasicprocessingandtheoperationtoputthesaltandpeppernoiseintotheimage.

ThepaperintroducesAveragingFilter,MedianFilter,FourierLowpassFilteringandWaveletFiltertoachieveimagenoisereducing.Hereweintroducethebasicprinciples,implementmethods,detailedarithmetic,andmakecomparisonandanalysisthenoisereducingeffects.

AveragingFilteroperateseverypixelbyusing8pixelsmeanly.Itcanmaketheimagessmoothing,fastandeasytocalculate.MedianFilterFourierisacommonnonlinearfilteringwayandalsocommonpreprocessingtechniquewhenprocessingimages.IntroducingFFTandMallatAlgorithmseparatelyintoLowpassFilteringandWaveletFilter,andthenwecanmakefastercalculatingandsolvethemassivecalculatingmoreefficiently.Therefore,wecanhaveamoreeffectivenoisereducing.

Keywords:

ImageNoiseReduction;Filter;FourierFilter;Waveletfilter

毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:

所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:

     日 期:

     

指导教师签名:

     日  期:

     

使用授权说明

本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:

按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:

     日 期:

     

 

1绪论

1.1VC++6.0简介

 VC++6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C++语言的要求编写,并加入了微软提供的功能强大的MFC(MicrosoftFoundationClass)类库。

MFC中封装了大部分WindowsAPI函数和Windows控件,它包含的功能涉及到整个Windows操作系统。

MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。

另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。

因此,使用VC++提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。

1.2数字图像处理基本概念

数字图像处理(DigitalImageProcessing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。

数字图像处理的产生和迅速发展主要受三个因素的影响:

一是计算机的发展;二是数学的发展(特别是离散数学理论的创立和完善);三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增长。

20世纪20年代,图像处理首次应用于改善伦敦和纽约之间海底电缆发送的图片质量。

到20世纪50年代,数字计算机发展到一定的水平后,数字图像处理才真正引起人们的兴趣。

1964年美国喷气推进实验室用计算机对“徘徊者七号”太空船发回的大批月球照片进行处理,收到明显的效果。

20世纪60年代末,数字图像处理具备了比较完整的体系,形成了一门新兴的学科。

20世纪70年代,数字图像处理技术得到迅猛的发展,理论和方法进一步完善,应用范围更加广泛。

在这一时期,图像处理主要和模式识别及图像理解系统的研究相联系,如文字识别、医学图像处理、遥感图像的处理等。

20世纪70年代后期到现在,各个应用领域对数字图像处理提出越来越高的要求,促进了这门学科向更高级的方向发展。

特别是在景物理解和计算机视觉(即机器视觉)方面,图像处理已由二维处理发展到三维理解或解释。

近年来,随着计算机和其它各有关领域的迅速发展,例如在图像表现、科学计算可视化、多媒体计算技术等方面的发展,数字图像处理已从一个专门的研究领域变成了科学研究和人机界面中的一种普遍应用的工具。

1.3图像降噪技术研究背景及意义

随着计算机科学和图像处理技术的迅速发展,图像在医学成像、模式识别等方面取得了广泛应用。

但是,图像在形成、传输过程中,不可避免会受到噪声的干扰,而且有些图像的噪声非常严重,图像中的噪声往往和信号交织在一起,会使图像本身的细节如边界轮廓、线条等变的模糊不清。

引起噪声的原因很多,噪声的种类也很多。

因此,需要对图像进行降噪处理,便于更高层次的图像分析与理解。

如何既对图像中出现的噪声进行合理的抑制、衰减以及去除不需要的信息,又能使有用的信息得到加强,从而便于目标区分或对象解释,是图像去噪主要研究的主要任务。

1.4图像降噪的国内外研究现状

图像降噪是图像处理的一个重要环节。

目前图像噪声的取出在数字图像处理技术中的重要性愈加明显。

近年来,在小波基础上发展起来的图像去噪仍是一个值得关注的问题,在理论和实践上都具有重大的研究意义。

其中,基于中值滤波和小波变换的图像去噪小波变换是近年来兴起的信号处理技术,它具有良好的局部化分析特性和多分辨率分析特性,非常适合于图像处理。

1.5关于图像噪声

噪声是不可预测的随机信号,通常采用概率统计方法对其进行分析。

噪声对图像处理十分重要,它影响图像处理的、采集、处理的各个环节以及输出结果的全过程。

特别是图像的输入、采集噪声的抑制是十分关键的问题,若输入伴有较大的噪声,必然影响处理全过程及输出的结果。

噪声可以理解为“妨碍人们感觉器官,对所接收的信源信息理解的因素”。

噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差”。

因此将图像噪声看成是多维随机过程是合适的,因而描述噪声的方法完全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。

但在很多情况下,这样的描述方法是很复杂的,甚至是不可能的。

而实际应用往往也不必要。

通常是用其数字特征,即均值方差,相关函数等。

因为这些数字特征都可以从某些方面反映出噪声的特征。

除此之外,噪声的灰度值与其周围的灰度之间有着明显的灰度差,也正式这些明显的灰度差才造成了视觉障碍。

因此一个良好的图像处理系统,不论是模拟处理还是用计算机进行的数字处理,无不把减少最前一级的噪声作为主攻目标。

特此根据噪声性质的不同,消除噪声的方法也不同,本文将介绍“均值滤波”、“中值滤波”、“傅里叶降噪”、“小波变换”四种降噪方法。

根据噪声产生的来源,大致可以分为外部噪声和内部噪声两大类。

外部噪声是指从处理系统外来的影响,如天线干扰或电磁波从电源线窜入系统的噪声。

内部噪声则有一下几种最常见形式:

(1)由光和电的基本性质引起的噪声。

例如电流可看作电子或空穴运动,这些例子运动产生随机散粒噪声,导体中电子流动的热噪声,光量子运动的光量子噪声等。

(2)由机械运动引起的噪声。

例如,接头振动使电流不稳,磁头或磁带、磁盘抖动等。

(3)元器件期检噪声。

如光学底片的颗粒噪声,磁带、磁盘缺陷噪声,光盘的疵点噪声等。

(4)系统内部电流的噪声。

从噪声的分类方法来看是多种多样的。

但综合来说,噪声是随机产生的量,所以又可以从统计数学的观点来定义噪声。

凡是统计特性不随时间变化的噪声称为平稳的噪声,而统计特性随时间变化的噪声称作非平稳噪声。

以上所讨论的各种类型的噪声反映在图像画面上,大致可以分为两种经典的图像噪声。

若噪声的幅值基本相同,但是噪声出现的位置是随意的,称这类噪声为椒盐噪声。

若从噪声幅值大小的分布统计来看,其密度函数有高斯型、瑞利型,分别称为高斯噪声和瑞利噪声,又如频谱均匀分布的噪声称为白噪声等等。

本文着重讨论椒盐噪声。

2位图操作基本知识

2.1CDIB类的介绍

大多数图像处理都是基于与设备无关位图(DIB)来进行讨论的,而MFC中没有处理DIB位图的类,这就给编程带来了很大困难。

所以需要建立一个处理DIB位图的专用类,CDIB类,在其中封装必要而有效的处理函数,该类具有的功能如下:

VoidLoadFile(Cstringm_fileName);//装载BMP位图文件

Char*GetFileName();//返回位图文件名

DWORDGetSize();//返回位图文件的大小

UINTGetWidth();//返回位图的宽度

UINTGetHeight();//返回位图的高度

UINTGetNumberOfColors();//返回位图颜色数目

RGBQUAD*GetRGB();//返回颜色表首地址

BITMAPINFO*GetInfo();//返回图像信息结构首地址

BYTE*GetData();//返回图像数据首地址

根据对DIB操作的分析,以及参照Cbitmap的功能设计,CDIB类的基本操作功能应包括:

(1)DIB文件的读写操作;

(2)提供位图宽度、高度、颜色数目等位图相关信息;

(3)提供有关位图占据内存空间的信息,包括:

图像数据区首地址、颜色表首地址、位图信息结构首地址等信息。

2.2位图操作

2.2.1图像读取

 

N

Y

图2.1图像读取流程图

2.2.2图像显示

 

N

Y

N

图2.2图像显示流程图

2.3程序源代码

2.3.1图像读取

通过ReadDIBFile()函数实现对函数的读取,参数CFile&file,返回值HDIB。

HDIBCDIB:

:

ReadDIBFile(CFile&file)

{

BITMAPFILEHEADERbmfHeader;

HDIBhDIB;

LPBYTElpDIB;

//获取DIB(文件)长度(字节)

DWORDdwBitsSize=file.GetLength();

//尝试读取DIB文件头

if(file.Read((LPBYTE)&bmfHeader,sizeof(bmfHeader))!

=sizeof(bmfHeader))

{

//大小不对,返回NULL。

returnNULL;

}

//判断是否是DIB对象,检查头两个字节是否是"BM"

if(bmfHeader.bfType!

=DIB_HEADER_MARKER)

{

//非DIB对象,返回NULL。

returnNULL;

}

//为DIB分配内存

hDIB=(HDIB):

:

GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);

if(hDIB==0)

{

//内存分配失败,返回NULL。

returnNULL;

}

//锁定

lpDIB=(LPBYTE):

:

GlobalLock((HGLOBAL)hDIB);

//读象素

if(file.ReadHuge(lpDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!

=

dwBitsSize-sizeof(BITMAPFILEHEADER))

{

//大小不对。

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDIB);

//释放内存

:

:

GlobalFree((HGLOBAL)hDIB);

//返回NULL。

returnNULL;

}

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDIB);

//返回DIB句柄

returnhDIB;

}

2.3.2图像保存

通过ReadDIBFile()函数实现将DIB保存到指定文件中,参数HDIBhDib、CFile&file,返回值BOOL.

BOOLCDIB:

:

SaveDIB(HDIBhDib,CFile&file)

{

//Bitmap文件头

BITMAPFILEHEADERbmfHdr;

//指向BITMAPINFOHEADER的指针

LPBITMAPINFOHEADERlpBI;

if(hDib==NULL)

{

//如果DIB为空,返回FALSE

returnFALSE;

}

//读取BITMAPINFO结构,并锁定

lpBI=(LPBITMAPINFOHEADER):

:

GlobalLock((HGLOBAL)hDib);

if(lpBI==NULL)

{

//为空,返回FALSE

returnFALSE;

}

//判断是否是WIN3.0DIB

if(!

IS_WIN30_DIB(lpBI))

{

//不支持其它类型的DIB保存

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDib);

//返回FALSE

returnFALSE;

}

//填充文件头

//文件类型"BM"

bmfHdr.bfType=DIB_HEADER_MARKER;

//计算DIB大小时,最简单的方法是调用GlobalSize()函数。

但是全局内存大小并

//不是DIB真正的大小,它总是多几个字节。

这样就需要计算一下DIB的真实大小。

//文件头大小+颜色表大小

//(BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)

DWORDdwDIBSize=*(LPDWORD)lpBI+PaletteSize((LPBYTE)lpBI);

//计算图像大小

if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))

{

//对于RLE位图,没法计算大小,只能信任biSizeImage内的值

dwDIBSize+=lpBI->biSizeImage;

}

else

{

//大小为Width*Height

DWORDdwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;

//计算出DIB真正的大小

dwDIBSize+=dwBmBitsSize;

//更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)

lpBI->biSizeImage=dwBmBitsSize;

}

//计算文件大小:

DIB大小+BITMAPFILEHEADER结构大小

bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);

//两个保留字

bmfHdr.bfReserved1=0;

bmfHdr.bfReserved2=0;

//计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小

bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+PaletteSize((LPBYTE)lpBI);

//尝试写文件

TRY

{

//写文件头

file.Write((LPBYTE)&bmfHdr,sizeof(BITMAPFILEHEADER));

//写DIB头和象素

file.WriteHuge(lpBI,dwDIBSize);

}

CATCH(CFileException,e)

{

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDib);

//抛出异常

THROW_LAST();

}

END_CATCH

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDib);

//返回TRUE

returnTRUE;

}

3噪声的添加

3.1基本原理

定义Saltnoising(HDIBhDIB)类,用以封装实现添加噪声的相关函数。

设置指向源图像的指针,设置表示行、列的循环变量i,j。

在加噪过程中,存储标准图像象素信息后,生成一个为随机种子,可以为任意数或系统时间。

当dTemp>31500时,指向源图像倒数第j行,第i个象素的指针,将图像中当前点置为黑。

即完成一次噪声的添加。

3.2实现步骤

(1)取得图像大小、数据区,并把数据区复制到缓冲区;

(2)循环取得各点像素值;

(3)若产生的随机数大于特定值,把该点置黑;

(4)把缓冲区中改动的数据复制到原数据区中。

3.3程序源代码

3.3.1添加响应函数

CDIBview中添加“加入椒盐噪声”的响应函数:

oidCDIPSView:

:

OnAddnoisingSalt()

{

//TODO:

Addyourcommandhandlercodehere

CDIPSDoc*pDoc=GetDocument();

CAddNoisingaddSALT;

addSALT.Saltnoising(pDoc->GetHDIB());

Invalidate();

pDoc->SetModifiedFlag(TRUE);

}

3.3.2添加成员函数

建立CaddNoising类,其成员函数执行具体操作:

voidCAddNoising:

:

Saltnoising(HDIBhDIB)

{

//指向源图像的指针

LPSTRlpSrc;

//循环变量

longi;

longj;

//图像每行的字节数

LONGlLineBytes;

//计算图像每行的字节数

LPBYTElpDIB=(LPBYTE):

:

GlobalLock((HGLOBAL)hDIB);

LPBYTElpDIBBits;

CDIBm_add;

LONGlWidth=m_add.DIBWidth(lpDIB);

LONGlHeight=m_add.DIBHeight(lpDIB);

lpDIBBits=m_add.FindDIBBits(lpDIB);

lLineBytes=WIDTHBYTES(lWidth*8);

for(i=0;i

for(j=0;j

{

BMP_stdData[i*lLineBytes+j]=*((BYTE*)lpDIBBits+lLineBytes*i+j);

}

if(m_add.DIBBitCount(lpDIB)!

=8)

{

//prompt

MessageBox("Thisprogramcanonlyprocess8bits'image.","Prompt",MB_ICONINFORMATION|MB_OK);

//unlock

:

:

GlobalUnlock((HGLOBAL)hDIB);

}

//生成伪随机种子

srand((unsigned)2);

inttem=0;

//在图像中加噪

for(j=0;j

{

for(i=0;i

{

doubledTemp;

dTemp=rand();

if(dTemp>31500)

{

//指向源图像倒数第j行,第i个象素的指针

lpSrc=(char*)lpDIBBits+lLineBytes*j+i;

//图像中当前点置为黑

*lpSrc=0;

//tem++;

}

}

}

//charctem[20];

//sprintf(ctem,"

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

当前位置:首页 > 工作范文 > 行政公文

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

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