标题：数字图像处理原理与实践：基于Visual C++开发
图书信息
数字图像处理原理与实践：基于Visual C++开发  左飞  万晋森  刘航  著
ISBN 978-7-121- 12776-2 
2011年4月出版
定价：89.00元（含光盘1张）
16开
652 页
宣传语
《Visual C++数字图像处理开发入门与编程实践》原书最新升级版
步步为营  循序渐进  全新升级  
深入与浅出并重，理论同实践共举
内 容 简 介
本书全面系统地讲述了在Visual C++环境下进行数字图像处理编程的技术和方法。全书共分成14章，针对数字图像处理领域中的核心话题，如色彩空间、图像文件格式、图像的点运算、图像的几何变换、图像的增强处理、边缘检测和轮廓跟踪、图像形态学、图像分割、图像加密等，进行了详细的介绍。另外，针对Visual C++ 2005下的数字图像处理开发，本书还对设备无关位图、图形设备接口、OpenCV及ImageMagick等在实际开发中常用的具体技术进行了讲解，并辅以大量实例代码，具有很强的参考价值。
本书兼有源于实践、贴近应用、深入浅出、通俗易懂的优点，又紧跟时代脉搏，牢牢把握最新技术方向，从案例出发强调新环境下的新方法。本书内容实用、体例新颖，既可以作为希望进行数字图像处理学习和研究的初学者的自学教材，也可作为大专院校计算机及相关专业师生或工程技术人员的参考书。
谈治学——代序
自世界上第一台电子计算机问世以来，现代计算机科学已经走过了极为不平凡的六十余年辉煌历程。有时想想，自己不禁感叹，相对于已经发展了几十年甚至上百年的任意一门学科，我们的学习过程实在太短暂了。要充分理解一个领域，时间显然是不够的，更何况现在学科门类越分越细，学科交叉现象越来越多，因此我们往往要同时面对多个领域。如果你是一名研究生或者博士生，有时也许可能会感到自己已经对某个领域“观其大略、略有小成”。其实自己是否真的已经达到这种状态并不重要，因为几年之后，当我们再回想起来，或许自然就会感到当时的稚气而不失活泼的劲头。如果现在，你的这种感觉愈发强烈，那么说明你在自己研究的这个方向上已经有了不小的长进。
有人说自己“学得越多就会感到懂得越少，知道得越多就会感到理解得越少”，其实说的就是自己在不停地进步。在现行学习的各种情境下，大家都变得匆忙起来，匆忙的人容易被欺骗，于是我们会听信一些自己或别人有限理解下的狭隘看法，甚至我们会将这些看法作为一种基点，甚至会看成是一种准则。就像现在每天网络上都会有海量信息向我们涌来，尽管没有人会对网上的言论负责，但我们确实很容易在不经意之间将浏览网页时看到的一条难辨真伪的消息迅速地、不假思索地照单全收、信以为真。于是现在漫天飞舞的那些关于某位明星突然病故的谣言才会如此神速地传播开来。八卦谣言如此，学术研究更是如此。这其实也没什么，重要的是我们不能让这种看法伤害到自己及自己努力的脚步。
大家都会写论文、看论文。看论文讲求看高质量的，这是当然。我们也无非是想在前人的基础上做出一点点创新工作。前人的理论结果在这短暂的过程与浩瀚的领域下似乎只是偏离及错误的程度不同，因为论文是在搞研究，是一些还未出现的假想的规则，或是一些假想的解决方案。它们基于的都是另一些研究的成果，“踩在别人的肩膀上，肩膀在哪并不重要，是不是巨人的也不重要，只要以后有人踩踩自己的肩膀就行了”，在这种情况下对与错、是与非、准确与偏离的界限也越来越朦胧。
有时会觉得别人的做法、方式、结果其实并不好。有时甚至会认为其实对与错并不那么重要，它只是在很多条件、环境、约束下的一种看法。人们所做的事情—只是让周围最值得注意的一类人群尽可能满意就已经很好了。现在的媒体、老师，甚至一些同学我觉得都已经具备了一种令人惊叹而又平凡的能力，那就是“可以把白的说成黑的，紧接着在情况不对时，又可以再把黑的说成白的”这种能力。有人对肖氏反射弧提出质疑，发明人就会不惜触犯法律的威严拿起铁棒还对方以颜色。一方面是把白的说成了黑的，而另一方面大部分人选择了默认，欣然接受了指鹿为马的事实。而对于我们每个人，说到底最重要的还是要抓紧时间“多走一点路”，用不断前进的脚步走出各种环境，使自己不用沦落到非得用“把白说成黑”这种三流手段去骗取点什么的地步，更重要的是使别人在把白说成黑的时候，我们依然能够保持一份清醒。
感慨了这么多，写在我新书的最前面，真诚地希望本书的读者能够把如何治学这个问题想个清楚明白。若能如此，我想正在看本书的你定能在自己所从事的领域中有所收获、有所成绩。
前    言
大约两年多前，我同万晋森、刘航合作编写了《Visual C++数字图像处理开发入门与编程实践》（电子工业出版社出版）一书。作为一本在Visual C++环境下讲解数字图像处理开发的方法与技术的书籍，该书赢得了颇佳的口碑。许多读者纷纷来信，无论是对书品的褒奖，还是与我们探讨技术问题，都令我们为之鼓舞。
有鉴于《Visual C++数字图像处理开发入门与编程实践》所取得的不错成绩，电子工业出版社的有关编辑建议我们紧跟时代步伐与技术发展趋势，适时对原书进行修订以期再版。经过一番思度与商讨，我们决定结合第一版书的读者反馈并联系技术发展的最新动向，以原书为基础重新著书立说，于是便有了这本《数字图像处理原理与实践：基于Visual C++开发》。
脱胎于原书的改版本，一方面保持了前作通俗易懂、理论联系实际的风格，另一方面，我们也进行了大胆的调整，删减了一些比较基础性的导引篇幅和相对比较陈旧的内容，同时增补了一些更新颖的话题及更丰富的实例。
近年来，随着研究的不断深入，数字图像处理应用也日益广泛，这使得数字图像处理的广度和难度不断加强，但同时对于初学者的学习带来了相当的困难。观察现有的众多数字图像处理书籍，大部分教材注重图像处理理论的阐述，而在一定程度上忽略了这些理论的应用和实现。另外，对于一些实例教程，虽然重视了代码的实现，却在算法的描述和扩展上略有欠缺。这使得读者很难通过一本书比较全面地了解和掌握数字图像处理的基础内容。
为此，尽可能通俗地为读者描述图像处理算法的原理和实现手段，并为读者提供翔实可靠的实现代码，确保每一个读者都能理解和掌握，始终都是我们在创作过程中最大的考量。本书系统地介绍了应用Visual C++进行数字图像处理编程的基本思路和方法，采用案例为主的叙述方式，将大量的技术理论融入具体的案例剖析中。涉及数字图像处理领域中十余个重要主题，提供了近百个具体算法的实现源码，代码总量有数万行之多。
总的来说，本书依然本色地保持了前作中体现出来的几个有别于其他同类书籍的优点。
首先，与集成开发环境深度结合。在深入剖析MFC机制的同时将丰富的图像处理与编程实现融为一体。
其次，叙述过程中始终不脱离实践这个主题，每章都设置相应的实例带动读者进行学习。穿插于书中的实例为本书的一大特色。这些实例大都为时下流行的图像处理软件的某个具体模块或部分的实现，实例原型十分常见。这些巧妙新颖的实例将使枯燥乏味的理论变得妙趣横生。全书实例都在Visual Studio 2005下调试通过，读者可以在随书光盘中获得有关源码。
最后，笔者自主编写了一个扩展性良好的数字图像处理算法试验平台Magic House。Magic House不仅完整实现了一款普通数字图像处理软件应具备的基本功能，而且它框架清晰、容易理解，非常适合读者学习。我们也看到，前作出版后其他作者跟风出版的一些数字图像处理作品中有严重抄袭和剽窃Magic House的现象发生，但作为Magic House的原创者，没有哪本书能够比我们更透彻地向读者介绍这个软件的架构与实现。
除了传承前作的优点之外，本版又有哪些变化呢？
首先，本版增加了对部分复杂算法的更为细致的讲解与描述，同时也丰富了前作的实例代码资源。
其次，本书增加了一些包括图像加密（特别是图像的混沌加密）等在内的前沿话题，为有志在此发展的读者提供了独一无二的资源。
最后，除了前作中介绍到的DIB、GDI+和OpenCV，本版中还增加了对ImageMagick的介绍。作为近年来发展和流行起来的数字图像处理库，ImageMagick已经受到广大开发者的青睐，但目前国内尚无对它的相关资料出版，这也是本版中的一个亮点。
我们都知道，数字图像处理是一门飞速发展的技术。国内大部分数字图像处理教材都长期不更新，而且同类书籍千篇一律，很多读者迫于无奈，只能在许许多多陈旧不堪的内容上翻来覆去。因此，我们也希望能够为这个领域的后来者抛砖引玉，为同类书籍注入一丝清新的空气。
本书前一版本承蒙多位专家指导与帮助，其中西北工业大学计算机学院博士生导师王庆教授审阅了本书前版并提出了宝贵的意见和建议，西北工业大学计算机学院冯萍教授对本书前版的写作给予了诚恳的支持，中国科学院高级工程师、技术作家白乔博士在我的创作过程中始终鼎力相助。这里，再次向他们表示最诚挚的感谢。另外，我的两位合作者—网易游戏的万晋森与腾讯科技的刘航—在技术方面一直都非常令我钦佩，他们在百忙之中与我一道编写此书，令我深感振奋。正是由于有了他们的加盟，本书才得以付梓，也感谢他们为本书作付出的一切！最后，我也要感谢本书第一版的读者朋友们，他们诚恳的意见与建议使得新版更加精进、更加完美，给予我们的鼓励也一直驱使着我们前行。
由于时间仓促，纰漏和欠缺之处在所难免，言语之中有失偏颇之处，还望读者不吝赐教和批评。
左 飞    
2010年12月
于珠水之滨 
目    录
第1章  Visual C++与数字图像处理
1.1  数字图像处理概述
1.1.1  图像与数字图像
1.1.2  数字图像处理研究的内容
1.1.3  数字图像处理的应用
1.2  Visual C++概述
1.2.1  编程语言的奇迹
1.2.2  Visual C++简介
1.2.3  卓越的集成开发环境
1.3  在Visual C++中处理数字图像
1.3.1  位图和调色板
1.3.2  图形设备接口
1.3.3  OpenCV
1.3.4  ImageMagick
1.4  本章实例：利用Visual C++实现画图程序
1.4.1  实例预览
1.4.2  开始创建项目
1.4.3  完成实例编码
第2章  色彩系统
2.1  学习图像处理从认识色彩开始
2.1.1  什么是颜色
2.1.2  颜色的属性
2.1.3  光源能量分布图
2.2  CIE色度图
2.2.1  CIE色彩模型的建立
2.2.2  CIE色度图的理解
2.2.3  CIE色度图的后续发展
2.3  常用色彩空间
2.3.1  RGB颜色空间
2.3.2  CMY/CMYK颜色空间
2.3.3  HSV/HSB颜色空间
2.3.4  HSI/HSL颜色空间
2.3.5  Lab颜色空间
2.3.6  YUV/YCbCr颜色空间
2.4  色彩空间的转换方法
2.4.1  RGB转换到HSV的方法
2.4.2  RGB转换到HSI的方法
2.4.3  RGB转换到YUV的方法
2.4.4  RGB转换到YCbCr的方法
2.5  本章实例：Photoshop色彩编辑器的实现
2.5.1  需要解决的若干问题
2.5.2  开始创建项目
2.5.3  完成实例编码
第3章  图像文件的格式与编码
3.1  图像文件概述
3.1.1  图像文件
3.1.2  图像文件的一般结构
3.1.3  图像文件的常用参数
3.2  BMP文件格式
3.2.1  文件结构
3.2.2  文件头和信息头
3.2.3  主要参数
3.3  GIF文件格式
3.3.1  GIF格式简介
3.3.2  GIF文件结构
3.3.3  GIF文件块的结构
3.4  PNG文件格式
3.4.1  PNG格式简介
3.4.2  PNG文件结构
3.4.3  PNG中的关键数据块
3.5  离散余弦变换
3.5.1  基本概念及数学描述
3.5.2  离散余弦变换的意义
3.5.3  离散余弦变换的实现
3.6  图像的压缩编码
3.6.1  霍夫曼（Huffman）编码
3.6.2  LZW编码
3.6.3  行程编码
3.7  JPEG文件及其解码程序的实现
3.7.1  JPEG文件概述
3.7.2  JPEG的编解码原理
3.7.3  JPEG文件的格式
3.7.4  JPEG解码程序的实现
第4章  使用DIB处理数字图像
4.1  设备相关位图和设备无关位图
4.1.1  设备相关位图（DDB）
4.1.2  设备无关位图（DIB）
4.2  CBitmap类
4.2.1  创建DDB
4.2.2  CBitmap中的成员函数
4.2.3  应用DDB显示图像
4.2.4  应用DDB显示大图像
4.3  进一步了解DIB
4.3.1  DIB的结构
4.3.2  DIB信息段
4.3.3  位图数据
4.3.4  与DIB有关的函数
4.4  本章实例：DIB类的封装
4.4.1  类的抽象与设计
4.4.2  编写构造函数
4.4.3  DIB位图的显示
4.4.4  BMP文件的存储
第5章  使用GDI+处理数字图像
5.1  GDI+简介
5.1.1  GDI+概述
5.1.2  GDI+的结构
5.1.3  GDI+在Visual C++ 2005中的配置
5.2  GDI+基础
5.2.1  Graphics类
5.2.2  GDI+的基本数据类型
5.2.3  GDI+中的颜色
5.3  GDI+处理图像的基本方法
5.3.1  GDI+的图像类
5.3.2  创建图像对象
5.3.3  图像的显示和缩放
5.3.4  图像的基本处理方法
5.4  图像的剪裁
5.4.1  剪裁区域
5.4.2  GraphicsPath类
5.4.3  Region类
5.5  处理图像的色彩
5.5.1  ColorMatrix结构体
5.5.2  改变图像的透明度
5.5.3  将图像转换为灰度图
5.5.4  改变图像的亮度
5.5.5  改变图像的对比度
5.6  本章实例：播放GIF动画
5.6.1  播放原理分析
5.6.2  处理过程
5.6.3  具体实现
第6章  常见图像显示特效
6.1  显示特效概述
6.1.1  显示特效基础
6.1.2  显示特效过程
6.1.3  显示特效类
6.2  扫描显示特效
6.2.1  特效预览
6.2.2  基本原理和实现方法
6.2.3  编程实现
6.3  移动显示特效
6.3.1  特效预览
6.3.2  基本原理和实现方法
6.3.3  编程实现
6.4  百叶窗显示特效
6.4.1  特效预览
6.4.2  基本原理和实现方法
6.4.3  编程实现
6.5  栅条显示特效
6.5.1  特效预览
6.5.2  基本原理和实现方法
6.5.3  编程实现
6.6  马赛克显示特效
6.6.1  特效预览
6.6.2  基本原理和实现方法
6.6.3  编程实现
6.7  雨滴显示特效
6.7.1  特效预览
6.7.2  基本原理和实现方法
6.7.3  编程实现
6.8  本章实例：类似ACDSee的图像浏览工具
6.8.1  实例预览
6.8.2  概要设计
6.8.3  完成实例编码
第7章  图像的点运算
7.1  灰度直方图
7.1.1  灰度直方图
7.1.2  基本原理
7.1.3  编程实现
7.2  灰度线性变换
7.2.1  基本原理
7.2.2  编程实现
7.3  灰度非线性变换
7.3.1  灰度对数变换
7.3.2  灰度幂次变换
7.3.3  灰度指数变换
7.4  灰度阈值变换
7.4.1  基本原理
7.4.2  编程实现
7.5  灰度拉伸
7.5.1  基本原理
7.5.2  编程实现
7.6  灰度均衡
7.6.1  基本原理
7.6.2  编程实现
第8章  对图像进行几何变换
8.1  图像几何变换的基本理论
8.1.1  图像几何变换概述
8.1.2  图像几何变换的数学描述
8.2  图像的平移变换
8.2.1  效果预览
8.2.2  基本原理
8.2.3  编程实现
8.3  图像的镜像变换
8.3.1  效果预览
8.3.2  基本原理
8.3.3  编程实现
8.4  图像的转置
8.4.1  效果预览
8.4.2  基本原理
8.4.3  编程实现
8.5  图像的缩放
8.5.1  效果预览
8.5.2  基本原理
8.5.3  插值算法介绍
8.5.4  编程实现
8.6  图像的旋转
8.6.1  效果预览
8.6.2  基本原理
8.6.3  编程实现
8.7  使用GDI+实现图像的几何变换
8.7.1  GDI+的变换操作
8.7.2  平移
8.7.3  缩放
8.7.4  旋转
8.7.5  变换的组合
8.7.6  利用矩阵进行其他几何变化
第9章  图像的增强处理
9.1  图像的简单平滑
9.1.1  邻域处理的基本概念
9.1.2  图像的简单平滑原理
9.1.3  图像简单平滑的算法实现
9.2  图像的高斯平滑
9.2.1  平滑线性滤波器
9.2.2  高斯平滑的原理
9.2.3  高斯分布
9.2.4  高斯平滑的算法实现
9.3  图像的中值滤波
9.3.1  统计排序滤波器
9.3.2  图像中值滤波的原理
9.3.3  图像中值滤波的算法实现
9.4  图像的拉普拉斯锐化
9.4.1  图像的锐化
9.4.2  拉普拉斯锐化的原理
9.4.3  拉普拉斯锐化的算法实现
9.5  Sobel边缘细化
9.5.1  Sobel边缘细化的原理
9.5.2  Sobel边缘细化的编程实现
第10章  图像的边缘和轮廓
10.1  边缘检测
10.1.1  边缘检测的基本概念
10.1.2  常规边缘检测
10.1.3  带方向的边缘检测
10.1.4  拉普拉斯算子
10.2  Hough变换
10.2.1  平面坐标系的转换
10.2.2  Hough变换的思想
10.2.3  直线的Hough变换
10.2.4  圆的Hough变换
10.2.5  彩色图像的Hough变换
10.3  种子算法
10.3.1  算法介绍
10.3.2  编程实现
10.4  轮廓跟踪
10.4.1  区域表示方法
10.4.2  计算区域的面积和周长
10.4.3  单区域跟踪
10.4.4  多区域跟踪
第11章  图像的形态学处理
11.1  数学形态学
11.2  一些必要的概念和符号约定
11.3  图像的腐蚀
11.3.1  腐蚀原理
11.3.2  编程实现
11.4  图像的膨胀
11.4.1  膨胀原理
11.4.2  编程实现
11.5  腐蚀和膨胀的性质及应用
11.5.1  腐蚀和膨胀的代数性质
11.5.2  腐蚀和膨胀的应用
11.6  开运算和闭运算
11.6.1  开运算
11.6.2  闭运算
11.6.3  编程实现
11.6.4  开运算和闭运算的代数性质
11.7  图像形态学的其他运算
11.7.1  击中/不击中运算
11.7.2  细化处理
11.8  基于形态学分水岭的图像分割
11.8.1  基本概念
11.8.2  分水岭算法
11.8.3  编程实现分水岭分割
第12章  数字图像的加密与隐藏
12.1  混沌理论概述
12.1.1  混沌理论的发展
12.1.2  混沌的基本概念
12.1.3  混沌的度量与判定
12.2  几种典型的混沌系统举例
12.2.1  Logistic映射
12.2.2  Henon映射
12.2.3  Chebychev映射
12.3  数字图像的混沌加密简介
12.3.1  密码学与混沌密码学
12.3.2  图像混沌加密算法的分类
12.4  基于置乱的图像加密技术
12.4.1  数字图像与排列变换
12.4.2  利用Hilbert曲线置乱图像
12.4.3  利用Arnold变换置乱图像
12.4.4  数字图像置乱算法的评价
12.5  混沌在图像加密中的应用
12.5.1  以排序法为基础的混沌置乱
12.5.2  基于起始地址法的混沌置乱
12.5.3  基于灰度值变换的混沌加密
12.5.4  对图像进行混沌加密的评价
12.6  数字图像的隐藏技术
12.6.1  图像融合技术简介
12.6.2  基于混沌的图像隐藏算法
12.6.3  图形用户界面设计
12.6.4  编码实现
第13章  使用OpenCV处理数字图像
13.1  OpenCV简介
13.1.1  OpenCV的前世今生
13.1.2  OpenCV的诸多优点
13.1.3  OpenCV的命名规则
13.1.4  OpenCV的相关资源
13.1.5  OpenCV的安装与配置
13.2  OpenCV的结构
13.2.1  OpenCV的体系结构
13.2.2  OpenCV的函数结构
13.2.3  OpenCV的功能结构
13.2.4  OpenCV的数据结构
13.3  利用OpenCV显示图像
13.3.1  图像文件的载入与显示
13.3.2  图像文件的创建、保存和复制
13.4  应用OpenCV进行图像平滑
13.4.1  功能函数描述
13.4.2  交互界面设计
13.4.3  编码实现
13.5  应用OpenCV进行边缘检测
13.5.1  Canny准则
13.5.2  Canny算法简介
13.5.3  在OpenCV中使用Canny算法
13.6  应用OpenCV进行形态学处理
13.6.1  功能函数描述
13.6.2  交互界面设计
13.6.3  编码实现
13.7  在OpenCV中应用Hough变换
13.7.1  功能函数描述
13.7.2  交互界面设计
13.7.3  编码实现
13.8  静态人脸检测程序的实现
13.8.1  人脸检测概述
13.8.2  算法分析
13.8.3  编程实现
第14章  使用ImageMagick处理图像
14.1  ImageMagick简介
14.1.1  处理数字图像的利器——ImageMagick
14.1.2  ImageMagick的特性和功能
14.1.3  Magick++
14.2  ImageMagick的使用配置
14.2.1  下载ImageMagick
14.2.2  编译ImageMagick
14.2.3  配置ImageMagick环境
14.3  Magick++基础
14.3.1  第一个Magick++程序
14.3.2  Magick++的核心——Image对象
14.3.3  Color对象
14.3.4  Geometry对象
14.4  初探Magick++
14.4.1  图像的缩放
14.4.2  图像的旋转
14.4.3  剪裁图像
14.4.4  矩阵变换
14.4.5  图像的镜像和滚动
14.5  使用Magick++对图像进行增强处理
14.5.1  调整图像的基本属性
14.5.2  高斯平滑
14.5.3  锐化
14.5.4  去除图像的噪点
14.6  使用Magick++实现图像特效
14.6.1  运动模糊特效
14.6.2  黑洞特效
14.6.3  浮雕效果
14.6.4  油画效果
14.6.5  阴影效果
14.6.6  旋涡效果
14.7  其他Magick++用法
14.7.1  种子填充
14.7.2  批量处理
14.7.3  真彩色转256色
14.7.4  图像合成
14.7.5  ImageMagick的C语言接口
参考文献