版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河北农业大学现代科技学院本科毕业论文(设计) 题目:学部:工程技术学部专业班级:计算机科学与技术090班学号:学生姓名:指导教师姓名:指导教师职称:讲师二〇一三年六月一日摘要随着网络时代的快速发展和社会经济的日新月异,形式多样和内容丰富的图像去噪算法是Internet世界里的主体,而且是社会不可或缺的一部分。信息多元化带来了服务的多样化,进而图像去噪系统的个性化服务设计与开发成为当今研究的重点。噪声对人的影响噪声可以理解为“妨碍人们感觉器官对所接收的信源信息理解的因素”。而图像中各种妨碍人们对其信息接受的因素即可称为图像噪声。噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差”。因此将图像噪声看成是多维随机过程是合适的,因而描述噪声的方法完全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。本文对图像去噪技术、数据存储以及传输进行了认真的研究,并将这些技术应用到图像去噪系统-点运算模块开发中。本文将首先全面运行环境、C++技术,然后分析图像去噪软件的系统结构,并对每一部分进行必要的分析,并根据该分析进行开发和改进。最后对项目实现的环境进行简单介绍,并对所有功能进行完整的测试和分析。关键词:C++,界面,图像去噪,点运算,测试ABSTRACTWiththerapiddevelopmentofthenetworkeraandthesocialandeconomicchangerapidly,variousformsandrichimagedenoisingalgorithmisthemainbodyoftheInternetworld,andisapartofsocialindispensable.Thevarietyofinformationbringsthediversificationofservices,thentheimagetothepersonalizedservicedesignanddevelopmentofnoisesystembecomesthefocusofcurrentresearch.Effectofnoiseonthenoisefactorcanbeunderstoodas"hinderthepeoplesenseorganofthesourceofthereceivedinformationunderstanding".Whiletheimagesforvariousfactorshinderthepeopletoaccepttheinformationcanbecalledimagenoise.Noisecanbedefinedas"cannotbepredictedintheory,randomerroronlybythemethodofprobabilityandstatisticstoknow".Therefore,theimagenoiseisarandomprocessasisappropriate,anddescribethenoisemethodcanborrowthestochasticprocessdescription,i.e.theprobabilitydistributionfunctionandprobabilitydensitydistributionfunction.Theimagedenoisingtechnique,datastorageandtransmissionofseriousstudy,andapplythesetechniquestoimagedenoisingsystem-pointoperationmoduledevelopment.ThispaperwillintroduceC++technologyfirstly,andthenanalysisthesystemstructureofimagedenoisingsoftware,andforeachpartofthenecessaryanalysis,andbasedontheanalysisofdevelopmentandimprovement.Finally,abriefintroductionontheprojectimplementationoftheenvironment,andtestandanalysisofcompleteforallfunctions.Keywords:C++,interface,imagedenoising,pointoperation,test目录TOC\o"1-4"\h\z\u1.绪论 11.1开发环境概述 11.1.1VisualC++6.0简介 11.1.2VisualC++6.0优点 11.1.3VisualC++6.0缺点 21.2开发语言概述 21.2.1C++简介 21.2.2C++优点 21.2.3C++缺点 22.项目概述 32.1图像灰度变换的概述 42.1.1图像灰度变换的意义 42.2图像的点运算 52.2.1灰度的线性变换 5灰度的线性变换理论基础 5灰度直方图的代码实现 52.2.2灰度的对数变换 7灰度的对数变换的理论基础 8灰度的对数变换的代码实现 82.2.3伽马变换 10伽马变换的理论基础 10伽马变换的代码实现 112.2.4灰度阈值变换 13灰度阈值变换的理论基础 13灰度阈值变换的代码实现 142.2.5分段线性变换 17分段线性变换的理论基础 17分段线性变换的代码实现 183.项目测试 223.1软件安装与启动 223.1.1软件的安装 223.1.2软件的使用 223.2测试过程 243.2.1灰度的线性变换测试 233.2.2灰度的对数变换测试 243.2.3伽马变换测试 243.2.4灰度阈值变换测试253.2.5分段线性变换测试254.总结275.致谢286.参考文献29PAGEPAGE291.绪论MFC(MicrosoftFoundationClasses),是一个微软公司提供的类库(classlibraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎。VC++是Windows下开发人员使用的专业C++SDK(SDK,StandardSoftWareDevelopKit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包。1.1开发环境概述1.1.1VisualC++6.0简介VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。VisualC++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。1.1.2VisualC++6.0优点 VisualC++6.0由Microsoft开发,它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。Microsoft的主力软件产品。VisualC++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。所以实际中,更多的是以VisualC++6.0为平台。VisualC++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。1.1.3VisualC++6.0缺点 由于C++是由C语言发展起来的,也支持C语言的编译。6.0版本是使用最多的版本,很经典。最大的缺点是对于模版的支持比较差。现在最新补丁为SP6,推荐安装,否则易出现编译时假死状态。仅支持Windows操作系统。目前发现与windows7兼容性不好,安装成功后可能会出现无法打开cpp文件的现象。1.2开发语言概述1.2.1C++简介在C基础上,一九八三年又由贝尔实验室的BjarneStrou-strup推出了C++。C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。C++目前流行的编译器最新版本是BorlandC++4.5,SymantecC++6.1,和MicrosoftVisualC++2012。C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“CwithClasses”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtualfunction)、运算符重载(operatoroverloading)、多重继承(multipleinheritance)、模板(template)、异常(exception)、RTTI、命名空间[1](namespace)逐渐被加入标准。1.2.2C++优点C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。·C++设计成直接的和广泛的支持多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。·C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。·C++设计成尽可能与C兼容,借此提供一个从C到C++的平滑过渡。·C++避免平台限定或没有普遍用途的特性。·C++不使用会带来额外开销的特性。·C++设计成无需复杂的程序设计环境。出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,BjarneStroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈述。C++在一定程度上可以和C语言很好的结合,甚至目前大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言,具有相当高的性能。C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。1.2.3C++缺点C++由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。由于本身的复杂性,复杂的C++程序的正确性相当难于保证。也有人提出不支持多线程的原语等缺陷。不过有如此多的知名人士提出了如此多的缺陷,正说明C++被广泛使用和成功。c++语言由于过度的复杂性,以及与unix的文化相抵触,在unix/linux领域受到很多著名人士(比如Linux之父linustorvalds与著名黑客EricS.Raymond)的强烈批评与抵制。2.项目概述2.1图像灰度变换的概述一幅完整的图像,是由红色绿色蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。通道是整个Photoshop显示图像的基础。色彩的变动,实际上就是间接在对通道灰度图进行调整。通道是Photoshop处理图像的核心部分,所有的色彩调整工具都是围绕在这个核心周围使用的。在计算机领域中,灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。得到过程:灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的。用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度。这种精度刚刚能够避免可见的条带失真,并且非常易于编程。在医学图像与遥感图像这些技术应用中经常采用更多的级数以充分利用每个采样10或12位的传感器精度,并且避免计算时的近似误差。在这样的应用领域每个采样16位即65536级得到流行。2.1.1图像灰度变换的意义对于一个数字图像处理系统来说,一般可以将处理流程分为3个阶段。在获取原始图像后,首先是图像的预处理阶段,其次是特征抽取阶段,最后才是识别分析阶段。预处理阶段尤为重要,这个阶段处理不好则直接导致后面的工作无法展开。点运算指的是对图像中的每个像素依次进行同样的灰度变换运算。设r和s分别是输入图像f(x,y)和输出图像g(x,y)在任一点(x,y)的灰度值,则点运算可以使用下式定义:s=T(r)其中,T为所用的点运算算子,表示在原始图像和输出图像之间的某种灰度级映射关系。点运算常常用于改变图像的灰度范围及分布,是图像数字化及图像显示时常常需要的工具。点运算因其作用的性质有时也被称为对比度增强、对比度拉伸或灰度变换。作为点运算算法的重要内容之一,即数据在后台的处理,需要详细了解点运算的各种算法以及C++语法,并设计相应的模块。2.2图像的点运算2.2.1灰度的线性变换灰度的线性变换理论基础线性灰度变换函数f(x)是一个一维线性函数:Db=f(Da)=faDa+fb式中参数fa为线性函数的斜率,fb为线性函数在y轴的截距,Da表示输入图像的灰度。表示输出图像的灰度。其中:1>当fa>1时,输出图像的对比度将增大;当fa<1时,输出图像的对比度将减小。2>当fa=1且fb!=0时,操作仅使所有像素的灰度值上移或下移,其效果是使整个图像更暗或更亮;如fa<0,暗区域将变亮,亮区域将变暗。这种线性改变亮度的变换可能由于像素亮度达到饱和(小于0或超过255)而丟失一部分细节。3>特殊情况下,当/(=l,/fl=0时,榆出图像与输入图目同;当/s=255时,输出图像的灰度正好反转,灰度反转处理适用于增强暗色图像中亮度较大的细节部分,这也是由人的视觉特性决定的。灰度直方图的代码实现其中程序实现如下:voidCDIPDemoView::OnPointLiner(){ //线性变换 //获取文档 CDIPDemoDoc*pDoc=GetDocument(); //输入对象 CImgProcessimgInput=pDoc->m_Image; //检查图像是灰度图 if(imgInput.m_pBMIH->biBitCount!=8) { AfxMessageBox("不是8-bpp灰度图像,无法处理!"); return; } //创建对话框 CDlgLinerParadlgPara; //线性变换的斜率 doublefA; //线性变换的截距 doublefB; //初始化变量值 dlgPara.m_fA=2.0; dlgPara.m_fB=-128.0; //显示对话框,提示用户设定参数 if(dlgPara.DoModal()!=IDOK) { //返回 return; } //获取用户设定的参数 fA=dlgPara.m_fA; fB=dlgPara.m_fB; //更改光标形状 BeginWaitCursor(); //输出的临时对象 CImgProcessimgOutput=imgInput; //调用LinTran()函数进行线性变换 imgInput.LinTran(&imgOutput,fA,fB); //将结果返回给文档类 pDoc->m_Image=imgOutput; //设置脏标记 pDoc->SetModifiedFlag(TRUE); //更新视图 pDoc->UpdateAllViews(NULL); //恢复光标 EndWaitCursor(); }其中的对话框是根据这句代码://创建对话框 CDlgLinerParadlgPara; 运行效果如图2-1: 图2-1对话框程序实现的核心代码:BOOLCImgProcess::LinTran(CImgProcess*pTo,doubledFa,doubledFb){ //首先检查图像是否是8位灰度图像 if(m_pBMIH->biBitCount!=8)returnfalse; BYTEgray; //临时变量,存储当前光标像素的灰度值 inttarget; //临时变量,存储当前光标像素的目标值 for(inti=0;i<m_pBMIH->biHeight;i++) { for(intj=0;j<m_pBMIH->biWidth;j++) { gray=GetGray(j,i); target=dFa*gray+dFb; if(target<0)target=0; if(target>255)target=255; //写入目标图像 pTo->SetPixel(j,i,RGB(target,target,target)); } }; returntrue;}2.2.2灰度的对数变换灰度的对数变换的理论基础对数变换的一般表达式为:t=clog(l+s)其中c为尺度比例常数,s为源灰度值,r为变换后的目标灰度值。在如图2.2所示的对数曲线上,函数自变量低值时,曲线的斜率很高;自变量高值时,曲线斜率变小。对数函数曲线可知,这种变换可以增强一幅图像中较暗部分的细节,从而可用来扩展被压縮的高值图像中的较暗像素,因此对数变换被广泛地应用于频谱图像的显示中。一个典型的应用是傅立叶频谱,其动态范围可能宽达0〜106。直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失大量的暗部细节。而在使用对数变换之后,图像的动态范围被合理地非线性压缩,从而可以清晰地显示。 Y=log(x+1.5)54.554.543.532.521.510.5001020304050607080901000102030405060708090100图图2-2函数图灰度的对数变换的代码实现 voidCDIPDemoView::OnPointLog(){ //对数变换 CDIPDemoDoc*pDoc=GetDocument(); //输入对象 CImgProcessimgInput=pDoc->m_Image; //检查图像是灰度图 if(imgInput.m_pBMIH->biBitCount!=8) { AfxMessageBox("不是8-bpp灰度图像,无法处理!"); return; } //创建参数输入对话框 CDlgLogdlg; dlg.m_dC=20; if(dlg.DoModal()!=IDOK) { return; } //输出的临时对象 CImgProcessimgOutput=imgInput; //使用对数变换方法 imgInput.LogTran(&imgOutput,dlg.m_dC); //将结果返回给文档类 pDoc->m_Image=imgOutput; pDoc->SetModifiedFlag(true); pDoc->UpdateAllViews(NULL);}其中代码创建是根据这句://创建参数输入对话框 CDlgLogdlg; dlg.m_dC=20;运行效果如图2-3: 图2-3对话框程序实现的核心代码:BOOLCImgProcess::LogTran(CImgProcess*pTo,doubledC){ //首先检查图像是否是8位灰度图像 if(m_pBMIH->biBitCount!=8)returnfalse; BYTEgray; //临时变量,存储当前光标像素的灰度值 inttarget; //临时变量,存储当前光标像素的目标值 for(inti=0;i<m_pBMIH->biHeight;i++) { for(intj=0;j<m_pBMIH->biWidth;j++) { gray=GetGray(j,i); //按公式运算 target=dC*log((double)(gray+1)); if(target<0)target=0; if(target>255)target=255; //写入目标图像 pTo->SetPixel(j,i,RGB(target,target,target)); } }; return0;}2.2.3伽马变换伽玛变换又名指数变换或幕次变换,是另一种常用的灰度非线性变换。伽马变换的理论基础 伽玛变换的一般表达式为:y=(x+esp)γ其中,X与Y的取值范围均为[0,l]。esp为补偿系数,γ则为伽玛系数。与对数变换不同,伽玛变换可以根据γ的不同取值选择性地增强低灰度区域的对比度或是高灰度区域的对比度。γ是图像灰度校正中非常重要的一个参数,其取值决定了输入图像和输出图像之间的灰度映射方式,即决定了是增强低灰度(阴影区域)还是增强高灰度(髙亮区域、其中:•γ>l时,图像的高灰度区域对比度得到增强;•γ<1时,图像的低灰度区域对比度得到增强;•γ=1时,这一灰度变换是线性的,即不改变原图像.伽玛变换的映射关系如图2.4所示。在进行变换时,通常需要将0〜255的灰度动态范围首先变换到0〜1的动态范围,然后执行伽玛变换后再恢复原动态范围。图2-4图2-4函数图000伽马变换的代码实现voidCDIPDemoView::OnPointGamma(){ //TODO:在此添加命令处理程序代码 CDIPDemoDoc*pDoc=GetDocument(); //输入对象 CImgProcessimgInput=pDoc->m_Image; //检查图像是灰度图 if(imgInput.m_pBMIH->biBitCount!=8) { AfxMessageBox("不是8-bpp灰度图像,无法处理!"); return; } //创建参数输入对话框 CDlgGammadlg; dlg.m_dEsp=0; dlg.m_dGamma=1; if(dlg.DoModal()!=IDOK) { return; } //输出的临时对象 CImgProcessimgOutput=imgInput; //调用GammaTran方法执行伽玛变换 imgInput.GammaTran(&imgOutput,dlg.m_dGamma,dlg.m_dEsp); //将结果返回给文档类 pDoc->m_Image=imgOutput; pDoc->SetModifiedFlag(true); pDoc->UpdateAllViews(NULL);} 创建窗口的代码为: //创建参数输入对话框 CDlgGammadlg; dlg.m_dEsp=0; dlg.m_dGamma=1; 其中的运行效果为图2-5: 图2-5对话框 程序实现的核心代码如下:BOOLCImgProcess::GammaTran(CImgProcess*pTo,doublegamma,doublecomp){ //首先检查图像是否是8位灰度图像 if(m_pBMIH->biBitCount!=8)returnfalse; BYTEgray; //临时变量,存储当前光标像素的灰度值 inttarget; //临时变量,存储当前光标像素的目标值 for(inti=0;i<m_pBMIH->biHeight;i++) { for(intj=0;j<m_pBMIH->biWidth;j++) { gray=GetGray(j,i); target=pow((gray+comp)/255.0,gamma)*255; if(target<0)target=0; if(target>255)target=255; //写入目标图像 pTo->SetPixel(j,i,RGB(target,target,target)); } }; return0;}2.2.4灰度阈值变换灰度阈值变换可以将一幅灰度图像转换成黑白的二值图像。用户指定一个起到分界线作用的灰度值,如果图像中某像素的灰度值小于该灰度值,则将该像素的灰度值设置为0,否则设置为255。这个起到分界线作用的灰度值称为阈值,灰度的闲值变换也常被称为阈值化或二值化。灰度阈值变换的理论基础 灰度阐值变换的函数表达式如下: 0x<T f(x)=﹛ 255 x>=T其中,T为指定的阈值。图2.6给出了灰度闽值变换的示意图。灰度阈值变换的用途和可扩展性都非常广泛。通过将一幅灰度图像转为二值图像,可以将图像内容直接划分为我们关心的和不关心的2个部分,从而在复杂背景中直接提取出感兴趣的目标。因此它是图像分割的重要手段之一。0501001502002500501001502002500.20.10200150100500 图2-6函数图灰度阈值变换的代码实现voidCDIPDemoView::OnPointThre(){ //阈值变换 //获取文档 CDIPDemoDoc*pDoc=GetDocument(); //参数对话框 CDlgPointThredlgPara; //阈值 BYTE bThre; //输入对象 CImgProcessimgInput=pDoc->m_Image; //检查图像是灰度图 if(imgInput.m_pBMIH->biBitCount!=8) { AfxMessageBox("不是8-bpp灰度图像,无法处理!"); return; } //初始化变量值 dlgPara.m_bThre=128; //显示对话框,提示用户设定阈值 if(dlgPara.DoModal()!=IDOK) { //返回 return; } //获取用户设定的阈值 bThre=dlgPara.m_bThre; //更改光标形状 BeginWaitCursor(); //输出的临时对象 CImgProcessimgOutput=imgInput; //调用Threshold方法进行阈值变换 imgInput.Threshold(&imgOutput,bThre); //将结果返回给文档类 pDoc->m_Image=imgOutput; //设置脏标记 pDoc->SetModifiedFlag(TRUE); //更新视图 pDoc->UpdateAllViews(NULL); //恢复光标 EndWaitCursor();} 其中创建窗口的代码为://参数对话框 CDlgPointThredlgPara; 运行效果如图2-7: 图2-7对话框程序实现的核心代码如下:voidCImgProcess::Threshold(CImgProcess*pTo,BYTEbThre){ inti,j; BYTEbt; for(j=0;j<m_pBMIH->biHeight;j++) { for(i=0;i<m_pBMIH->biWidth;i++) { bt=GetGray(i,j); if(bt<bThre) bt=0; else bt=255; pTo->SetPixel(i,j,RGB(bt,bt,bt)); } }}structSMaxValue{ intnValue; intnDist; intnAngle;};2.2.5分段线性变换分段线性变换的理论基础 利用分段线性变换函数来增强图像对比度的方法实际是增强原图各部分的反差,即增强输入图像中感兴趣的灰度区域,相对抑制那些不感兴趣的灰度区域。分段线性函数的主要优势在于它的形式可任意合成,而其缺点是需要更多的用户输入。分段线性变换的函数形式如下: y1/x1*x x<x1 f={(y2-y1)/(x2-x1)*(x-x1)+y1x1<=x<=x2 (255-y2)/(255-x2)*(x-x2)+y2x>x2式中最重要的参数是[x1,x2]和[y1,y2]。根据算法函数描述发现,转换的灰度范围,y1和y2参数决定线性变换的斜率。当x1,x2,y1,y2分别取不同的值的组合时,可得到不同的变换效果。例如:•如果x1=y1,x2=y2,则f(x)为1条斜率为1的直线,增强图像将和原图像相同。•如果x1=x2,y1=0,y2=255,则增强图像只剩下2个灰度等级,分段线性变起到了阈值化的效果,此时的对比度最大,但是细节丟失最多。•x1,x2,y1,y2取一般值时的分段线性变换函救图形如图2-8所示:0501001502002500501001502002500.20.10200150100500图2-8函数图分段的灰度拉伸可以更加灵活地控制输出灰度直方图的分布,可以有选择的拉伸某段灰度区间以改善输出图像。如果一幅图像灰度集中在较暗的区域而导致图像偏暗,我们可以用灰度拉伸功能来扩展(斜率>1)物体灰度区间以改善图像;同样,如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率<1)物体灰度区间以改善图像质量。灰度拉伸是通过控制输出图像中灰度级的展开程度来达到控制对比度的效果。一般情况下都限制x1<x2,y1<y2,从而保证函数单调递增,以避免造成处理过的图像中灰度级发生颠倒。分段线性变换的代码实现voidCDIPDemoView::OnPointStdlin(){ //TODO:在此添加命令处理程序代码 CDIPDemoDoc*pDoc=GetDocument(); //输入对象 CImgProcessimgInput=pDoc->m_Image; //检查图像是灰度图 if(imgInput.m_pBMIH->biBitCount!=8) { AfxMessageBox("不是8-bpp灰度图像,无法处理!"); return; } //创建参数输入对话框 CDlgLinTransdlg; dlg.m_bS1=64; dlg.m_bS2=192; dlg.m_bT1=32; dlg.m_bT2=224; if(dlg.DoModal()!=IDOK) { return; } //输出的临时对象 CImgProcessimgOutput=imgInput; //分段线性变换 imgInput.ParLinTran(&imgOutput,dlg.m_bS1,dlg.m_bS2,dlg.m_bT1,dlg.m_bT2); //将结果返回给文档类 pDoc->m_Image=imgOutput; pDoc->SetModifiedFlag(true); pDoc->UpdateAllViews(NULL);}voidCDIPDemoView::OnPointLog(){ //对数变换 CDIPDemoDoc*pDoc=GetDocument(); //输入对象 CImgProcessimgInput=pDoc->m_Image; //检查图像是灰度图 if(imgInput.m_pBMIH->biBitCount!=8) { AfxMessageBox("不是8-bpp灰度图像,无法处理!"); return; } //创建参数输入对话框 CDlgLogdlg; dlg.m_dC=20; if(dlg.DoModal()!=IDOK) { return; } //输出的临时对象 CImgProcessimgOutput=imgInput; //使用对数变换方法 imgInput.LogTran(&imgOutput,dlg.m_dC); //将结果返回给文档类 pDoc->m_Image=imgOutput; pDoc->SetModifiedFlag(true); pDoc->UpdateAllViews(NULL);} 其中创建对话框的语句: //创建参数输入对话框 CDlgLinTransdlg; dlg.m_bS1=64; dlg.m_bS2=192; dlg.m_bT1=32; dlg.m_bT2=224; 运行效果如图2-9: 图2-9对话框程序实现的核心代码如下:BOOLCImgProcess::LogTran(CImgProcess*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件项目进度与风险管理
- 商务办公设备维护手册
- 信息通信技术运维与故障处理指南(标准版)
- 图书出版行业编辑与发行指南
- 2026年贵州特岗教师招聘考试《教育综合知识》笔试真题及答案
- 消化内科消化道出血救治课件
- 感冒呼吸道病毒的预防措施培训
- 2026年阳离子染料行业创新驱动产业布局报告
- 玻璃厂产品检测规则
- 外科护理 Ⅱ 课件任务 2 血栓闭塞性血管炎病人的护理
- 2026年共青团入团命题考试题库及答案
- 2026年山东省高考物理真题试卷
- 污染场地修复工程环境监理实施细则
- 东莞市科发盛实业异地扩建项目环境影响报告表
- 高中思想政治必修四《哲学与文化》答题术语规范化专题复习教学设计
- 2026年广东省中考语文试卷(含详细答案解析)
- 2026年采油工(高级技师)模拟试题(含答案)
- 广东省深圳市2026中考语文作文真题解读及范文
- 检修维护部危险源辨识与风险管控培训
- 黄家湾大坝下游摆羊交通桥复建项目水土保持报告表
- 维持性血液透析合并肾性贫血管理共识2026
评论
0/150
提交评论