没有合适的资源?快使用搜索试试~ 我知道了~
基于MFC的图片浏览器的设计与实现
5星 · 超过95%的资源 需积分: 10 120 下载量 186 浏览量
2009-10-21
17:06:47
上传
评论
收藏 538KB DOC 举报
温馨提示
试读
64页
图像处理源自于二战中的摄影侦察。当时,处理操作是通过光学方法来完成的,判读工作则是由专门精于此道并能确定炸弹袭击结果的人员来做。随着20世纪60年代后期卫星图像的出现,更多基于计算机的工作便开展起来。彩色合成的卫星图像,有时的确漂亮的让人吃惊,它们已经成为人类视觉文化和对我们这个行星进行认知的一个组成部分。 1980年1月《科学美国人》发表了一幅被称之为“Plume 2”的著名图像,它是1979年3月5日通过宇宙飞船旅行者1号在木星的卫星上探测到的8次火山爆发中的第二次。这幅图像在星际探险图像中是一个里程碑,人们第一次在宇宙中看到了正在爆发的火山。它也是图像处理领域的一次伟大胜利。卫星图像以及宇宙探测器所获取的图像直到近年来才大量应用图像处理技术。在这些技术中,对计算机图像进行数字化处理以得到想要获得的效果,比如使图像的某一部分或某一特性更加明显。
资源推荐
资源详情
资源评论
第 1 章 绪 论
图像处理源自于二战中的摄影侦察。当时,处理操作是通过光学方法来完
成的,判读工作则是由专门精于此道并能确定炸弹袭击结果的人员来做。随着
20 世纪 60 年代后期卫星图像的出现,更多基于计算机的工作便开展起来。彩色
合成的卫星图像,有时的确漂亮的让人吃惊,它们已经成为人类视觉文化和对
我们这个行星进行认知的一个组成部分。
1980 年 1 月《科学美国人》发表了一幅被称之为“Plume 2”的著名图像,它
是 1979 年 3 月 5 日通过宇宙飞船旅行者 1 号在木星的卫星上探测到的 8 次火山
爆发中的第二次。这幅图像在星际探险图像中是一个里程碑,人们第一次在宇
宙中看到了正在爆发的火山。它也是图像处理领域的一次伟大胜利。卫星图像
以及宇宙探测器所获取的图像直到近年来才大量应用图像处理技术。在这些技
术中,对计算机图像进行数字化处理以得到想要获得的效果,比如使图像的某
一部分或某一特性更加明显。
正如计算机图形学一样,直到近几年,图像处理仍然局限在一些实验室里
使用,只有这些地方才能提供昂贵的图像处理计算机来满足处理大量高分辨率
图像的需要。随着价格低廉的高性能计算机和诸如数码相机及扫描仪这样的图
像采集设备的出现,我们已经看到图像处理技术在向公众领域转移。经典的图
像处理技术很平常地被图像设计人员用来处理图片和生成图像,比如修复图片
的缺陷、改变色彩、对比度等,或者通过图像边缘增强这样的处理来改变整个
图片的外观。
目前图像处理的主流应用是图像的压缩,即通过互联网进行传递或在可视
电话和视频会议中进行动态视频图像的压缩。可视电话是当今结合计算机图像
和传统图像处理的技术,以期产生很高压缩比的交叉领域之一。所有这一切都
是图像的“数字表达”这一不可抗拒的发展趋势的组成部分。事实上,20 世纪最
强大、应用最广泛的图像形式——电视图像,也将不可避免的融入数字领域。
数字图像及其处理技术之所以发展的如此迅速并获得广泛的应用,与其自
身的优点是息息相关的。
1. 再现性好
数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存储、传
输或复制等一系列变换操作而导致图像质量的退化。只要图像在数字化时准确
地表现了原稿,则数字图像处理过程始终能保持图像的再现。
2. 处理精度高
按目前的技术,几乎可将一幅模拟图像数字化为任意大小的二维数组,这
主要取决于图像数字化设备的能力。现代扫描仪可以把每个像素的灰度等级量
化为 16 位甚至更高,这意味着图像的数字化精度可以达到满足任一应用需求。
对计算机而言,不论数组大小,也不论每个像素的位数多少,其处理程序几乎
是一样的。换言之,从原理上讲不论图像的精度有多高,处理总是能实现的,
只要在处理时改变程序中的数组参数就可以了。回想一下图像的模拟处理,为
了要把处理精度提高一个数量级,就要大幅度地改进处理装置,这在经济上是
极不合算的。
3. 适用面宽
图像可以来自于多种信息源,它们可以是可见光图像,也可以是不可见的
波谱图像(例如 X 射线图像、射线图像、超声波图像或红外图像等)。从图像
反映的客观实体尺度看,可以小到电子显微镜图像,大到航空照片、遥感图像
甚至天文望远镜图像。这些来自不同信息源的图像只要被变换为数字编码形式
后,均是用二维数组表示的灰度图像(彩色图像也是由灰度图像组合成的,例
如 RGB 图像由红、绿、蓝三个灰度图像组合而成),因而均可用计算机来处理。
即只要针对不同的图像信息源,采取相应的图像信息采集措施,图像的数字处
理方法可适用于任何一种图像。
4. 灵活性高
图像处理大体上可分为图像的像质改善、图像分析和图像重建三大部分,
每一部分均包含丰富的内容。由于图像的光学处理从原理上讲只能进行线性运
算,这极大地限制了光学图像处理能实现的目标。而数字图像处理不仅能完成
线性运算,而且能实现非线性处理,即凡是可以用数学公式或逻辑关系来表达
的一切运算均可用数字图像处理实现。
鉴于数字图像自身的特点,对其进行处理也不是一步就能完成的过程。可
将它分成诸多步骤,必须一个接一个地执行这些步骤,直到提取出有用的数据。
而这些步骤中,数据的存储、表示又占有相当重要的地位,可以说,这是图像
处理中最基本的技术。因此,掌握不同格式图像的编码解码、读写、显示等方
法是必不可少的。
为什么会需要如此众多不同类型的图像文件格式呢?简单的回答就是因为
有太多不同类型的图像以及众多不同需求的应用。完整一些的回答还要考虑到
市场份额、所有权以及在图像工业中缺乏的必要协调。但是,已经有一些标准
的文件格式被开发出来。许多其他图像类型可以通过图像转换软件很容易地转
换 成 这 些 文 件 格 式 , 如 本 设 计 最 终 开 发 出 的 软 件 就 可 以 将 图 像 在
BMP、PCX、TGA、GIF 及 JPEG 之间互相转换。
与计算机图像相关的一个领域就是计算机图形学。计算机图形学是计算机
科学的一个特殊领域,它指的是通过计算机对可视数据进行再现,这包括为显
示或打印生成计算机图像,以及为输出到监视器、打印机、照相机或其他能提
供图像的设备上生成和处理的任何图像(真实的或人造的)。可以认为计算机
图形学是计算机图像技术的一部分,图形设计师所使用的许多工具也正在被计
算机图像专业人士所采用。
在计算机图形学中,图像数据的类型被分为两个主要种类:矢量和位图。
矢量图像是指仅通过存储关键点来表达线条、曲线和形体的方法。这些关键点
足以对形体进行定义,而将它变成图像的过程称之为渲染。当图像被渲染之后,
它可以被认为是位图格式,其中每一个像素都具有与之相关的特定值。位图图
像(也称之为光栅图像)可由图像模型 I(r, c)来表示,其中包含像素数据以及某
些文件格式存储的相应的亮度值。尽管有些文件被压缩,但仍属于位图图像的
范畴,通常这些类型的图像包含头信息和原始图像数据。文件头必须包含的信
息为:(1)行数(高);(2)列数(宽);(3)每像素位数;(4)文件类
型。此外,对于某些复杂的文件格式,文件头还必须包含有关所使用的压缩类
型的信息,以及创建图像所需要的其他必要的参数。
本设计所讨论和处理的图像均为位图图像。
第 2 章 软件开发平台及编程模式
在系统的设计与开发中,软件开发平台及编程模式是关键,下面介绍一下
开发平台的选择、Microsoft Visual C++及编程模式。
2.1 开发平台的选择
在 Windows 环境下,目前比较流行的可视化开发工具主要有: Visual C+
+、Visual Basic、C++ Builder、Delphi、Power Builder 及 JBuilder 等。而本软件
采 用 Microsoft Visual C++ 6.0 作 为 开 发 工 具 , 并 使 用 MFC Application
Framework 作为本软件的基本架构。采用 C++来进行图像编程的主要原因是,
与 Java 和 C#等现代编程语言相比,C++在程序运行的效率、内存使用的可控性
和编程的灵活性上具有优势。
图像处理需要处理大量的图像数据,经常使用复杂、费时的算法,因此图
像处理程序的效率非常重要。C++代码被编译成汇编语言,可以直接在处理器
上运行,效率很高。而 Java 被编译成字节码,C#被编译成中间语言,都是不能
在处理器上执行的,必须经过 Java 虚拟机或.NET 通用语言运行时的 JIT 编译之
后才能执行,因此效率较低。故从运行效率的角度看,采用 C++进行图像编程
比较合适。
对庞大的图像数据进行处理时需要使用大量的内存,而计算机的物理内存
容量往往是有限的,因此需要有效地控制内存的使用。C++直接控制内存的分
配和释放,这虽繁琐,且加大了编程的负担,但却能有效地控制内存的使用 。
Java 和 C#引进了垃圾收集机制,将开发人员从内存管理的繁杂任务中解放出来 ,
不再需要直接控制内存的分配和释放。但是,无效内存的收集和释放只能周期
性地进行,难以达到有效地使用内存。同样的运算,使用 Java 和 C#所需的内存
比使用 C++所需的内存要多,即内存的使用率较低。所以,从内存的使用效率
来看,采用 C++进行图像处理编程更合适。
C++中大量使用指针,使得编程的灵活性很高,这虽然增加了程序出错的可
能性,但是便于程序员施展编程技巧来提高程序的效率。Java 完全取消了指针,
C#极大地限制了指针的使用,这都限制了程序员施展技巧。因此,使用 C++进
行图像处理编程具有更大的灵活性。而在以 C++为核心语言的可视化编程工具
中,Microsoft Visual C++ 6.0 以其自身许多优异的特性而获得了最为广泛的应用。
鉴于以上原因,本设计使用 Microsoft Visual C++ 6.0 作为软件的开发平台。
2.2 Microsoft Visual C++及编程模式简介
1. Visual C++可视化编程
Visual C++的资源编辑器能以所见即所得(What you see is what you get)的
形式直接编辑程序的用户界面,为所有资源分配 ID 标识号。ClassWizard 能把
对话框模板与生成的类定义或与已有的类代码连接起来,为菜单项、控制等资
源生成空的处理函数模板,创建消息映射条目,并将资源 ID 与处理函数连接起
来。通过使用 AppWizard,程序员的编程工作便简化为用资源编辑器直观的设
计界面,完善对话框类代码,在空的处理函数模板处填写响应用户操作的代码,
这是一种比较完善的可视化编程方法。
但 产 品 名“ Visual C++”也 容 易 误 导 人 , 让 人 认 为 自 己 使 用 的 是 一 个 与
Microsoft Visual Basic 类似的完全可视化的系统。然而,使用 Visual C++,开发
人员必须真正地阅读和编写 C++代码。Visual C++向导可以节省时间和提高精度,
但是,程序员也必须理解向导产生的代码,并且,最重要的是,还必须理解
MFC 库的结构和 Windows 操作系统的内部工作方式。
2. MFC(Microsoft Foundation Classes)应用程序框架
应用程序框架的一种定义是:提供一般应用程序需要的全部面向对象软
件组件的集成集合。
C++流行的一个原因是它可以用类库扩充。类库是可在应用程序中使用的
有关 C++类的集合。应用程序框架是类库的超集。一般的类库只是一种孤立的
类的集合,用来嵌入在任何程序中,但是,应用程序框架却定义了程序的结构。
自从 MFC 库发布以来,MFC 已经成为主要的 Windows 类库。使用 MFC 类库构
建应用程序具有以下优点:
MFC 库是 C++的 Microsoft Windows API。
应用程序框架生成的应用程序使用了标准的结构,具有标准化的用户接
口,这对具有标准用户界面的 Win32 程序来说,可以极大的减轻程序员
的负担,使程序员不必过多地考虑界面,可把主要精力放在程序设计上 ,
以提高程序设计的效率。
使用应用程序框架的应用程序不仅小,而且运行速度快,具有很大的灵
活性。MFC 封装了 Win32 SDK 中的几乎所有函数,能实现 Win32 系统
的任何功能。
Visual C++工具降低了编码的复杂性。
MFC 库应用程序框架有丰富的特性,如:Windows API 的 C++接口、通
用的(非 Windows 所特有的)类、“共用根对象”类层次结构、流线式多
文档界面(MDI)应用程序支持等。
强大的功能。除封装了大部分的 Win32 SDK 函数外,MFC 还提供了应
用 程 序 本 身 的 数 据 和 操 作 及
ActiveX 、 OLE 、 Internet 、 WinSock 、 DAO ( Data Access
Objects)、 ODBC(Open DataBase Connectivity)等操作类。
MFC 框架的核心是文档/视图结构(Document-View Architecture),这是一
个很好用、但又往往较难以入门的功能。简单的说,文档/视图结构就是将数据
和对数据的观察或数据的表现(显示)相分离。文档仅处理数据的实际读、写
操作,视图则是显示和处理数据的窗口,视图可以操作文档中的数据。
3. Win32 编程
编写 Visual C++程序实际上就是一个构造类和把类实例化的过程。由于
Windows 95/98/Me/NT/2000 是 PC 平台中应用最广泛的操作系统,而 Microsoft 力
图用一个叫做 Win32 的标准 32 位应用程序接口作为对这几个操作系统的共同开
发接口,所以经常采用 Win32 来代表 Microsoft 的 32 位 Windows 操作系统,因此
Visual C++主要用于针对 Win32 的应用程序开发。
Win32 具有抢先式多任务、多线程和线性寻址内存管理等特征,Win32 编
程的基本要求包括:
应用程序的执行独立于硬件设备。
应用程序具有图形用户界面。
能在 Windows 95/98/Me 和 Windows NT/2000/XP 之间透明移植,并可移
植到支持 Windows NT/2000 的 RISC 硬件平台。
高性能的抢先式多任务和多线程管理。
高级的多媒体支持。
通过 OLE 2 技术实现多个应用程序的对象定位。
Microsoft 为进行 Win32 编程提供了一套名为 Win32 SDK 的应用程序编程接
口 , 其 中 包 括 上 千 个 Win32 系 统 函 数 。 Visual C++ 包 括 一 套 叫 做
MFC(Microsoft Foundation Class Library)的 C++类库,其中定义了进行 Win32
编程所需要的各种类。有的类封装了大部分的 Win32 SDK 中应用程序的编程接
口函数;有的类封装的则是应用程序本身的数据和操作;还有的类封装了
ActiveX、OLE 和 Internet 编程特性以及 WinSock 网络特性和 DAO(Data Access
Objects)、ODBC(Open Database Connectivity)数据访问功能。Win23 SDK 和
MFC 是实现 Win32 编程的主要工具。
Visual C++的 AppWizard 工具能自动生成应用程序框架,该框架定义了应用
程序的轮廓,并提供了用户接口的标准实现方法。运用 Visual C++的资源编辑
器(Resource Editor)能直观地设计程序的用户界面,而 ClassWizard 能把用户
界面和程序代码连接起来。程序员要做的就是用 MFC 类实现框架中未完成的应
用程序的特定功能部分。所以使用 Visual C++可以实现 Win32 的可视化程序设
计。
4. 消息映射
在使用 Visual C++进行 Win32 程序设计时,消息映射是一个非常重要的概
念。Windows 应用程序是消息驱动的,应用程序不能直接得到用户所做的操作,
如鼠标按键、键盘输入和窗口移动等。这些操作由操作系统管理,操作系统检
测到操作事件后,便向相关的应用程序发送消息,应用程序响应这些消息来完
成用户的操作。
(1)消息
Windows 中的消息是操作系统与应用程序之间、应用程序与应用程序之间、
应用程序各对象之间相互控制与传递信息的方式。
消息的基本格式如下:
Message wParam lParam
剩余63页未读,继续阅读
labbao
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页