为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 图像识别技术和图像处理技术

图像识别技术和图像处理技术

2021-02-23 6页 doc 1MB 10阅读

用户头像 个人认证

橙子到此一游

暂无简介

举报
图像识别技术和图像处理技术图像识别技术和图像处理技术摘要本文对图形图像处理系统的发展现状和所采用的主要技术进行了详细分析,确定了相应的结构和主要功能,以及实际开发中所采取的技术。系统在WindowsXP平台下实现,本课题是采用VisualC++作为编程工具,采用面向对象的程序设计技术实现一个图形绘制和图像处理的应用软件。主要工作分为三类,包括基本图形绘制与编辑、简单的图像处理、图像格式的转换。图形方面主要是设计图形基类,以及继承图形基类的具体图形类。通过对独立功能的封装,可以为今后需要的图形图像的应用奠定基础。系统的优点有:充分体现了面向对象的设计思想...
图像识别技术和图像处理技术
图像识别技术和图像处理技术摘要本文对图形图像处理系统的发展现状和所采用的主要技术进行了详细分析,确定了相应的结构和主要功能,以及实际开发中所采取的技术。系统在WindowsXP平台下实现,本课题是采用VisualC++作为编程工具,采用面向对象的程序设计技术实现一个图形绘制和图像处理的应用软件。主要工作分为三类,包括基本图形绘制与编辑、简单的图像处理、图像格式的转换。图形方面主要是设计图形基类,以及继承图形基类的具体图形类。通过对独立功能的封装,可以为今后需要的图形图像的应用奠定基础。系统的优点有:充分体现了面向对象的设计思想,充分运用了C++的特性,比如封装、多态、继承。程序结构清晰,可读性好,程序中做了充分的注释。图形绘制部分避免了传统的switchcase的繁琐结构。容易扩充和移植。最后,对系统进行测试表明,系统功能达到了预期的要求,界面友好,操作简便,运行也较稳定,是一个完成基本功能的图形图像系统。总体上,本文介绍了系统开发设计的全过程和设计过程中部分代码,也对系统测试的过程进行简单描述,同时对系统中采用的关键技术也作了一些必要的说明,对图像变换的基本原理,图像处理的基本原理和各种图像格式做了详细的阐述。关键词:图形;图像;多态;继承AbstractThisarticlehascarriedonthedetailedanalysisaboutgraphimageprocessingsystemdevelopmentandusingofthekeytechnology,identifythecorrespondingstructureandcentralfunction,aswellasthesystemadoptstechnologyintheactualdevelopment.ThesystemrealizesundertheWindowsXPplatform,thetopicuseVisualC++asaprogrammingtool,useobject-orientedprogrammingtechniquestoachieveagraphicandimageprocessingsoftware.Majorworkisdividedintothreecategories,basicdrawingandeditinggraphics,simpleimageprocessing,andimageformatconversion.Thegraphaspectisdesignsthegraphbaseclass,aswellasinheritsthegraphbaseclass’sspecificgraphclass.Throughindependentfunction'sencapsulation,forthefuture’sneedsofthegraphicimageslaysthefoundation.Thesystemmerithas:theobject-orienteddesign’sthoughtapplicationofthec++properties,forexampleencapsulation,polymorphism,andinheritance.Program’sstructureisclear,goodreadability,codeshasthefullannotationintheprogram.Thegraphplan’sparthasavoidedcomplicatedstructureofthetraditionalswitchcase.Easyexpansionandtransplantation.Finally,system’stestingshows,system’sfunctionsachievetheexpecteddemand,friendlyinterface,andtheoperationissimple,alsoamuchstableoperation,ithasbasicfunctionsofthegraphicimagesystem.Asawhole,thispaperdescribesthesystemdesignprocessandpartoftheprocessofdesigningcode,alsocarriesonthesimpledescriptiontothesystemtestprocess,meanwhileitmadesomenecessaryexplanationsaboutkeytechnologyinthesystem,itmadethedetaileddescriptiontoimagetransformofthebasicprinciple,theimageprocessingbasicprincipleandvariousimageformats.Keyword:graph;image;polymorphism;inheritance目录TOC\o"1-3"\h\z\u摘要IAbstractII第1章引言11.1课题的研究目的和意义11.2国内外发展现状11.3研究方法与手段21.3.1运行环境21.3.2开发环境2第2章图形图像处理系统相关技术综述32.1图形设计基础32.1.1VisualC++技术概要32.1.2图形设备接口GDI32.1.3设备环境DC32.1.4CDC类的派生类的功能及其之间的区别42.1.5与绘图相关的GDI对象类52.1.6坐标变换和映射模式62.2图像设计基础72.2.1数字图像的基本概念72.2.2调色板82.2.3调色板的概念9第3章图形图像处理系统的总体设计103.1需求分析103.2图形图像处理系统目标设计103.3图形图像处理系统功能描述103.4界面设计123.4.1主界面设计123.4.2菜单设计143.4.3工具栏设计143.4.4属性框设计15第4章图形图像处理系统图像部分设计164.1与设备无关位图(DIB)164.1.1DIB位图的结构164.1.2定义DIB处理函数集184.1.3CDib类的设计目标204.2图像变换204.2.1图像变换的理论基础204.2.2旋转214.2.3镜像224.3图像处理的基本方法224.4图像格式254.4.1PCX格式255.4.2GIF格式264.4.3JPEG28第5章图形图像处理系统图形部分设计295.1图形类的设计295.1.1图形系统的层次结构295.1.3类层次性的特点295.1.4图形系统类层次的设计原则305.1.5基类CEntity305.1.6命令基类CCommand315.2派生类设计325.2.1派生类Cline325.2.2派生类Cline的具体实现325.2.3创建直线命令类CCreateLine335.3位置类Position335.3.1构造位置类的原因345.3.2位置类Position的实现345.4图元拾取355.4.1直线的拾取365.4.2矩形的拾取375.4.3圆的拾取375.4.4图元拾取的准确度和可靠性375.5图元的编辑375.5.1图元编辑函数385.5.2实现图元的交互编辑395.6序列化和反序列化405.7系统测试41第6章结论43参考文献44致谢45第1章引言1.1课题的研究目的和意义本课题的目的是采用VisualC++作为编程工具,实现基本图形元素如直线、圆、椭圆等的绘制,对图形元素的基本操作如填充、擦除等,也包括对常用图像格式的处理,如图像的显示、图像格式的转换等[1]。应该说,目前已有种类繁多的图形图像处理专用软件工具,如AutoCAD、和PhotoShop等,利用这些图形图像处理软件可以实现同样的功能。即便如此,研究这些图形图像处理技术仍具有一定使用价值。首先,利用一个设计良好的简单的小图形处理程序可以用于教学演示的目的,展示基本的图形图像处理技术和面向对象技术在这一领域的应用效果。其次,在很多应用中需要提供自己的图形图像处理功能,例如,在一个正在连接网络的任务中可能就希望显示一幅示意性的动画,此时,不能依赖一个图形软件来实现。因此,通过对独立功能的封装,可以为今后需要的图形图像的应用奠定基础[2]。此外,借助VisualC++语言这种典型的面向对象编程环境,能够充分挖掘硬件的潜能,得到性能优良的程序代码。1.2国内外发展现状图形与图像处理是计算机最早应用的领域之一,从简单的图形显示到复杂的图像分析、模式识别,使得图形与图像处理技术不断走向成熟,也涌现出了大量的软件。例如,ACDSee、PhotoShop、CorelDraw等,这些软件提供了一般显示、特殊显示、特技处理等大量复杂的功能。图形处理技术得益于图形学的发展,而从目的上可以将图像处理技术分为两类,分别是图像识别技术和图像处理技术。针对图像处理技术,可以是旋转、亮度、对比度、饱和度、RGB调节、调节图像尺寸等属性方面的处理技术和添加文字、图像增强、弱化、水印、特效、镂空等处理方法。甚至为了达到更精微的处理效果,这些软件还使用了图层。随着网络和多媒体技术的发展和应用,体现在应用软件中的是一些更具有“现代感”的应用,例如,支持各种常用图形、RAW原始图片、Flash动画的快速浏览、编辑、保存、导入、导出,甚至还可以提供一些趣味涂鸦、字符素描之类的应用,以体现人的个性[3]。事实上,应用软件中常常需要采用其中的某些技术来处理相关的问题。例如,一个支持简单形状辅助设计的软件并不需要支持特效方面的方法。在软件设计的支撑环境和技术上,C++是一个很好的选择,这主要是考虑到如下因素,主要包括代码效率高,处理底层问题能力强,支持面向对象的程序设计方法。利用C++技术可以实现对程序代码和数据的良好封装,使之能够具有良好的重用性。1.3研究方法与手段1.3.1运行环境运行环境主要介绍了硬件环境和软件环境。(1)硬件环境①处理器:InterPentium166MX或更高②内存:32MB或更高③硬盘空间:1GB或更高④显卡:SVGA显示适配器(2)软件环境操作系统:Window98/ME/2000/XP1.3.2开发环境开发环境主要介绍了本系统采用的操作系统、开发语言。(1)操作系统:WindowsXP(2)开发语言:C++(3)开发环境:VisualC++6.0第2章图形图像处理系统相关技术综述2.1图形设计基础2.1.1VisualC++技术概要面向对象程序设计(Object-OrientedProgramming,简称OOP)方法已出现近30年,在20世纪90年代己成为程序设计的主流方向。面向对象程序设计语言是现代程序开发的主要工具。程序包含两类基本的元素,即数据和操作数据的指令集(称为代码)。传统的程序设计语言以设计代码为核心,程序设计实际上就是指定程序指令的先后次序,数据表示必须适应代码的设计。模块化程序设计方法将完成某一功能的指令集组成一个相对独立的程序模块(即函数或过程),使得程序的结构清晰,便于有效的维护,对程序设计技术有很大的促进。但由于结构化程序设计方法并不能保证各程序模块之间真正的相互独立,程序设计者在设计一个模块时很难完全排除其他模块的影响。随着程序规模的增大,各模块之间的相互影响导致一些难于测试,难以定位发现的错误,增加了程序开发和维护的困难。面向对象程序设计方法主要以数据为中心,代码是围绕着需要处理的数据而设计的[4]。2.1.2图形设备接口GDI图形设备接口(GDI)是一个抽象的接口。通过该接口可以实现对图形的颜色、线条的粗细等属性的控制。程序可以通过调用这些GDI函数和硬件打交道的,从而实现了设备无关性[5]。2.1.3设备环境DC设备环境DC(DeviceContext又称设备上下文,也称设备描述表)是一个关于如何绘制图形的方法的集合,它可以绘制各种图形,确定在应用窗口中绘制图形的方式,即确定绘图模式和映射模式。在绘图之前,必须获取绘图窗口区域的一个设备环境DC。接着进行GDI函数的调用,执行适合于设备环境DC的命令。获取DC时,Windows初始化了一套完整的属性和对象集合,可以使用它们渲染显示。为了创建自己应用程序的特定显示,可以更改这些属性和对象。Windows的设备环境是GDI的关键元素,它代表了不同的物理设备[5]。分为4种类型,包括显示器型,打印机型,内存型和信息型。每种类型的设备环境都有各自的特定用途,详见表2-1。表2-1设备环境的类型和用途设备环境用途显示器型打印机型内存型信息型支持视频显示器上的绘图操作支持打印机和绘图仪上的绘图操作支持位图上的绘图操作支持设备数据的访问2.1.4CDC类的派生类的功能及其之间的区别CDC各派生类各有特点,并可以完成不同的功能,表2-2介绍了各派生类的主要功能。表2-2CDC类的派生类简介派生类名称说明CClientDC这是一个设备描述表,提供对窗口客户区域的图形访问。在窗口中画图时可使用此类DC,但对WM_PAINTWindows消息除外。CMetaFileDC这个设备描述表代表Windows元文件,它包含一系列命令已重新产生图像。想要创建独立于设备的文件时可使用此类DC,用户可以回放这种文件来创建图像。续表2-2说明派生类名称CPaintDC这是创建WM_PAINTWindows消息的设备描述表。应用程序可以使用此DC更新Windows显示,通常在MFC应用程序的OnPaint()函数中使用。CWindowDC可以提供在整个窗口(包括客户区和非客户区)中画图的设备描述表。(1)CWindowDC类与CPaintDC和CClientDC类的区别CWindowDC类与CPanitDC类和CClientDC的区别的一个方面是:用CPaintDC类CClientDC类的对象绘制图形时,绘制区只能是客户区,而不能在非客户区,而CWindowDC可以在非客户区进行图形绘制。CWindowDC一般在窗口类中(CMainFrame)引用,在视图窗口中引用CWindowDC类时,由于视图类只能管理客户区,所以并不能在非客户区进行绘制。他们之间区别的另一个方面是:在CWindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕的左上角,而在CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角[6]。(2)CPainDC类与CClientDC类的区别CPaintDC类与CClientDC类都是在窗口的客户区内绘制图形,但两者在绘制上有着本质的区别。CPaintDC类应用在OnPaint函数中,以响应Windows的WM_PAINT消息,而CClientDC应用在非响应消息WM_PAINT的情况下。CPaintDC类响应WM_PANINT消息,自动完成绘制,这对维护图形的完整性有着重要的作用。2.1.5与绘图相关的GDI对象类本节主要介绍与绘制各种图形元素相关的GDI对象类。所谓基本绘图对象类主要包括CBitmap类、CBrush类、CFont类、CPen类、CRgn类。它们都是CGdiObject类的派生类[6]。简要介绍如下。(1)CBitmap——位图是一种位矩阵,每一个显示像素都对应于其中的一个或多个位。利用位图来表示图像,创建画刷。(2)CBrush——画刷定义了一种位图形式的像素,利用它可对区域内部填充颜色。(3)CFont——字体是一种具有某种风格和尺寸的所有字符的完整集合。(4)CPen——画笔是一种用来画线及绘制有形边框的工具,可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。(5)CRgn——区域是由多边形、椭圆或二者组合形成的一种范围,可以利用它来进行填充、裁剪。(6)CPalette——调色板是一种颜色映射接口,允许应用程序在不干扰其他应用程序的前提下,充分利用输出设备的颜色描绘能力。2.1.6坐标变换和映射模式在本节讨论两种坐标系——逻辑坐标系和设备坐标系及其相互之间的转换。坐标映射方式是指两种坐标系在相互转换时,逻辑单位和设备单位之间存在的某种比例关系。(1)逻辑坐标和设备坐标的转换设备坐标是针对屏幕或其他显示设备而言的。其原点在屏幕的左上角。X轴正方向为向右,Y轴的正方向为向下。原点位于窗口的左上角点处。单位为像素。逻辑坐标则是在内存中虚拟的一个坐标系。其原点在屏幕的左上角。X轴的正方向为向右,Y轴的正方向为向上。其单位随着映射模式的不同而改变。(2)窗口和视口窗口是虚拟存在的一个屏幕,在屏幕上看到的图形是视口。Windows在绘制图形时,并不是把图形直接绘制到屏幕上,而是绘制到特定的映射模式下的逻辑坐标系虚拟的窗口中,然后将这个图形映射到一个视图中,即视口中。而当前的设备(如屏幕,打印机)显示出来的就是该视图的一部分[7]。(3)设置绘图模式绘图模式指定了画笔颜色和被填充物体内部颜色是如何与显示平面的颜色相混合的。绘图模式是描述两个变量的所有可能的布尔组合,指采用什么方式进行绘制工作,而采用的方式主要体现在像素颜色的设定。2.2图像设计基础2.2.1数字图像的基本概念人眼看到的任何自然界的图像都是连续的模拟图像,其形状和形态表现由图像各位置的颜色所决定。色度学理论认为,任何颜色都可由红(Red)、绿(Green)、蓝(Blue)3种基本颜色按不同的比例混合得到。红、绿、蓝被称为三原色,简称RGB三原色。因此,自然界的图像可用基于位置坐标的三维函数来表示,即f(x,y,z)=(fred(x,y,z),fgreen(x,y,z),fblue(x,y,z)))(2-1)其中f表示空间坐标为(x,y,z)位置点的颜色,fred、fgreen、fblue分别表示该位置点的红、绿、蓝3种原色的颜色分量值。它们都是空间的连续函数,即连续空间的每—点都由一个精确的值与之相对应。为了研究的方便,主要考虑平面图像。平面上每一点仅包括两个坐标值。因此,平面图像函数是连续的二维的数,即f(x,y)=(fred(x,y),fgreen(x,y),fblue(x,y)))(2-2)图像可以分为黑白图像和彩色图像。所谓黑白图像,就是图像中每一点都不是彩色的,即每—点的红、绿、蓝颜色分量值都相等,即fred=fgreen=fblue(2-3)对于黑白图像,其f(x,y)表示(x,y)位置处的灰度值。由于计算机仅能处理离散的数据,所以如要用计算机来处理图像,连续的图像函数必须转化为离散的数据集,这一过程叫做图像采集[7]。图像采集由图像采集系统完成,如图2-1所示。图像采集系统包括3个基本单元,即成像系统、采样系统和量化器。图2-1图像采集系统2.2.2调色板现实世界的颜色种类是无限的,但计算机显示系统所能表现的颜色数量是有限的。因此,为了使计算机能最好地重现实际图景,就必须采用一定的技术来管理和取舍颜色。按表现能力的不同,现代计算机的显示系统可以分为以下3种。(1)VGA:能用640×480的分辨率同时显示16种颜色。(2)SuperVGA:能用640×480的分辨率同时显示256种颜色(3)真彩色:能同时显示16777216种颜色。所谓真彩色(TrueColor),是指显示出来的图像的颜色与真实世界中的颜色非常自然逼真、人眼难以区分它们的差别。通常使用RGB表示法来表现真彩色图像,即用3字节(24位)来表示—个真彩色像素的颜色值,红、绿、蓝三原色的浓度分别用一字节(8位)来表示。Windows采用该方法来表现颜色,其SDK提供一个名为RGB的宏来将不同的R、G、B颜色值转化为24位的颜色值,其原型如下所示。COLORREFRGB(BYTEbRed,BYTEbGReen,BYTEbBlue)(2-7)COLORREF是表示颜色值的数据类型,是一个32位的无符号长整数;bRed、bGreen和bBlue分别表示红、绿、蓝三原色的浓度,它们的类型是BYTE,长度是8位。其十六进制数据表示形式如下所示。0x00bbggrr(2-8)字节rr、gg、bb比分别表示红、绿、蓝三原色的浓度,最高位字节为0,用于保留与将来的系统兼容[8]。2.2.3调色板的概念在真彩色系统中,每一个像素的值都用24位来表示。像素值与真彩色颜色值可以一一对应,所以像素值就是所表现的颜色位。但对于仅能同时显示16色或256色的系统,每一个像素仅能分别采用4位或8位来表示,像素值与真彩色颜色值不能一一对应,用像素值代表颜色值的方法将不能得到最佳的效果,而必须采用调色板技术。所谓调色板就是在16色或256色显示系统中,由图像中出现最频繁的16种或256种颜色所组成的颜色表。对这些颜色按4位或8位,即0至15或255进行编号,每一编号代表其中的一种颜色。这种颜色编号叫做颜色的索引号,4位或8位的索引号与24位的颜色值的对应表叫做颜色查找表。使用调色板的图像叫做调色板图像。它们的像素值并不是颜色值,而是颜色在调色板查找表中的索引号[9]。为了保证Windows的基本显示界面的一致性,Windows保留了一个有20种颜色的内部系统调色板,用来绘制窗口的图标、边界和按钮等通用界面。该调色板在所有的显示设置中都保持不变。在16色的显示系统中,系统调色板通过16种颜色的抖动来产生其余4种颜色。在256色的显示系统中,Windows也保持该20种颜色的次序,其余的236种颜色由当前的调色板分配[10]。第3章图形图像处理系统的总体设计3.1需求分析市场上的图像处理软件大都功能强大,需要好一阵子适应,普通的用户根本用不到那么多的功能。所以,可以开发一种简单小巧,可进行基本图像处理,图形绘制的软件非常必要。利用一个设计良好的简单的小图形图像处理程序可以用于教学演示的目的,展示基本的图形图像处理技术和面向对象技术在这一领域的应用效果。通过对独立功能的封装,可以为今后需要的图形图像的应用奠定基础。此外,借助VisualC++语言这种典型的面向对象编程环境,能够充分挖掘硬件的潜能,得到性能优良的程序代码。3.2图形图像处理系统目标设计系统的设计目标是采用面向对象的程序设计技术实现一个图形绘制和图像处理的应用软件,满足普通用户对于图形图像应用程序的简单需求。主要工作分为三类,包括基本图形绘制与编辑、图像格式识别与转换、简单的图像处理。3.3图形图像处理系统功能描述系统的主要功能包括绘制各种简单图形、改变所绘图形的颜色、线条类型、打开和存储各种常见的图像文件、对图像进行简单的处理。(1)图元绘制①直线图元,或者称为线段图元,允许用户使用鼠标选择直线顶点绘制。②圆图元,允许用户利用圆心和半径来进行绘制。③矩形图元。④圆角矩形图元。(2)改变绘制条件在绘制图元时要能够改变绘制条件,主要包括如下内容。①改变线条颜色,使用户可以绘制出不同颜色的图元。②改变线条类型,使用户可以绘制出不同线型的图元。③改变填充方式,使用户可以选择不同的填充方式。(3)图元修改包括如下操作。①删除图元。②平移图元。③镜像图元。④旋转图元。(4)图元属性修改①改变被选图元颜色。图3-1图形图像处理系统功能描述图图3-2图形图像处理系统功能描述图图形部分图3-3图形图像处理系统功能描述图图像部分②改变被选图元线型。③改变被选图元线宽。(5)图像格式处理能够打开、存储、关闭几种常见图像文件,隐含了格式的转换。(6)图像变换包括旋转、镜像。(7)图像处理包括图像平滑、锐化。根据功能模块分析,完整的系统功能描述参见图3-1。3.4界面设计3.4.1主界面设计图形图像系统启动界面,如图3-4所示。图3-4图形图像系统启动界面考虑到图像处理的方便,决定采用多文档(MDl)界面。基本的绘图工具都在两个工具栏中体现出来,这是为了方便用户绘图的需要,属性单独使用一个对话框使设置图元的属性更加方便,而且使界面看起来更加的美观。图形图像系统界面如图3-5所示。图3-5图形图像系统界面3.4.2菜单设计主菜单如图3-6所示,包括文件、编辑、查看、窗口、图像变换、图像处理、帮助菜单项。图3-6图形图像系统菜单图像变换菜单包括图像的旋转和镜像,图像处理菜单包括平滑和锐化。图3-7图像变换和图像处理菜单3.4.3工具栏设计工具栏方便绘图,所以本系统把常用的绘图操作命令都用工具栏来实现,如图3-8、图3-9是本应用程序的工具栏。主工具栏中包括打开、新建、保存、回退,设定画布大小等命令。图3-8主工具栏绘图工具栏中包括绘制直线,矩形,圆角矩形,圆,椭圆等图形。图3-9绘图工具栏3.4.4属性框设计属性框可以设置绘图图形的属性,包括线型,线宽,颜色的属性属性框的界面如下图如3-10所示。图3-10属性框界面第4章图形图像处理系统图像部分设计4.1与设备无关位图(DIB)Windows3.1以上版本提供了对设备无关位图DIB的支持。DIB位图可以在不同的机器或系统中显示位图所固有的图像。与DDB相比而言,DIB是一种外部的位图格式,经常存储为以.BMP为后缀的位图文件(有时也以DIB为后缀)。DIB位图还支持图像数据的压缩[11]。4.1.1DIB位图的结构DIB位图文件的结构如图4-1所示,包括位图文件头结构BITMAPEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素数据4部分。位图文件头结构BITMAPEHEADER位图信息头结构BITMAPINFOHEADER位图颜色表RGBQUAD位图像素数据图4-1DIB位图的结构上面结构中各数据域的意义如表4-2所示。表4-1Windows位图结构数据域的含义结构数据域含义BITMAPFILEHEADERbfType字节“BM”bfSize文件总字节数bfReserved10续表4-1结构数据域含义bfResrved20bfOffBits位图数据距文件头的偏移量BITMAPINFOHEADERbiSize本结构大小的字节数biWidth位图的宽度,单位为像素点biHeight位图的高度,单位为像素点biPlanes1bitBitCount像素的位数(1,4,8,24)biCompression压缩方式(0表示不压缩)biSizeImage位图数据的字节数biXpelsPerMeter水平分辨(像素点每米)biYpelsPerMeter垂直分辨(像素点每米)biClrUsed图像中使用的颜色数biClrImportant图像中重要的颜色数RGBQUADrgbBlue蓝色的比例rgbGreen绿色的比例rgbRed红色的比例rgbReserved0DIB位图像素的位数可为1、4、8和24,其图像的颜色数分别为2、16、256和真彩色其中前3种具有对应的颜色表,而24位位图的颜色表为空,其像素值就是颜色值[12]。4.1.2定义DIB处理函数集定义的DIB处理函数如表4-2所示。表4-2DIB处理函数集函数类型函数名功能初始化函数CreateDIB创建一个空的DIBCreateDefaultDIB用当前的系统调色板创建一个空的DIBDestroryDIB释放DIB内存块LoadDIB从DIB文件中装载DIB数据SaveDIB读DIB存到文件中ReadDIBFile读DIB存到内存中属性函数BytesPerLine获取DIB每行所占的字节数DIBlockSize获取DIB数据块的大小DIBHeight获取DIB高度DIBWidth获取DIB宽度DIBNumColors获取DIB的颜色数DIBBitCout获取DIB的图像颜色位数FindDIBBits获取DIB数据块的地址(指针)PletteSize获取DIB的调色板中的颜色表项数显示函数PaintBitmap显示DDBPaintDIB显示DIB续表4-2函数类型函数名功能PaintDIB显示DIBDIBToDIBSetion将DIB数据块转换为DIBSECTION操作函数DIBSectionToDIB将DIBSECTION转换为DIB数据块ConvertDIBFormat修改的格式BitmapToDIB将DDB转换为DIBChangeBitmapFormat修改DDB的格式DIBToBitmap将DDB转换为DIBChangeDIBFormat基于当前的系统调色板修改DIB调色板函数CreateDIBPalette创建DIB调色板DisplayPalette显示调色板CopyPalette拷贝调色板GetSystemPalette获取当前的系统调色板PalEntriesOnDevice获取设备的调色板表项数CreateIdentifyPalette创建等同调色板MapDIBColorsToPalette按指定的调色板映射DIB的颜色捕获函数CopyScreenToBitmap将屏幕显示转换为一个DDBCopyWindowToBitmap将指定窗口的显示转换为一个DDBCopyClientRectToBitmap将指定窗口用户区的指定区域显示转换为一个DDBCopyScreenToDIB将屏幕显示转换为一个DIBCopyWindowToDIB将指定窗口的显示转换为一个DIB4.1.3CDib类的设计目标实现图像处理的基础是设计一个解释位图的DIB类(名CDib),基本功能如下所述。(1)多种形式的构造函数,包括创建空DIB、从DDB创建、从DIB句柄创建、从DIB数据块指针创建及从屏幕或窗口显示创建等;(2)支持拷贝构造函数和赋值运算;(3)DIB文件的读、写操作;(4)从资源中装载DIB位图;(5)DIB的显示;(6)提供DIB的空间颜色和格式特征等信息;(7)DDB与DIB的相互转换;(8)DIB格式转换;(9)DIB调色板操作;(10)能获取DIB位图数据的句柄;(11)能生成DIB数据的拷贝。4.2图像变换4.2.1图像变换的理论基础图像变换主要是指几何变换或空间变换,是一种建立一幅图像与其变形后的图像中所有各点之间映射关系的函数,可表示为:[x,y]=[X(u,v),Y(u,v)](4-1)或[u,v]=[U(x,y),V(x,y)](4-2)其中,[u,v]表示输出图像中像素的坐标,[x,y]表示输入图像中像素的坐标。X、Y、U、V惟一确定空间变换的映射函数,即它们唯一地定义了输入图像和输出图像中所有点之间的几何对应关系。X、Y将输入映射到输出,称为向前映射(Forwardmapping);U、V将输出图像映射到输入,称为逆向映射(Inversemapping)。4.2.2旋转在实际的应用中,最常用的是直角旋转,包括对位图(逆时针)旋转90°、180°和270°。其中最基本的是旋转90°的操作,旋转180°和270°的操作可借助旋转90°的操作来实现。将位图旋转90°的实现步骤如下所述。(1)创建一个新DIB,其颜色信息与源位图相同,注意新位图的宽、高分别为源位图的高和宽。(2)根据位图的存储位大小,分别对1位、4位、8位和24位的位图进行旋转,即对DIB的每一像素进行旋转变换。图4-3为图像经过旋转90度之后的效果。图4-2原图图4-3旋转90度之后的图像4.2.3镜像镜像变换有两种基本形式,即水平镜像和垂直镜像。前者是将图像所有像素的排列左右反转,后者是将图像所有像素的排列上下反转。图4-4原图图4-5水平镜像之后的图像4.3图像处理的基本方法基本的图像处理方法可分为点处理和区域处理两类。点处理相对较简单,只能改变图像的灰度分布,但不会改变图像内的空间关系。点处理可以按预定的方式改变图像的灰度直方图。最常用的点处理是灰度直方图均衡。区域处理在处理某一像素时,利用与该像素相邻的一组像素,经过某种变换得到处理后图像中某一点的像素值。目标像素的邻域一般是由像素组成的二维矩阵,该矩阵的大小为奇数。目标像素位于该矩阵的中央,即目标像素就是区域的中心像素。经过处理后,目标像素的值为经过特定算法计算后所得的结果。区域中心像素周围的那些像素值在二维方向上提供了图像的亮度变化趋势的信息。图像中像素的亮度在一定距离上的变化速率称为图像的空间频率。区域处理将改变图像的空间频率信息,减缓或增强图像中的某些特定的频率分量[13]。主要的区域处理算法有卷积法、中值滤波法和Sobel边缘检测法。我们这里只介绍卷积法。(1)卷积原理卷积可以简单地看成加权求和的过程。卷积时使用的权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小相同。这种权矩阵叫做卷积核,区域中的每个像素分别与卷积核中的每个元素相乘,所有乘积之和即为区域中心像素的新值。卷积核中各元素叫做卷积系数。卷积核中卷积系数的大小、方向及排列次序决定了卷积的图像处理效果。大多数常用的卷积核都是3×3的,所有卷积核的行、列数都是奇数[14]。(2)低通滤波:图像平滑与模糊低通滤波的基本思路是保留图像空间频率的低频成分,减少图像的高频成分。低通滤波可以降低图像中的视觉噪声,同时除去图像中的高频部分后,图像中那些本来不明显的低频成分就更容易识别了[15]。(3)高通滤波:图像锐化与清晰高通滤波增强图像的高频空间频率成分,阻挡低频中间频率成分。相对于高频成分来说,低频成分被削弱了。在需要突出图像中的高频成分时,可对图像进行高通滤波。(4)平滑与锐化对图像进行低通滤波将使图像平滑;而对图像进行高通滤波将使图像锐化。因此图像的平滑与锐化处理实际上就是对图像进行低、高通滤波,即用低、高通滤波器作为卷积核来对图像进行卷积处理。图4-6原图图4-7平滑之后的图像图4-8锐化之后的图像4.4图像格式用数字来表示图有两种不同的方式,即位图(又称为栅格或像素图)和矢量图。在具体的实现上,不同的厂家,在不同的系统上和不同的软件中又采用不同的图像表示方式,即以不同的图像格式,来表示数字图像。4.4.1PCX格式(1)文件结构概述PCX格式由3个部分组成,即文件头、位图数据和一个多达256种色彩的调色板。PCX文件由固定的128字节的文件头开始。文件头包含版本号、被打印或扫描图像的分辨率(单位为每英寸点数)、大小(单位像素数)、每扫描行字节数、每像素位数和彩色平面数等信息。文件还可包括一个调色板以及表明该调色板是灰度还是彩色的一个代码。(2)格式详解文件头如表4-3所示。表4-3PCX文件头起始字节字节数内容解释01Zsoft标志10(0x0a),ZsoftPCX文件的标志11版本号0:PCPaintbrush2.51:PCPaintbrush2.821编码1:PCX游程长度31位/像素每个平面的位/像素值,可能值为1,2,4,或848图像大小图像边界极限为Xmin,Ymin,Xmax,Ymax,以像素为单位122水平分辨率打印时,X方向的每英寸点数续表4-3起始字节字节数内容解释142垂直分辨打印时,Y方向的每英寸点数1648文件头调色板调色板部分的说明641保留字节Zsoft保留,为0651平面彩色/灰色平面数,PCX图像可以是单彩色,也可以具有多个颜色平面662每行字节数每个色彩平面的每行字节数,即存储未压缩图像的一个扫描行所需的字节数,总是偶数682调色板解释1:彩色或黑白2:灰度702视频屏幕大小X视频输出的水平像素数-1722视频屏幕大小Y视频输出的垂直像素数-17454全空直到文件结束05.4.2GIF格式GIF(GraphicsInterchangeFormat,图形交换格式)文件由CompuServe公司开发并持有该文件格式的版权。GIF图像是基于颜色列表而存储,即图像中每一点的存储数据是该点的颜色对应于颜色列表的索引值。GIF图像最多支持8位存储位,即最多仅支持256色图像。GIF文件内部是按块划分的,包括控制块(ControlBlock)和数据块(DataSub-blocks)两种。控制块控制数据块行为,不同的控制块包含一些不同的控制参数;数据块只包含—些8-bit的字符流,由它前面的控制块来决定它的功能。每个数据块大小从0到255个字节不等。数据块的第一个字节存储这个数据块大小(字节数),但数据块的大小不包括这个字节。所以即使空的数据块也有一个字节,即数据块的大小为0x00。如图4-9所示显示了一个GIF数据块的结构。图4-9GIF数据块的结构图4-10GIF文件的结构一个GIF文件的结构可分为文件头(FileHeader)、GIF数据流(GIFDataStream)和文件终结符(Tailer)3个部分。文件头包含GIF文件署名(Signature)和版本号(Version),包括GIF数据流由控制标识符、图像块(ImageBlock)和其他的一些扩展块组成;文件终结符只有一个值为0x3B的字符表示文件结束。如图4-10所示显示了一个GIF文件的组成结构。4.4.3JPEGJPEG的全称是“联合图片专家组(JointPhotographicExpertsGroup)”,是由该专家组制订的用于连续色调(包括灰度和彩色)静止图像的压缩编码标准。JPEG标准的压缩编码算法是“多灰度静止图像的数字压缩编码”。JPEG标准包括3部分,即编码器、译码器和交换格式。编码器将原始图像的编码压缩成压缩数据,译码器将压缩的图像数据还原成原始图像数据。图像压缩数据以一定的交换格式存储。第5章图形图像处理系统图形部分设计5.1图形类的设计图形类的设计这一节介绍了图形类的层次结构,类层次设计的特点和设计原则以及图形类的一些实现代码。5.1.1图形系统的层次结构利用面向对象的方法,将图形的基本属性归结为一个抽象基类,基类里包含有图形的类型、图形的颜色、绘制图形的线型和线宽等。该类并不用于创建真正的对象。抽象类代表一个概念;而派生类实现了具体的一个特定的图形。不应该直接创建一个真正的基类对象。只可以创建诸如直线一样的特定图形;而抽象类的用途体现在多态性的应用上;可以通过抽象基类的指针访问具体的派生类的对象[16]。根据需求设计类的层次,图5-1说明了本程序小型图形软件中类的层次。图5-1部分类的层次结构5.1.3类层次性的特点类的层次性具有如下的特点。(1)类的顶部是一个基类,它提供了公共的功能(包括公共数据成员和成员函数)。(2)派生类继承了基类的所有成员,同时派生类可以通过添加新的数据成员和成员函数来扩展基类。(3)派生类可以覆盖基类的成员函数(尤其是虚函数),从而在派生类中给该函数提供新的行为。5.1.4图形系统类层次的设计原则图形系统类层次的设计原则:(1)确定基类是否为抽象类对于基类CEntity而言,其成员函数中的Draw函数是没有任何现实意义的,因此声明Draw函数为纯虚函数,这也就决定了基类CEntity为抽象类。而对于派生类(CLine、CRectangle、CCircle)都具有特定的形状,都需要通过Draw函数将它所在类的对象在屏幕上显示出来[17]。(2)确定哪个成员函数为虚函数根据上面的分析.可以确定绘制函数Draw为虚函数;要实现图形元素的移动,由于图形的形状不同,所以对于移动所进行的操作也不相同,直线要同时移动起点和终点,而圆只移动圆心即可,因此确定移动函数Move为虚函数。另一方面,设置图元的颜色和线型函数,任何图形都可以采用相同的方法,所以不将其声明为虚函数,只需要在基类中给出其具体的定义,在派生类中将该函数继承[18]。(3)确定基类具有的功能对于派生类所有的公共功能,应该放在基类中,这样才能体现类的层次性,派生类可以继承它。属于某类特有的功能,就把它加入到该派生类中。在本小型图形系统中,所有图形对象都具有颜色、线型等属性,所以设置和获取这些数据成员的功能都放在基类中;而每个派生类都通过不同的方法来绘制自己,因此每个派生的图形类都覆盖了基类的CEntity::Draw函数。另一方面,对于具体图形类所特有的功能,在具体的图形类自身进行实现[19]。5.1.5基类CEntity根据上面对于基类的描述,设计基类CEntity如下所示。classCEntity{protected:int m_type;//图元类型COLORREFm_color;//图元颜色UINTm_lineStyle;//图元的线型intm_lineWidth;//图元的线宽public://构造函数和析构函数CEntity();CEntity(constCEntity&entity);~CEntity();virtualintGetType(){returnm_type;}//返回图元的类型COLORREFGetColor(){returnm_color;}//返回图元颜色voidSetColor(COLORREFcolor){m_color=color;}//设置图元颜色virtualvoidDraw()=0;//绘制图元对象}5.1.6命令基类CCommand创建和修改图元对象的操作抽象成一个基本类CCommand。classCCommand{protected:intm_nStep;//命令操作步public:CCommand(){}~CCommand(){}virtualintGetType()=0;//返回命令类型ECommandTypevirtualintOnLButtonDown(UINTnFlags,constPosition&pos)=0;virtualintOnMouseMove(UINTnFlags,constPosition&pos)=0;virtualintOnRButtonDown(UINTnFlags,constPosition&pos)=0;virtualintCancel()=0;};5.2派生类设计具体图形类CLine、CRectangle、CCircle都是从基类CEntity派生出来的。5.2.1派生类Cline直线类CLine应具备以下特点。(1)串行化支持与基类CEntity一样,可以通过声明DECLARE_SERlAL(CEntity)宏和IMPLEMENT_SERIAL宏来添加直线类的串行化支持。(2)添加数据成员除了继承基类的数据成员外,直线类还要添加与自身特性相关的数据成员,起点或终点坐标位置。(3)直线类要具有自己的构造函数和重载赋值操作符。(4)直线类要重载基类中必要的虚函数以及所有的纯虚函数。重载基类中的Draw函数,每个图形对象仅对它自己所绘制的图形负责,在该对象之外没有别的对象知道如何绘制直线,只有它才能绘制出自身的直线形状。5.2.2派生类Cline的具体实现根据上面对于直线派生类的描述,设计直线派生类Cline如下所述。classCLine:publicCEntity{protected:Positionm_begin,m_end;//起点和终点public:CLine();CLine(constCLine&line);CLine(constPosition&begin,constPosition&end);~CLine();CLine&operator=(constCLine&line);CEntity*Copy();intGetType();voidInit();PositionGetBeginPos();//返回起点值PositionGetEndPos();//返回终点值voidDraw();}5.2.3创建直线命令类CCreateLine创建直线命令类CCreateLine是从命令基类CCommand派生而来classCCreateLine:publicCCommand{private:Positionm_begin;//直线的起点Positionm_end;//直线的终点public:CCreateLine();~CCreateLine();intGetType();intOnLButtonDown(UINTnFlags,constPosition&pos);intOnMouseMove(UINTnFlags,constPosition&pos);intOnRButtonDown(UINTnFlags,constPosition&pos);intCancel();};5.3位置类Position本节介绍了位置类Position的实现代码和构造此类的理由。5.3.1构造位置类的原因在对图元对象进行处理时.很多时候可以归结为对点位置的处理,例如,绘制直线要给出两个位置,旋转直线实际上是对两个位置的旋转。所以,将这个位置归结为一个类是非常有必要的。MFC类库提供了与这个位置相关的类CPoint,本图形系统没有采用,而是进行了自己的位置类的设计。(1)CPoint提供的点坐标为整型变量,精度远远不够。(2)CPoint的坐标为屏幕坐标上的点,而对于一个图形元素来说,它是客现存在的,仅当显示在屏幕上时,才与计算机屏幕发生关系,所以简单的用屏幕坐标记录一个现实世界客观存在的对象是不合理的。(3)CPoint的成员函数并不能完全满足设计的需要。(4)一个很重要的原因是CPoint是MFC库,如果设计的图元类的基本成员变量都和CPoint相关,势必造成程序的可移植性极差,尤其体现在向其他编译平台移植时[20]。5.3.2位置类Position的实现下面我们给出Position的实现过程。(1)重载了大量的运算符,使得使用更加灵活方便。(2)完全由自己定义,可以进行跨平台移植。(3)可扩充性良好,可以很方便地向该类添加新的成员函数;而且可以将这个二维位置类Position转为三维位置类,只需在原来的基础上添加成员变量z(表示空间点的Z坐标值),并在成员函数中仿照x和y添加有关坐标z的信息即可。根据上面的描述,图形系统的位置类实现如下所述。//定义位置类classPosition{public:doublex;doubley;public:Position();Position(doubleox,doubleoy);Position(constdouble*pnt);Position(constPosition&positionSrc);~Position();voidInit();//初始化成员变量double&operator[](constint&i);operatorconstdouble*()const;operatordouble*();constPosition&operator=(constPosition&positionSrc);voidSet(doublex,doubley);voidSet(constdouble*pnt);friendPositionoperator+(constPosition&position1,constPosition&position2);friendPositionoperator-(constPosition&position1,constPosition&position2);friendPositionoperator*(constPosition&position,constdouble&scale);friendPositionoperator*(constdouble&scale,constPosition&position);constPosition&operator+=(constPosition&positionSrc);constPosition&operator-=(constPosition&positionSrc);constPosition&operator*=(constdouble&scale);doubleDistance(constPosition&pnt);BOOLIsSame(constPosition&pointSrc);BOOLIsInBox(constBOX2D&box);voidSerialize(CArchive&ar);};5.4图元拾取图元拾取主要介绍了直线的拾取、圆的拾取以及图元拾取的准确度和可靠性。5.4.1直线的拾取直线的拾取具体步骤如下所述。(1)做一个包容此线段的包围盒(该包围盒可由直线段的最小包围盒向四周扩展给定拾取精度得到),判断拾取点是否在包围盒内。如果不在,则拾取失败。(2)否则,计算拾取点到直线的距离,利用下面的公式计算。DIST=fabs(X*cosA+Y*sinA-P)(5-1)其中,X、Y是拾取点与直线段的起点的坐标差;A为直线段与X轴正向的夹角;P为拾取点与直线
/
本文档为【图像识别技术和图像处理技术】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索