毕业设计论文.doc_第1页
毕业设计论文.doc_第2页
免费预览已结束,剩余35页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

小型图像处理系统设计与实现计算机科学系 计本 2004 班 02指导教师:张红祥摘要:虽然图像处理在理论方法研究上已取得不小的进展,但它本身是一个比较难的研究领域,存在不少困难,因此计算机图像处理仍是一个有待进一步探索的领域。小型图像处理系统设计与实现的目的不是研究开发一个类似于photoshop的商业化图像处理软件,我们的目的是在了解数字图像处理基本知识的基础之上实现一个小型的图像处理系统。以visual c+作为编程语言,利用mfc的框架实现设计,点运算实现了图像的反色和线性变换,几何变换主要实现了图像的平移、镜像、缩放等,图像的灰度用直方图来表示。平滑处理用平均运算驱除突然变化的点,而边缘检测则使用的是robert边缘检测算子和sobel边缘检测算子。关键词:mfc、边缘检测算子、几何变换、平滑处理the design and implementation of mini image processing systemdirector:zhang hong-xiang( dept of computer science class 2 grade 2004 )abstract:although image processing has gotten so much development in academic direction,itself is a difficult investigative field ,and there are many problems now.therefore,computer image processing is still the field needing more exploring.the purpose of the design and implement of mini image processing system does not investigate and develop a commercial image processing system like photoshop,but realizes a mini image processing system on the base of comprehending basic knowledge of digital image processing.the system makes use of the programming language of visual c+,and is designed by using of mfc frame.however,the operation of piont realizes reversing the color and linear transformation of the image. the primary function of geometry transformation is linear translation、enantiomorph、zoom and so on.the gray scale of the image uses histogram to reveal.the smooth processing of image gets rid of unexpected variety point by the arithmetic of average operation.the marginal detecting makes use of the operator of robert marginal detecting and sobel marginal detecting.key words: mfc、marginal detecting operator、geometry transformation、smooth processing第1章 引言 11 图像处理的发展及现状目前数字图像处理科学已成为工程学、计算机科学、信息科学、统计学、物理、化学、生物学、医学甚至社会科学等领域中各学科学习和研究的对象。20世纪60年代,数字图像处理作为一门学科得到了发展,它先后在航天测试、医学方面都得到了很大发展。从70年代中期开始,随着计算机技术和人工智能、思维科学研究的迅速发展,数字图像处理向更高、更深层次发展,人们已开始研究如何用计算机系统解释图像,实现类似人类视觉系统理解外部世界,这被称为图像理解或计算机视觉。很多国家,特别是发达国家投入更多的人力、物力到这项研究,取得了不少重要的研究成果。虽然图像处理在理论方法研究上已取得不小的进展,但它本身是一个比较难的研究领域,存在不少困难,因此计算机图像处理仍是一个有待进一步探索的领域。随着信息高速公路、数字地球概念的提出以及internet 的广泛应用,图像处理技术的需求与日俱增。当前在图像处理软件系统中优秀的代表当首推adobe 公司的photoshop。12 数字图像处理1. 2. 1 数字图像处理概念 数字图象处理,英文名称“digital image processing”,通常说的数字图像处理是指计算机对图像信息进行的处理,因此也称为计算机图像处理(computer image processing)。数字图像处理技术处理精度比较高,而且还可以通过改进处理软件来优化处理效果。1. 2. 2 数字图像基础知识1. 2. 2. 1 图像普通的显示器屏幕是由许多的点构成的,这些点称为像素。显示时采用扫描的方式:电子枪每次从左到右扫描一行,为每个像素着色,然后再像这样从上到下扫描整个屏幕,利用人眼的视觉暂留效应就可以显示出一屏完整的图像。为了防止闪烁,没秒要重复扫描几十次。我们常说的屏幕分辨率为1024*768,刷新率为85hz,意思是每行扫描1024个像素,一共扫描768行,每秒重复扫描屏幕85次。对于普通的黑白位图,我们可以认为它是由若干个黑点和白点组成。但是彩色图是由红、绿、蓝三原色组合而成。每个原色可以分为0-255个等级,它们组合成256*256*256种颜色,给图中每个像素赋予不同的rgb值就可以得到一个彩色图。1. 2. 2. 2 调色板调色板其实就是一个rgb表,也就是颜色查找表lut。不仅仅windows的位图使用了调色板,其他许多格式的图像文件都用到了调色板。对于16色的图像,图中最多只有16种颜色,如果采用一个颜色表,表中每一行记录一种颜色的r、g、b值,这样当表示一个像素的颜色时,只需要指出该颜色是在第几行,也就是指出它在表中的索引值。对于真彩色图像(也叫24位位图),它的颜色高达256*256*256= 224 =16777216种,它具有显示所有颜色的能力,在它里面,每个像素直接用r、g、b这3个分量字节表示,不采用调色板。因为采用调色板不仅没有节省空间,而且还要加上一个大的调色板。1. 2. 2. 3 灰度图灰度图是指只含有亮度信息,不含色彩信息的图像,也就是我们平时看到亮度由暗到明的黑白照片,亮度变化是连续的。因此,要表示灰度图,就需要把亮度值进行量化。通常划分为0-255共256个级别,0最暗(全黑),255最亮(全白)。bmp格式的文件中没有灰度图这个概念,但是我们可以很容易地使用bmp文件来表示灰度图。方法是用256色的调色板,只不过这个调色板有点特殊,每一项的rgb值都是相同的,也就是说rgb值从(0,0,0),(1,1,1)一直到(255,255,255)。(0,0,0)是全黑色,(255,255,255)是全白色,中间的是灰色。这样,灰度图就可以用256色图来表示了。灰度图使用比较方便。首先rgb的值都是一样的。其次,图像数据即调色板索引值,也就是实际的rgb的亮度值;另外因为是256色的调色板,所以图像数据中一个字节代表一个像素。如果是彩色的256色图,图像处理后有可能会产生不属于这256种颜色的新颜色,所以,图像处理一般采用灰度图。1. 2. 3 数字图像处理中的基本图像类型1.gdi位图:图形设备接口,是一种gdi对象,在microsoft基本类(mfc)库中用cbitmap类来表示。在cbitmap类对象中,包含一种和windows的gdi模块有关的windows数据结构,该数据结构是与设备相关的。应用程序可以的到gdi位图数据的一个备份,但是其中位的安排则完全依赖于显示设备。一般情况,我们采用cbitmap类中的成员函数loadbitmap()加载位图,但是如果我们想要对图像进行缩放操作,我们可以采用cbitmap类中的strechblt()函数来显示位图。2.设备有关位图(ddb):由mfc库6.0版本cbitmap类定义。有一个与之相关联的windows数据结构,它在windows gdi模块内进行维护。程序可以获得位图数据的副本,但是其中位的排列则取决于显示硬件。在同一台机器中,gdi位图可以在各个程序之间任意进行传输;但是,由于它们是与设备相关的,所以,通过磁盘或者网络来传输位图就显得没有意义。ddb中不包括颜色信息,因此显示时是以系统的调色板为基础进行各位的颜色映射的,windows只能保证系统调色板的前二十种颜色稳定不变,所以ddb只能保证在正确显示少于二十色的位图。3.设备无关位图:自带颜色信息,调色板的管理十分容易,打印时灰度阴影的控制也比较容易。任何运行windows的计算机都可以处理dib,它通常以bmp文件的形式被保存在磁盘中或者作为资源保存在exe文件和dll文件中。本系统采用此类型位图。1. 2. 4 bmp位图图像格式分析bmp文件大体上分成四个部分: 第一部分为位图文件头bitmapfileheader,是一个结构,它的长度是固定的,为14个字节。 bftype:指定文件类型,必须是0x424d,即字符串bm,也就是说所有.bmp文件的头两个字节都是bm。 bfoffbits:为从文件头到实际的位图数据的偏移字节数。 第二部分为位图信息头bitmapinfoheader,也是一个结构,它的长度是固定的,为40个字节。这里biplanes必须是1。 bibitcount:指定表示颜色时要用到的位数,常用的值为1(黑白二色图),4(16色图),8(256色),24(真彩色图)。 bicompression:指定位图是否压缩,有效的值为bi_rgb,bi_rle8,bi_rle4,bi_bitfields,bicompression为bi_rgb的情况是最常用的。 bisizeimage:指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:bisizeimage=biwidth*biheight,要注意的是:公式中的biwidth必须是4的整倍数(所以不是biwidth,而是biwidth,表示大于或等于biwidth的,离4最近的整倍数。)。 biclrused:指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的bibitcount次方。 biclrimportant:指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。 第三部分为调色板(palette),这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,是不需要调色板的,bitmapinfoheader后直接是位图数据。调色板实际上是一个数组,共有biclrused个元素(如果该值为零,则有2的bibitcount次方个元素)。数组中每个元素的类型是一个rgbquad结构,占4个字节。 第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该像素颜在调色板中的索引值,对于真彩色图,图象数据就是实际的r,g,b值。 对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。 对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素。 对于256色位图,一个字节刚好可以表示1个像素。 对于真彩色图,三个字节才能表示1个像素。注意: 1.每一行的字节数必须是4的整倍数,如果不是,则需要补齐。 2.一般来说,.bmp文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个像素,然后是左边第二个像素接下来是倒数第二行左边第一个像素,左边第二个像素依次类推,最后得到的是最上面一行的最右一个像素。1. 3 图像处理系统建设131 系统建设的目标 该系统不是研究开发一个类似于photoshop的商业化图像处理软件,它的目的是在了解数字图像处理基本知识的基础之上实现一个小型的图像处理系统。该系统主要处理的图像格式以灰度位图(bmp)为主,实现基本的图像处理方法:图像的显示、图像的几何变换、图像灰度变换、图像的平滑处理以及图像锐化处理和边缘检测等。1. 3. 2 系统建设的意义1培养学生面向对象程序设计的方法以及用使用面向对象程序设计方法解决实际问题的能力。2加深对数字图像处理方法的理解和掌握图像处理编程方法,为以后在本领域的研究打下坚实的基础,提高独立承担科研项目开发的能力。3学会使用基础学科知识(如数学)解决应用学科中的实际问题的方法。第二章 图像处理系统分析和设计2. 1 需求分析根据系统设计要求可以得出,系统必须用visual c+来实现,主要处理的图像格式为灰度位图,它的功能主要有:图像的显示(即图像打开如何在窗口中显示)、图像的几何变换、图像灰度变换、图像的平滑处理以及图像锐化处理和边缘检测等。具体的界面设计可以根据自己的需求进行设计,在这方面没有具体要求,所以在这里采用的是菜单实现。2. 2 图像系统的相关技术介绍和分析2. 2. 1 面向对象的设计方法面向对象是一种解决问题的思维方法,它将观察焦点放在构成客观世界的成分-对象上,将对象作为需求分析和软件设计的核心或主体,把问题域中有意义的实体作为对象,将对象间有意义的相互作用作为通讯,即把整个问题域抽象成为相互通讯的一组对象集合。在此基础上,引用科学方法论中的分类思想,将相似或相近的一组对象聚合为类,采用各种手段将相似的类组织起来,实现问题空间到解空间的映射。由于这种方法描述的现实世界模型更符合人们认识世界的思维方法,因此用它开发出的软件更易于理解,易于维护。面向对象的开发方法,采用了“类”这个思想,使得开发显得更加有效、合理。类具有以下几个特点:第一,类具有独立性。 由于类的这种独立的存在,使得和其他的过程也好,对象也罢能够不彼此牵引。避免牵一发而动全身的局面,这有利于维护和调试。第二,类具有通用性。这种通用性,是通过抽象得来的。所谓抽象,就是抽取出事物的共同特征并且加以概括。正是因为这种通用性的实现,才造就了re-use的可能。第三,类具有灵活性。由于第二个特征的存在,加上客观事物的特殊性,有可能通用的类中一部分成员方法变得不通用,这个时候通过继承和overload的机制,使得它能够应付某些特殊情况,从而实现了灵活性。在开发的过程中我采用了面向对象的方法,因为图像处理其实就是修改图像文件中的内容,例如:图像的头信息、数据等等。所以应该将图像的文件信息作为单独的类,因为在每个处理功能中都要用到这个类,这样为以后添加功能带来了方便。系统中将每个功能也单独作为一个类,因为有些处理功能是在其他功能的基础上来实现的,将它们单独作为一个类,为后面的修改和维护工作带来了便利。使用面向对象的开发方法,使系统的各个功能即具有独立性又具有通用性,而且也使系统更加灵活。2. 2. 2 遵循面向对象设计的原则面向对象设计的原则有:1. 单一职责原则(srp):一个类应该仅有一个引起它变化的原因。2. 开放封闭原则(ocp):类模块应该是可扩展的,但是不可修改(对扩展开放,对更改封闭)。3. liskov 替换原则(lsp):子类必须能够替换它们的基类 4. 依赖倒置原则(dip):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于实现细节,实现细节应该依赖于抽象。5. 接口隔离原则(isp):不应该强迫客户程序依赖于它们不用的方法。在进行系统的设计和开发时候,我遵循了以上的五个原则,其中有些是很难做到的,但是我尽量作到五者兼具,因为只有遵循了这个设计原则,做出来的系统才会比较有利于他人使用和以后的维护、修改工作。2. 2. 3 rup 统一开发过程 统一软件开发过程(rational unified process,rup)是一个面向对象且基于网络的程序开发方法论。它是一个面向对象软件工程的通用业务流程。描述了一系列相关的软件工程流程,它们具有相同的结构,即相同的流程构架。rup为在开发组织中分配任务和职责提供了一种规范方法。其目标是确保在可预计的时间安排和预算内开发出满足最终用户需求的高品质的软件。rup汇集现代软件开发中多方面的最佳经验,为适应各种项目及组织的需要提供了灵活的形式。通过裁剪和扩充,他可以适用于各种不同类型的软件系统、各种不同的应用领域、各不同的组织和各种不同的项目规模。rup是基于迭代开发、需求驱动以及基于构架的开发等一些合理的软件工程准则,它提供了将管理的可见性引入开发过程的机制,例如每次迭代结束时的工作原型以及在每个阶段末尾的是否继续的决策点等等。rup中的软件生命周期在时间上被分解为四个顺序的阶段,分别是:初始阶段(inception)、细化阶段(elaboration)、构造阶段(construction)和交付阶段(transition)。每个阶段结束于一个主要的里程碑(major milestones);每个阶段本质上是两个里程碑之间的时间跨度。在每个阶段的结尾执行一次评估以确定这个阶段的目标是否已经满足。如果评估结果令人满意的话,可以允许项目进入下一个阶段。 rup中的每个阶段可以进一步分解为迭代。一个迭代是一个完整的开发循环,产生一个可执行的产品版本,是最终产品的一个子集,它增量式地发展,从一个迭代过程到另一个迭代过程到成为最终的系统。 传统上的项目组织是顺序通过每个工作流,每个工作流只有一次,也就是我们熟悉的瀑布生命周期。这样做的结果是到实现末期产品完成并开始测试,在分析、设计和实现阶段所遗留的隐藏问题会大量出现,项目可能要停止并开始一个漫长的错误修正周期。一种更灵活,风险更小的方法是多次通过不同的开发工作流,这样可以更好的理解需求,构造一个健壮的体系结构,并最终交付一系列逐步完成的版本。这叫做一个迭代生命周期。在工作流中的每一次顺序的通过称为一次迭代。软件生命周期是迭代的连续,通过它,软件是增量的开发。一次迭代包括了生成一个可执行版本的开发活动,还有使用这个版本所必需的其他辅助成分,如版本描述、用户文档等。因此一个开发迭代在某种意义上是在所有工作流中的一次完整的经过,这些工作流至少包括:需求工作流、分析和设计工作流、实现工作流、测试工作流。其本身就像一个小型的瀑布项目。 与传统的瀑布模型相比较,迭代过程具有以下优点:1.降低了在一个增量上的开支风险。如果开发人员重复某个迭代,那么损失只是这一个开发有误的迭代的花费。2.降低了产品无法按照既定进度进入市场的风险。通过在开发早期就确定风险,可以尽早来解决而不至于在开发后期匆匆忙忙。 3.加快了整个开发工作的进度。因为开发人员清楚问题的焦点所在,他们的工作会更有效率。4.由于用户的需求并不能在一开始就作出完全的界定,它们通常是在后续阶段中不断细化的。因此,迭代过程这种模式使适应需求的变化会更容易些。22. 4 mfc 框架mfc特点: 1. mfc提供了一个windows应用程序开发模式,对程序的控制主要是由mfc框架完成的,而且mfc也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。 2. mfc是c+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是c+对继承的支持,对虚拟函数的支持,以及mfc实现的消息映射机制。 3. 为了支持对应用程序概念的封装,mfc内部必须作大量的工作。例如,为了实现消息映射机制,mfc编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对dll编程的支持和多线程编程的支持,mfc内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解mfc内部机制有助于写出功能灵活而强大的程序。 总之,mfc封装了win32 api,ole api,odbc api等底层函数的功能,并提供更高一层的接口,简化了windows编程。同时,mfc支持对底层api的直接调用。2. 3 系统的运行环境和开发工具1. 运行环境:windows系列操作系统,如:windows xp2.开发工具:visual c+2. 4 图像处理系统结构设计2. 4. 1 系统界面设计用户在进入系统时,首先不能对图像进行处理,界面中不出现任何图像处理的菜单,具体界面如下显示:用户通过“打开”按钮或者“文件”菜单下的“打开”打开图像文件之后,界面中出现图像处理的相关菜单,界面如下:在进行图像处理时,有些处理需要弹出对话框让用户输入数据,例如:图像的平移、缩放、平滑处理、锐化处理等等都需要拥护输入数据,可是有些则直接进行处理,不需要用户输入信息,这些都将在核心算法和设计中进行详细介绍。2. 4. 2 系统结构设计框图图像处理系统是对图像进行处理,当然需要将图像打开并且显示在窗口中,由于系统处理的是bmp格式的图像,所以系统的输入应该是bmp格式的图像。进入系统后先打开文件,这是一切操作的前提条件。当图像输入到系统中后,就应该对图像进行处理,系统中的各个功能模块之间都是并列的关系,当然每次只能进行一种操作,可是在进行处理时有的处理会改变文件的信息,所以可能在处理前和处理后图像的灰度直方图是不同的。还有,有些操作在某些操作之后进行也许会好一些,这样就需要提示用户是否需要先进行前面的再进行后面的,如果同意执行你的建议,就应该退出现在的操作然后执行另外一个操作,如果不同意那么也可以继续执行。在设计时还要考虑到用户在关闭窗口时,提示用户是否保存对图像的修改,不论是退出系统还是只是关闭此次图像处理的窗口都应有提示。以上是对系统的设计的分析,下面是系统结构设计的具体框图:打开文件图像的反色 点运算图像的线性变换 图像的平移 弹出对话框,提示用户输入相关数据图像的水平镜像 图像的垂直镜像 几何变换处理图像bmp文件图像的缩放 图像的旋转 灰度显示绘制直方图图像平滑处理 图象增强图像的梯度锐化robert检测算子边缘检测sobel检测算子保存文件2. 4. 3 系统结构设计流程图系统的流程其实很简单,就是用户进入主界面,然后打开图像,进行图像的处理,最后保存对图像的修改,返回到主界面中。具体如下图所示:主界面图像导出图像导入处理图像第三章 图像处理系统各个功能及其关系介绍 小型图像处理系统主要包含的功能为:点运算、几何变换、图像的增强、边缘检测以及图像灰度的显示等等。用户进入系统后,只有打开了一个bmp格式的灰度图时,菜单中才会出现上面的这些功能。打开图像后,各功能是结合工作的,也就是说不是独立的,而是在做了某个操作后还可以继续做其他操作,用户做的所有操作都会被记录下来,然后在退出时保存图像,这样用户做的所有操作就被保存下来,否则图像则不会发生改变。注意:在进行锐化处理之前最好做一次平滑处理操作,否则有可能达不到所需要的结果。3. 1 图像的导入导出 图像的导入导出其实通俗一点就是说图像的打开和关闭,和文件的打开和关闭是类似的。3. 1. 1 图像导入 图像的导入即文件的打开,主要要实现当图像导入后图像要正常显示以及图像在导入后若图像的大小小于窗口大小,图像应该是居中显示还是其他位置显示。在这里系统采用的是左上角显示,将左上角作为图像的原点。3. 1. 2 图像导出 图像的导出即文件的关闭,主要实现当图像导出时询问用户是否保存图像,如若保存则需要修改相应的图像文件的信息,这里系统实现了保存功能,如果选择保存则保存你做的所有操作产生的效果。3. 2 点运算功能 点运算主要是对图像的像素进行加、减、乘、除等运算。图像的点运算可以有效地改变图像的直方图分布,对提高图像的分辨率以及图像的均衡都是非常有益的。点运算是一种既简单又重要的技术,它可以让用户改变图像数据占据的灰度范围。这里只实现了反色和线性变换,反色即将图像的颜色相反着色,将白色变为黑色等等。而线性变换则是将图像中所有的点的灰度按照线性灰度变换函数进行变换,反色是线性变换中最常见的一种。 这里系统实现了反色和线性变换两种点运算,其实反色和线性变换原理相同,只是线性变换的斜率等一些参数需要用户自己来设定。3. 3 图像增强功能 主要是突出图像中的重要信息,同时减弱或去除不需要的信息。这里主要实现了图像的锐化处理以及平滑处理。 锐化处理是为了让模糊的图像变得更加清晰。通常是针对引起图像模糊的原因进行相应的锐化操作,需要注意的是:能够进行锐化的处理的图像必须有较高的信噪比,否则锐化后图像信噪比反而更低,从而使噪声的增加比信号还要多,所以一般是先去除或者减轻噪声后再进行锐化处理,这里只是实现了微分锐化方法中的梯度锐化。 图像的平滑是一种实用的数字图像处理技术,主要目的是为了减少图像的噪声。一般情况下,在空间域内可以用领域平均来减少噪声;在频率域,由于噪声频谱通常多在高频段,所以可以采用各种形式的低通滤波的办法来减少噪声,而在具体的处理过程中要根据具体的噪声来处理。3. 4 图像的几何变换 图像的几何处理主要包括图像的坐标变换,图像的移动、缩小、放大和旋转,多个图像的配准以及图像扭曲矫正等。几何处理是最常见的图像处理手段,几乎任何图像处理软件都提供了最基本的图像缩放功能。 图像的平移就是将图像中的所有点都按照指定的平移量水平或者垂直移动。缩小和放大图像时像素可能在原图中找不到相应的像素点,需要进行近似处理,这里采用插值方法进行近似处理。图像的水平镜像就是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换,垂直镜像就是将上和下两部分进行对换。还有图像的旋转则是以图像的中心为原点,旋转一定的角度,旋转后,图像的大小不会发生变化。3. 5 边缘检测功能 图像的边缘是图像最基本的特征,边缘即指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合,它其实是图像灰度不连续的反映。边缘检测是检查每个像素的邻域并对灰度变化率进行量化,也包括方向的确定。如果一个像素落在图像中某一物体的边缘上,那么它的邻域将成为一个灰度级的变化带,检测到这个变化带并将它量化就实现了边缘检测。这里实现了robert和sobel两种边缘检测算子。3. 6 图像灰度显示 小型图象处理系统的图像灰度显示采用的是直方图来表示。直方图即灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度值级别,纵坐标是该灰度出现的频率,用来描述图像的灰度级别,灰度直方图包括了可观的信息。第四章 系统中的核心算法和设计4. 1 点运算模块 图像的线性变换的原理和方法是: 线性灰度变换函数f(x)是一个一维线性函数:f(x)=fax+fb。 灰度变换的方程为:db=fada+fb 式中参数fa为线性函数的斜率,fb为线性函数在y轴上的截距,da表示输入图像的灰度,db表示输出图像的灰度。当fa1时,输出图像的对比度将增大;当fa 1时,输出图像的对比度将减小;当fa=1且fb0时,操作仅使所有像素的灰度值上移或下移,其效果使使整个图像更暗或更亮;如果fa0,暗区域将变亮,亮区域将变暗,从而完成了求补运算。特殊情况下,当fa=1且fb=0时,输出图像和输入图像相同;当fa=-1且fb=255时,输出图像的灰度正好反转。4. 1 .1 图像的反色由上面的分析可见,我们要实现图像的反色,只须使fa=-1且fb=255即可。反色的效果图如图4.1所示:原图效果图图4.1412 图像的线性变换 线性变换其实和反色的原理相同,不过它fa和fb均有用户进行修改和设定,可以根据用户的需要自己选择。如图所示: 在对话框的文本框中输入斜率和截距,或者直接调节左边的兰色线均可实现参数的改变,并且将值传给运算的函数,运算函数将计算后的值返回,再通过onpaint()函数来实现根据灰度值进行着色。选择斜率为10,截距为-128,点击确定后线性变换的效果图如图4.2所示:原图效果图图4.242 几何变换模块421 平移图像平移的原理和方法: 记录图像的水平平移量tx和垂直平移量ty,则平移后点p(x,y)的坐标为(x+tx,y+ty)。如果平移后有些点不在图上了(即移出了图像大小的范围),那么直接将该点的像素值设置为0或者255。这样图像信息就会丢失,为了不丢失信息,我们可以疆土乡的整个宽度扩大|tx|,高度扩大|ty|,这样就可以保证图像完全显示。具体实现时,给图像定义一个原点,记录原点的当前位置,然后再修改坐标值,再将图像的显示在新原点的位置。如图所示: 用户在界面中输入平移量然后将参数传给translationdib1函数,从而实现图像的平移。在系统中,我没有采用上面说的那种在平移后将图像完全显示,我采用的是当平移后图像移出原来的范围时就将多余的部分裁剪掉,即将那一部分图像的灰度值改为一个确定的值,例如:0或255。选择水平平移量为30,垂直平移量为30,确定后平移的效果图如图4.3所示:原图效果图图4.34. 2. 2 缩放 对图像进行缩放操作后可能产生图像中的像素在原图中找不到相应的像素点,必须采取近似处理。一般采用直接赋值为与它最相近的像素值,也可以采用插值法。这里采用的是前一种进行近似处理。 假设图像x轴方向缩放比率是fx,y轴方向缩放比率是fy,那么原图中点(x0,y0)对应与新图中的点的转换矩阵为: x1 fx 0 0 x0 y1 = 0 fy 0 y0 1 0 0 1 1在原图基础上,每行隔一个像素取一点,每隔一行进行操作。其实就是将原图每行中的像素重复取值一遍,然后每行重复一次。如图所示: 用户在对话框中输入缩放的值然后传给zoomdib函数实现图像的缩放,在这里对图像的缩放可能会产生失真现象。选择水平缩放量为0.6,垂直缩放量为0.3,确定后缩放的效果图如图4.4所示:原图效果图图4.44. 2. 3 镜像图像镜像的原理和方法: 设图像的高度为lheight,宽度为lwidth,原图中(x0,y0)经过水平镜像后坐标将变为(lwidth-x0,y0),同样,它的垂直镜像后坐标变为(x0,lheight-y0)。这样其实我们可以通过简单的坐标转换来实现水平镜像和垂直镜像,但是在实现之前要设一个标志,用来标志要进行的是水平镜像还是垂直镜像。可是,在用菜单实现时就不需要设置这个标志,因为可以为它们分别设置方法用来响应点击相应菜单时调用的函数或者方法。但如果将镜像方法写在一个函数里面就要添加那个标志位,也就是说用户不论点击水平镜像还是垂直镜像,都调用的是mirrordib函数,在函数里面区分是水平镜像还是垂直镜像,如果这样,那么就要在用户点击菜单时就要给标志位赋值,以便用来区分。下面是具体的表示方法,bdirection为标志位:if (bdirection)/ 判断镜像方式 进行水平镜像;else 进行垂直镜像;其实采用这种方法也有好处,这样操作就方便了,而且函数也少了,因为两个镜像就是实现那里有点差距,有许多地方有相似之处,这样可以减少了代码数量。点击几何变换菜单下的水平镜像的效果图如图4.5所示:原图效果图图4.5点击“几何变换”菜单下的“垂直镜像”后的效果图如图4.6所示:原图效果图图4.64. 2. 4 旋转图像旋转的原理和方法: 点p(x0,y0)经过旋转度后坐标变为(x0cos()+y0sin(),-x0sin()+y0cos(),这个是绕着坐标轴原点进行旋转后的坐标,如果是绕一个指定点(a,b)旋转,则先要将坐标系的原点平移到该点,然后再进行旋转,最后将坐标轴再平移到原来的位置。在这个系统中,坐标原点是固定的,每次都是绕着固定点旋转,所以不用平移坐标轴,直接进行旋转,但是要注意在旋转后要计算图像的高度、宽度以及图像的大小,因为在旋转后这些信息都已经发生了改变。如图所示:用户在文本框中输入旋转的角度,然后将参数传给rotatedib函数,用它来实现图像的旋转,最重要的是一定要计算旋转后图像的大小,否则可能导致图像显示不完全。点击“几何变换”菜单下的“旋转”选项,选择旋转角度为60,确定后旋转的效果图如图4.7所示:原图效果图图4.74. 3 图像增强模块 图像增强的方法通常有两种:空间域法和频率域法。空间域法是在空间域中对图像像素灰度值直接进行运算处理。空间域法的图像增强技术可以用下面的式子来表示:g(x,y)=f(x,y)h(x,y),其中f(x,y)是处理前的图像,g(x,y)表示处理后的图像,h(x,y)为空间运算函数。频率域法就是在图像的某种变换域中(通常是频率域中)对图像的变换值进行某种运算处理,然后变换回空间域。在这里使用的是空间域法的图像增强技术。4. 3. 1 平滑处理 图像平滑处理其实就是去除突然变化的点,这样处理之后图像可能会有些模糊。而对图像的平滑处理都需要根据不同的噪声选择不同的模板来进行处理。常用的模板有:平均模板(3*3)、高斯模板(9*9)等等。这里用户也可以根据自己的需要选择使用哪个模板,而且可以自己定义一个模板。如图所示: 在对话框中用户可以选择采用哪个模板进行平滑处理,系统会将用户的操作记录下来,之后传给处理的函数,进而进行操作之后再重新绘制图像。一般来说,需要有一个标志来记录用户选择的是哪个模板,然后再调用相应的算法进行运算,之后在根据数据进行重新绘制图像。事实上不论是哪个模板都可以用一个函数来实现,因为它们的实现方法都是一样的,只是参数不同而已,只要根据参数就可以确定执行哪个模板和怎样操作,所以不需要标志来标志哪个模板,参数就可以区分了,而且可以完成相应的操作。具体的代码如下: * 参数: lpstr lpdibbits - 指向源dib图像指针 long lwidth - 源图像宽度(象素数) long lheight - 源图像高度(象素数) int itemph - 模板的高度 int itempw - 模板的宽度 int itempmx - 模板的中心元素x坐标 ( itempw - 1) int itempmy - 模板的中心元素y坐标 ( itemph - 1) float * fparray - 指向模板数组的指针 float fcoef - 模板系数 * 返回值: bool - 成功返回true,否则返回false。 * 说明: 该函数用指定的模板(任意大小)来对图像进行操作,参数itemph指定模板的高度,参数itempw指定模板的宽度,参数itempmx和itempmy指定模板的中心元素坐标,参数fparray指定模板元素,fcoef指定系数。 bool winapi template(lpstr lpdibbits, long lwidth, long lheight,int itemph, int itempw,int itempmx, int itempmy,float * fparray, float fcoef)/ 指向复制图像的指针lpstrlpnewdibbits;hlocalhnewdibbits;unsigned char*lpsrc;/ 指向源图像的指针unsigned char*lpdst;/ 指向要复制区域的指针longi;longj;longk;longl;floatfresult;/ 计算结果long llinebytes; / 图像每行的字节数llinebytes = widthbytes(lwidth * 8);/ 计算图像每行的字节数/暂时分配内存,以保存新图像 hnewdibbits=localalloc(lhnd,llinebytes*lheight); if (hnewdibbits = null)/ 判断是否内存分配失败 return false; / 分配内存失败 lpnewdibbits = (char * )locallock(hnewdibbits);/ 锁定内存/ 初始化图像为原始图像memcpy(lpnewdibbits, lpdibbits, llinebytes * lheight);/ 行(除去边缘几行)for(i = itempmy; i lheight - itemph + itempmy + 1; i+) / 列(除去边缘几列)for(j = itempmx; j lwidth - itempw + itempmx + 1; j+) / 指向新dib第i行,第j个象素的指针lpdst=(unsigned char*)lpnewdibbits+llinebytes*(lheight-1-i)+j;fresult = 0;for (k = 0; k itemph; k+)/ 计算 for (l = 0; l 255)/ 判断是否超过255 * lpdst = 255;/ 直接赋值为255 else * lpdst = (unsigned char) (fresult + 0.5);/ 赋值 memcpy(lpdibbits,lpnewdibbits,llinebytes*lheight);/复制变换后的图像/ 释放内存localunlock(hnewdibbits);localfree(hnewdibbits);return true;点击“图像增强”菜单下面的“平滑处理”选项,选择“平均模板”,确定后平滑处理的效果图如图4.8所示:原图效果图图4.8点击“图像增强”菜单下面的“平滑处理”选项,选择“高斯模板”,确定后平滑处理的效果图如图4.9所示:原图效果图图4.9点击“图像增强”菜单下面的“平滑处理”选项,选择“自定义模板”,模板系数为0.5,模板高度为4,模板宽度为5,中心元素x的坐标为2,中心元素y的坐标也为2,确定后平滑处理的效果图如图4.10所示:原图效果图图4.104. 3. 2 梯度锐化图像梯度锐化的原理和方法: 锐化可以使图像看起来更加清晰,一般有两种方法:微分法和高通滤波法。高通滤波的方法和低通滤波类似,微分锐化一般有两种方法:梯度锐化和拉普拉斯锐化。这里采用的是梯度锐化。梯度锐化主要的思想:计算出一个图像f(x,y)在某一点p(x,y)处的梯度向量gf(x,y),直接用梯度值表示图像,即:g(x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论