图像平滑的VC++60实现1.docx

上传人:b****2 文档编号:20770619 上传时间:2023-04-25 格式:DOCX 页数:55 大小:268.38KB
下载 相关 举报
图像平滑的VC++60实现1.docx_第1页
第1页 / 共55页
图像平滑的VC++60实现1.docx_第2页
第2页 / 共55页
图像平滑的VC++60实现1.docx_第3页
第3页 / 共55页
图像平滑的VC++60实现1.docx_第4页
第4页 / 共55页
图像平滑的VC++60实现1.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

图像平滑的VC++60实现1.docx

《图像平滑的VC++60实现1.docx》由会员分享,可在线阅读,更多相关《图像平滑的VC++60实现1.docx(55页珍藏版)》请在冰豆网上搜索。

图像平滑的VC++60实现1.docx

图像平滑的VC++60实现1

安阳师范学院本科学生毕业论文

几种图像平滑技术的

VC++6.0实现

 

作者秦瑞春

系(院)计算机与信息工程学院

专业计算机科学与技术

年级2010级

学号100951065

指导教师刘国英

论文成绩

日期2012年6月

 

学生诚信承诺书

本人郑重承诺:

所呈交的论文是我个人在导师指导下进行的研究工作及取得的研究成果。

尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写的研究成果,也不包含为获得安阳师范学院或其他教育机构的学位或证书所使用过的材料。

与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。

签名:

          日期:

        

论文使用授权说明

本人完全了解安阳师范学院有关保留、使用学位论文的规定,即:

学校有权保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存论文。

签名:

        导师签名:

       日期:

目录

1绪论2

1.1VC++6.0简介1

1.2数字图像处理基本概念1

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

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

1.5关于图像噪声3

2位图操作基本知识3

2.1DIBAPI类的介绍3

2.1.1DIBAPI类的实现4

2.2位图操作19

2.2.1图像读取19

2.2.2图像显示20

2.3程序源代码21

2.3.1图像读取21

2.3.2图像保存23

3图像平滑25

3.1图像平滑的目的25

3.2图像平滑的方法25

3.2.1线性平滑25

3.2.2非线性平滑26

4均值滤波26

4.1基本原理26

4.2实现方法26

4.3程序源代码28

4.3.1添加成员函数28

4.3.2添加响应函数31

4.4结果输出及分析33

4.4.1输出结果33

4.4.2结果分析33

5高斯滤波33

5.1基本原理33

5.2实现方法34

5.3程序源代码34

5.3.1添加响应函数34

5.4结果输出及分析36

5.4.1输出结果36

5.4.2结果分析36

6中值滤波37

6.1基本原理37

6.2实现方法37

6.3程序源代码37

6.3.1添加成员函数37

6.3.2添加响应函数42

6.4结果输出及分析44

6.4.1结果输出44

6.4.2结果分析44

7.结论45

8.参考文献:

46

摘要

一幅原始图像在获取和传输过程中会受到各种噪声的干扰,使图像质量下降。

退化会引起图像模糊,特征淹没,对分析图像不利。

为了抑制噪声改善图像质量进行的处理称为图像平滑或去噪。

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

本文通过介绍位图的基本操作,从而进一步引出几种降噪方法。

本文分别介绍“均值滤波”、“中值滤波”以及“高斯滤波”三种算法,实现图像降噪。

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

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

高斯滤波就是将每个像素的灰度值用其领域的加权平均值代替,该算法简单.能够有效去除高斯噪声。

“中值滤波”是常用的非线性滤波方法,它对模板中的数据采用冒泡排序由小到大排序,取排在中间位置上的数据作为最终的处理结果。

关键词:

图像降噪、滤波、均值滤波、高斯滤波、中值滤波

 

Abstract

Anoriginalimage,intheacquisitionandtransmissionprocesswillbesubjecttoavarietyofnoiseinterference,theimagedegradedquality.Degenerationcancauseimageblurring,featuresubmergedforanalyzingtheadverseimage.InordertosuppressnoisetoimproveimagequalityProcessingasimagesmoothing,ordenoising.

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

ThepaperintroducesAveragingFilter,MedianFilter,GaussianFilter.Hereweintroducethebasicprinciples,implementmethods,detailedarithmetic,andmakeanalysisthenoisereducingeffects.

AveragingFilteroperateseverypixelbyusing8pixelsmeanly.Itcanmaketheimagessmoothing,fastandeasytocalculate.Eachpixelgaussianfilteringisthegreyvalueinthefieldofweightedaverageinsteadof,thealgorithmissimple.Caneffectivelyremovegaussiannoise.MedianFilterisacommonnonlinearfilteringway.Itforthetemplatebythedatafrombubblesortorderfromsmalltolarge,takerowinthemiddlepositiondataasthefinalprocessingresults.

Keywords:

ImageNoiseReduction;Filter;AveragingFilter;MedianFilter;GaussianFilter;

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关于图像噪声

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

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

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

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

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

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

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

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

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

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

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

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

特此根据噪声性质的不同,消除噪声的方法也不同,本文将介绍“均值滤波”、“高斯滤波”、“中值滤波”三种降噪方法。

2位图操作基本知识

2.1DIBAPI类的介绍

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

所以需要使用第三方开发的DIBAPI类,在其中封装必要而有效的处理函数,该类具有的功能如下:

PaintDIB()-绘制DIB对象

CreateDIBPalette()-创建DIB对象调色板

FindDIBBits()-返回DIB图像象素起始位置

DIBWidth()-返回DIB宽度

DIBHeight()-返回DIB高度

PaletteSize()-返回DIB调色板大小

DIBNumColors()-计算DIB调色板颜色数目

SaveDIB()-将DIB保存到指定文件中

ReadDIBFile()-重指定文件中读取DIB对象

根据对DIB操作的分析,DIBAPI类的基本操作功能应包括:

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

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

2.1.1DIBAPI类的实现

(1)PaintDIB()函数:

该函数主要用来绘制DIB对象。

其中调用了StretchDIBits()或者SetDIBitsToDevice()来绘制DIB对象。

输出的设备由由参数hDC指定;绘制的矩形区域由参数lpDCRect指定;输出DIB的区域由参数lpDIBRect指定。

BOOLWINAPIPaintDIB(HDChDC,LPRECTlpDCRect,HDIBhDIB,

LPRECTlpDIBRect,CPalette*pPal)

{

LPSTRlpDIBHdr;//BITMAPINFOHEADER指针

LPSTRlpDIBBits;//DIB象素指针

BOOLbSuccess=FALSE;//成功标志

HPALETTEhPal=NULL;//DIB调色板

HPALETTEhOldPal=NULL;//以前的调色板

//判断DIB对象是否为空

if(hDIB==NULL)

{

//返回

returnFALSE;

}

//锁定DIB

lpDIBHdr=(LPSTR):

:

GlobalLock((HGLOBAL)hDIB);

//找到DIB图像象素起始位置

lpDIBBits=:

:

FindDIBBits(lpDIBHdr);

//获取DIB调色板,并选中它

if(pPal!

=NULL)

{

hPal=(HPALETTE)pPal->m_hObject;

//选中调色板

hOldPal=:

:

SelectPalette(hDC,hPal,TRUE);

}

//设置显示模式

:

:

SetStretchBltMode(hDC,COLORONCOLOR);

//判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象

if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&

(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))

{

//原始大小,不用拉伸。

bSuccess=:

:

SetDIBitsToDevice(hDC,//hDC

lpDCRect->left,//DestX

lpDCRect->top,//DestY

RECTWIDTH(lpDCRect),//nDestWidth

RECTHEIGHT(lpDCRect),//nDestHeight

lpDIBRect->left,//SrcX

(int)DIBHeight(lpDIBHdr)-

lpDIBRect->top-

RECTHEIGHT(lpDIBRect),//SrcY

0,//nStartScan

(WORD)DIBHeight(lpDIBHdr),//nNumScans

lpDIBBits,//lpBits

(LPBITMAPINFO)lpDIBHdr,//lpBitsInfo

DIB_RGB_COLORS);//wUsage

}

else

{

//非原始大小,拉伸。

bSuccess=:

:

StretchDIBits(hDC,//hDC

lpDCRect->left,//DestX

lpDCRect->top,//DestY

RECTWIDTH(lpDCRect),//nDestWidth

RECTHEIGHT(lpDCRect),//nDestHeight

lpDIBRect->left,//SrcX

lpDIBRect->top,//SrcY

RECTWIDTH(lpDIBRect),//wSrcWidth

RECTHEIGHT(lpDIBRect),//wSrcHeight

lpDIBBits,//lpBits

(LPBITMAPINFO)lpDIBHdr,//lpBitsInfo

DIB_RGB_COLORS,//wUsage

SRCCOPY);//dwROP

}

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDIB);

//恢复以前的调色板

if(hOldPal!

=NULL)

{

:

:

SelectPalette(hDC,hOldPal,TRUE);

}

//返回

returnbSuccess;

}

(2)CreateDIBPalette()函数:

该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。

这样可以用最好的颜色来显示DIB图像。

BOOLWINAPICreateDIBPalette(HDIBhDIB,CPalette*pPal)

{

//指向逻辑调色板的指针

LPLOGPALETTElpPal;

//逻辑调色板的句柄

HANDLEhLogPal;

//调色板的句柄

HPALETTEhPal=NULL;

//循环变量

inti;

//颜色表中的颜色数目

WORDwNumColors;

//指向DIB的指针

LPSTRlpbi;

//指向BITMAPINFO结构的指针(Win3.0)

LPBITMAPINFOlpbmi;

//指向BITMAPCOREINFO结构的指针

LPBITMAPCOREINFOlpbmc;

//表明是否是Win3.0DIB的标记

BOOLbWinStyleDIB;

//创建结果

BOOLbResult=FALSE;

//判断DIB是否为空

if(hDIB==NULL)

{

//返回FALSE

returnFALSE;

}

//锁定DIB

lpbi=(LPSTR):

:

GlobalLock((HGLOBAL)hDIB);

//获取指向BITMAPINFO结构的指针(Win3.0)

lpbmi=(LPBITMAPINFO)lpbi;

//获取指向BITMAPCOREINFO结构的指针

lpbmc=(LPBITMAPCOREINFO)lpbi;

//获取DIB中颜色表中的颜色数目

wNumColors=:

:

DIBNumColors(lpbi);

if(wNumColors!

=0)

{

//分配为逻辑调色板内存

hLogPal=:

:

GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors);

//如果内存不足,退出

if(hLogPal==0)

{

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDIB);

//返回FALSE

returnFALSE;

}

lpPal=(LPLOGPALETTE):

:

GlobalLock((HGLOBAL)hLogPal);

//设置版本号

lpPal->palVersion=PALVERSION;

//设置颜色数目

lpPal->palNumEntries=(WORD)wNumColors;

//判断是否是WIN3.0的DIB

bWinStyleDIB=IS_WIN30_DIB(lpbi);

//读取调色板

for(i=0;i<(int)wNumColors;i++)

{

if(bWinStyleDIB)

{

//读取红色分量

lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;

//读取绿色分量

lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;

//读取蓝色分量

lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue;

//保留位

lpPal->palPalEntry[i].peFlags=0;

}

else

{

//读取红色分量

lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed;

//读取绿色分量

lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen;

//读取红色分量

lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue;

//保留位

lpPal->palPalEntry[i].peFlags=0;

}

}

//按照逻辑调色板创建调色板,并返回指针

bResult=pPal->CreatePalette(lpPal);

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hLogPal);

//释放逻辑调色板

:

:

GlobalFree((HGLOBAL)hLogPal);

}

//解除锁定

:

:

GlobalUnlock((HGLOBAL)hDIB);

//返回结果

returnbResult;

}

(3)FindDIBBits()函数:

该函数计算DIB中图像象素的起始位置,并返回指向它的指针。

LPSTRWINAPIFindDIBBits(LPSTRlpbi)

{

return(lpbi+*

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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