VC环境下实现图像融合.docx
《VC环境下实现图像融合.docx》由会员分享,可在线阅读,更多相关《VC环境下实现图像融合.docx(76页珍藏版)》请在冰点文库上搜索。
VC环境下实现图像融合
图像融合
摘要
数字图像处理是计算机学一门重要的学科,并且成为科学研究的热点话题。
所谓的数字图像处理就是把图像进行计算机处理,其中对图像的融合处理是现阶段的研究热点。
本文将对图像融合进行以下的研究和使用。
包括图像预处理、创建融合图像和对融合图像进行质量评价。
图像预处理包括图像去噪、图像加强以及图像配准几个步骤,其中图像配准是预处理中最为关键的一步,直接关系到融合图像的质量;创建融合图像是对至少两幅源图像,在空域或频域根据一定的规则加以组合,创建一个全新的图像;最后就是对融合图像的质量进行评价。
在VC环境下编写源代码,先创建框架,划分成四个模块,识别BMP图像信息,读取并保存其信息,分析扫描找到两幅图片的相同部分,找到相同部分后去除第二张图片和第一张一样的部分,然后创建一个新的图片存储区域,其大小为第一张图片的大小和第二张图片剩下的部分的和,最后将两张图片移到这个新的图片区域中。
用C++代码和类库函数来实现。
根据Campbell和Robson的实验表明,人的视网膜在不同的频道中进行处理,小波分解的图像融合也是这样处理的,因而可获得与人的视觉特性接近的融合效果。
所以,在本次课题中我们将详细的介绍基于小波的融合方法。
最后,我在实现图像融合时,利用了动态链接库的技术,把融合代码封装成一个.dll.以便融合代码可以应用到其他的程序中。
关键词:
C++,链接库,图像处理,图像的配准,图像融合,小波变换
Imagefusion
ABSTRACT
Digitalimageprocessingisacomputersciencemajordisciplines,andbecomeahottopicofresearch.Digitalimageprocessingisthatthecomputerimageprocessing,andtheintegrationofimageprocessingisthecurrenthotspot.
Thispaperwillbeconductedthefollowingimagefusionresearchanduse,includeimagepreprocessing,imagefusionandthecreationoffusionimagequalityevaluation.ImagepreprocessingincludeImageDenoising,imagestrengthenandImageRegistration.ImageRegistrationpretreatmentisthemostcrucialstep,directlyrelatedtotheintegrationofimagequality.Fusionimageisthecreationofatleasttwosource’simage,inairspaceorfrequencydomainbasedoncertainrulesofportfolio,andCreateabrandnewimage,atlastevaluationtheimage.
AccordingtoCampbellandRobsontheexperimentsshowthattheretinaindifferentchannelsforprocessing,waveletdecompositionofimagefusionisthewaytodealwithit.Inthisissuewewillelaborateontheintegrationofwavelet-basedmethod.
Intheends,Irealizeimagefusion,theuseofadynamiclinklibrary,canintegrationintoacode’smodule,sothatthemodulecanbeappliedtootherprocedures.
KeyWords:
C++library,ImageProcessing,Imageregistration,ImageFusion,WaveletTransform
目录
前言.....................................................1
第1章VisualC++与MFC简介..............................2
1.1VisualC++的特点....................................2
1.2面向对象技术与MFC概述..............................3
1.2.1面向对象技术.................................3
1.2.2MFC编程框架..................................3
第2章图像处理基础........................................5
2.1位图和调色板的概念...................................5
2.2bmp文件格式..........................................6
2.3bmp文件的读取......................................6
第3章分析基于VC环境下的图像融合.........................15
3.1融合的介绍.........................................15
3.2融合图像的条件.....................................15
3.2.1图像增强......................................15
3.2.2图像平滑......................................16
3.2.3图像配准的概念................................16
3.3图像拼接技术(融合的基础)..........................16
3.3.1图像拼接的概念...............................16
3.3.2图像拼接的简单算法...........................17
3.3.3VC环境下图像拼接的源代码实现................18
3.4融合的分类.........................................24
3.5融合的算法.........................................25
3.6VC环境下融合的C++实现.............................25
3.6.1融合的程序方案设计...........................26
3.6.2VC环境下融合的程序的框架.....................28
3.6.3VC环境下融合的程序源代码....................32
第4章VC++动态链接库的应用................................38
4.1概论...............................................38
4.2创建的具体的步骤...................................38
第5章图像融合技术的发展现状和前景展望...................41
5.1图像融合技术的发展现状.............................41
5.2图像融合技术的历史前景展望.........................41
结论....................................................43
谢词......................................................45
参考文献..................................................46
附录A小波变换...........................................47
外文资料翻译..............................................49
前言
多源图像信息融合技术广泛应用于军事、计算机视觉、医疗诊断及遥感应用等领域。
论文从像元、特征和决策融合三个方面研究了多源图像融合技术,提出了一些新的分析处理方法。
像元级图像融合技术的主要研究目的是获得一幅视觉增强的图像。
本论文首先研究了一般意义下单纯面向视觉增强的多源图像融合方法,提出了一种基于统计融合模型的多分辨融合方法,给出了一般意义下的统计融合模型,通过引入传感器噪声项,有效地抑制了传感器噪声对图像融合的影响。
然后在多光谱图像融合中,提出了一种新的融合方法,将相关约束进一步引入到统计融合模型中。
这个方法充分增强了相关的空间信息,同时又有效抑制了光谱失真。
特征组合、分类等是现有文献中特征级图像融合的主要研究内容。
论文提出了特征级融合的新思想,即在图像特征提取过程中利用多源图像的信息融合。
基于这个思想,提出了一种融合多源图像边缘信息的直线提取算法,把边缘的相位信息作为融合要素,通过融合规则组合多源图像中的不同特性。
算法可以提取出仅利用单一或部分图像不能获得的直线特征。
论文进一步把道路的直线特征与光谱特征相结合,发展了一种从遥感多光谱图像提取道路的算法。
决策级图像融合技术具有广泛的应用范围。
Dempster-Shafer(D-S)证据理论是决策融合的主要方法之一,但典型的D-S理论不大适应高冲突证据组合。
论文提出了一种基于预处理模式的新方法,在利用Dempster组合规则进行证据组合之前,将冲突焦元的基本概率赋值部分转移到焦元并集,采用证据之间的冲突额度来确定证据组合顺序。
由于预方法将冲突化解为不确定的知识表示,D-S理论可以处理冲突证据的组合问题。
论文进一步将改进方法应用于高光谱图像分类,发展了一种基于D-S理论的高光谱图像分类方法,提供了比基于典型D-S理论方法更好的结果。
论文提出的所有算法均应用于真实多源图像数据,实验结果显示了算法的有效性。
第1章VisualC++与MFC简介
1.1VisualC++的特点
MicrosoftVisualC++,简称MSVC、VC++或VC,是微软公司的C++开发工具,具有集成开发环境,具有编辑C语言,C++以及C++/CLI等编程语言的能力。
VC++整合了便利的除错工具,特别是整合了WindowsAPI、DirectXAPI和Microsoft.NET框架(6.0没有)。
目前最新的版本是MicrosoftVisualC++2008,VisualC++6.0是其经典版本。
VisualC++以拥有“语法高亮”,IntelliSense(自动编译功能)以及高级除错功能而著称。
比如,它允许用户进行远程调试,单步执行等。
还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。
其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。
这些特征明显缩短程式编辑、编译及连结的时间花费,在大型软件计划上尤其显著。
VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,而”厂商标准”是在遵循”工业标准”的前提下扩展而来的。
VC++应用程序的开发主要有两种模式,一种是WINAPI方式,另一种则是MFC方式,传统的WINAPI开发方式比较繁琐,而MFC则是对WINAPI再次封装,所以MFC相对于WINAPI开发更具备效率优势,但为了对WINDOWS开发有一个较为全面细致的认识,笔者在这里还是以讲解WINAPI的相关内容为主线。
要想学习好VC必须具备良好的C/C++的基础,必要的英语阅读能力也是必不可少的,因为大量的技术文档多以英文形式发布。
vc6.0的优点是界面简洁,占用资源少,操作方便。
VisualC++的源程序要求用C++语言编写,它支持面向对象设计方法,并可以使用功能强大的微软基础类库MFC(MicrosoftFoundationClasses),充分体现了Microsoft司的技术精华。
由于Microsoft公司在操作系统市场上的垄断地位,用VisualC++开发出来的软件稳定性好,可移植性强,而且软件与硬件相互独立。
利用VisualC++可以编制各种类型的’Windows应用程序,从最简单的单文档和对话框程序到复杂的多文档和组合界面程序。
并且VisualC++作为VisualStudio可视化组件家族中最重要的一个成员,与其他可视化工具如VisualBasic、VisualJ++及VisualC#紧密地集成在一起,可进行不同类型的程序开发工作,适用于特殊、复杂和综合软件项目的开发以及系统软件的设计。
VisualC++6.0源代码编辑器提供了自动语句完成功能,编辑输入源程序时,能自动显示当前对象的成员变量和成员函数,并指明函数的参数类型。
VisualC++6.0的编译器增加了新的编译参数,改进了对ANSI:
C++标准的支持,并采用Microsofl的代码优化技术,使生成的目标代码更短小,应用程序运行的速度更快。
VisualC++6.0程序调试器功能更强大,提供了诊断映射机制、无须重编译的调试、远程调试和实时调试等功能。
1.2面向对象技术与MFC概述
1.2.1面向对象技术
面向对象技术是一种全新设计和构造软件的技术,它使计算机解决问题的方式更符合人类的思维方式,更能直接地描述客观世界,通过增加代码的可重用性、可扩充性和程序自动生成功能来提高编程效率,并且大大减少软件维护的开销,已经被越来越多的软件设计人员所接受。
希望通过本章的介绍,能从宏观上了解面向对象技术,有助于对具体实现的掌握。
本章首先介绍面向对象技术的基本概念、基本特征,介绍了面向对象与面向过程程序设计的区别,然后介绍目前流行的几种面向对象程序设计语言,特别强调C++对面向对象技术的支持及其发展现状,其中还涉及到.NET技术。
面向对象技术是一种新的软件技术,其概念来源于程序设计,从20世纪60年代提出面向对象的概念,到现在已发展成为一种比较成熟的编程思想,并且逐步成为目前软件开发领域的主流技术。
同时,它不仅局限于程序设计方面,已经成为软件开发领域的一种方法论。
它对信息科学、软件工程、人工智能和认知科学等都产生了重大影响,尤其在计算机科学与技术的各个方面影响深远。
通过面向对象技术,可以将客观世界直接映射到面向对象解空间,从而为软件设计和系统开发带来革命性影响。
面向对象技术是一种以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。
它以数据为中心而不是以功能为中心来描述系统,数据相对于功能而言具有更强的稳定性。
它将数据和对数据的操作封装在一起,作为一个整体来处理,采用数据抽象和信息隐蔽技术,将这个整体抽象成一种新的数据类型──类,并且考虑不同类之间的联系和类的重用性。
类的集成度越高,就越适合大型应用程序的开发。
另一方面,面向对象程序的控制流程由运行时各种事件的实际发生来触发,而不再由预定顺序来决定,更符合实际。
事件驱动程序执行围绕消息的产生与处理,靠消息循环机制来实现。
更重要的是,可以利用不断扩充的框架产品MFC(MicrosoftFoundationClasses),在实际编程时可以采用搭积木的方式来组织程序,站在“巨人”肩上实现自己的愿望。
面向对象的程序设计方法使得程序结构清晰、简单,提高了代码的重用性,有效地减少了程序的维护量,提高了软件的开发效率
1.2.2MFC编程框架
MFC(MicrosoftFoundationClassLibrary)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
MicrosoftVisualC++提供了相应的工具来完成这个工作:
AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
1.封装:
构成MFC框架的是MFC类库。
MFC类库是C++类库。
这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。
2.对Win32应用程序编程接口的封装:
用一个C++Object来包装一个WindowsObject。
例如:
classCWnd是一个C++windowobject,它把Windowswindow(HWND)和Windowswindow有关的API函数封装在C++windowobject的成员函数内,后者的成员变量m_hWn就是前者的窗口句柄。
3.对应用程序概念的封装:
使用SDK编写Windows应用程序时,总要定义窗口过程,登记WindowsClass,创建窗口,等等。
MFC把许多类似的处理封装起来,替程序员完成这些工作。
另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。
文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。
4.对COM/OLE特性的封装:
OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。
MFC的OLE类封装了OLEAPI大量的复杂工作,这些类提供了实现OLE的更高级接口。
5.对ODBC功能的封装:
以少量的能提供与ODBC之间更高级接口的C++类,封装了ODBCAPI的大量的复杂的工作,提供了一种数据库编程模式。
第2章图像处理基础
2.1位图和调色板的概念
位图图像(bitmap),亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。
这些点可以进行不同的排列和染色以构成图样。
当放大位图时,可以看见赖以构成整个图像的无数单个方块。
扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。
然而,如果从稍远的位置观看它,位图图像的颜色和形状又显得是连续的。
我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)三基色组合而成。
针对含有红、绿、蓝色成分的多少,可以对其分别分成0~255个等级,而红、绿、蓝的不同组合共有256×256×256种,因此约能表示1600万种颜色(16m色)。
对于人眼而言,这已经是"真彩色"了。
这就是24位图或其以上的位图比如32,,34之类的,,,这种位图的图像数据中的每个像素都用了三个字节来描述记录它.什么是图像数据?
接下来会谈到一个位图文件结构,它包括文件头(用来说明文件),文件信息头(位图属性),,图像数据(位图主体数据所在)对每个像素进行了(R,G,B)量化的图像就是位图,其在计算机中对应文件的扩展名一般为.bmp。
既然用R,G,B的量化值就可以直接记录一张位图的所有像素,那我们需要调色板干什么呢?
首先,我们可以计算完全利用(R,G,B)组合来存储一个800×600的位图所需要的空间为:
800×600×3=1440000(字节)=1.37M(字节),3是记录每个像素RGB值所用的字节数,这里说的是24位图,RGB值就用来描述一个像素,,位图是由像素组成的,,因此用一张位图大小乘它的像素数就可以直接描述一张位图,惊人的大!
因此,调色板横空出世了,它的功能在于缓解位图文件存储空间(显存或系统内存)过大的问题。
在winos中存在三种调色板,,硬件调色板,逻辑调色板,系统调色板,,winos用"调色板管理器"机制来管理调色板,,调色板存在于一个位图文件中,一个窗体的DC中,,或OS中,,硬件调色板就是显卡适配器所能实际表达的颜色深度,,逻辑调色板就是winos通过调色板管理机制为每个窗体应用程序DC分配的调色板(系统调色板只有一个,而逻辑调色板可以有多个,,它的本质就是一块内存中的区域用于描述当前应用使用到的调色板,我们都知道调色板是一个结构),,所以逻辑调色板的用途在于模拟硬件调色板,,以使windows作为一个os可以为界面显示,图像显示等应用提供它们各自专用的活动的调色板,,当逻辑调色板色深小于或大小硬件调色板时,,winos通过调色板管理机制自动让二者谐和,,系统调色板就是winos当前正在使用到的调色板,逻辑调色板可以通过调色板管理机制转变为当前系统调色板,,,但是不管winos的调色板管理机制如何,,最终的调色板都要靠硬件调色板来实现。
假设一个位图为16色,16色就是上面谈到的可以表示多少种颜色,计算一下,2的4次方=16,因此它是4位图,我们只需要在图像数据中用4个bit就可以存储这个位图的每个像素在16种颜色中所处的等级,接下来会谈到调色板索引所占的空间字节数,,因为它只是一个索引,所占的空间会比图像数据RGB结构小很多,再设其像素总数为800×600(位图大小)。
然后调色板提供了这16种等级对应的(R,G,B)值,这样,存这个16色位图只需要:
800×600×4/8(0.5个字节)=240000(字节)=0.22M(字节)注意:
16色图查询它在调色板中的RGB组合所用的索引需要占用4个BIT,,这是为什么?
下面解释一下:
4位2进制数可以表示16种情况,8位BIT可以表示现实中我们使用的十进制的0~255种情况,额外的存储R,G,B表的开销(即调色板Palette,也称为颜色查找表LUT)仅仅为16×3=48字节。
存储空间被大为减少!
常见的位图有单色(实际是1位图,,2的一次方为2,,因此它是2