
本书对数字图像处理进行了较新的完整介绍。本书不仅适用于那些希望得到坚实基础的初学者,而且考虑到了那些希望了解重要技术的关键分析和现代应用的从业人员。这是原德文版本的第一个英文版本,该书已经被以下人员广泛使用。
以图像处理为工具的科学家和工程师,并且希望能深入理解,以便在自己的领域中对图像问题形成自己的解决方案。
需要自学该课程的信息技术(IT)专家,这些课程要包含能够简单地进行改编的代码和已经实现的例子,以便使他们能够立刻上手。
需要包含丰富实例的介绍性教科书的所有从业人员和学生,教科书要适合本科高年级学生或者研究生,并且包含丰富的、经过教学实际检验的练习、项目和实例。
译 者 序
自1970年以来,电荷耦合器件(CCD)和CMOS图像传感器被广泛应用于数字图像的采集。随着这些传感器分辨率水平的不断提高以及其消费价格的不断下降,曾经被认为是奢侈品的数码相机和摄像机已经成为普通消费电子产品,进入了寻常百姓的日常生活,以至于现在图像无处不在。
视觉是人类认知世界的最重要手段,研究表明,人类接受信息的83%来自视觉。数字图像处理作为计算机视觉、遥感图像处理与识别、医学图像处理、视频编码与处理、图像与视频检索等的基础知识,逐渐成为计算机科学与技术、信号与信息处理等相关专业的必修基础课程之一。
目前国内专科、本科到研究生都开设了数字图像处理的课程。数字图像处理涉及的范围广泛,因为授课对象、讲授内容的重点以及应用的不同,数字图像处理方面的教材很多,因此,选择一本合适的教材成为了难题。我认为,Wilhelm Burger和Mark J. Burge编写的这本书是一本难得的好教材,因为它具有以下特点:
1. 内容全面。本书内容包含了图像文件格式、直方图、点操作、滤波器、边缘与轮廓、角点检测、简单曲线检测、形态学滤波、二值图像区域、彩色图像与色彩空间、傅立叶变换、DCT变换、几何操作等图像处理的基础知识。
2. 容易理解。本书从实际应用和具体实现的角度出发,通俗易懂地讲解了各种图像处理的原理、数学表达,同时给出了简要的伪代码算法和完整的Java程序实现,伪代码算法和程序实现有助于算法原理的理解。
3. 练习得当。本书大多数章节后面都列有难易适当的练习题,完成这些练习题有助于掌握学习内容、加深理解并提高实际动手能力。
4. 使用Java作为编程语言。与C++、C#等相比,Java具有平台无关性,只要计算机上有Java虚拟机,Java编写的同一程序能够在任何操作系统上运行。随着Linux在国内的普及,Java也必将得到普及。
本书特别适合作为计算机与信息技术类专业高年级本科生或者研究生的教材。同时,对涉及图像处理的相关研究者和开发人员来讲,本书也是一本非常有用的技术参考书。
感谢清华大学出版社对我的信任,将这样一本重要的国外教材交给我翻译。由于时间和能力的限制,有错误和不妥之处,敬请读者谅解并批评指正。
参加本书翻译和校对工作的还有肖学中、张洪超、何慧婷、赵茜、王振锐、付田楠和臧彧。谢谢他们!数字图像处理: Java语言算法描述
前 言
本书对数字图像处理进行了较新的完整介绍。本书不仅适用于那些希望得到坚实基础的初学者,而且考虑到了那些希望了解重要技术的关键分析和现代应用的从业人员。这是原德文版本的第一个英文版本,该书已经被以下人员广泛使用。
以图像处理为工具的科学家和工程师,并且希望能深入理解,以便在自己的领域中对图像问题形成自己的解决方案。
需要自学该课程的信息技术(IT)专家,这些课程要包含能够简单地进行改编的代码和已经实现的例子,以便使他们能够立刻上手。
需要包含丰富实例的介绍性教科书的所有从业人员和学生,教科书要适合本科高年级学生或者研究生,并且包含丰富的、经过教学实际检验的练习、项目和实例。
虽然我们专注于实际应用和具体实现,但是我们并没有忽略重要的细节和数学理论,因为这些对算法更深一层的理解是必须的。
在着手写这本教科书的时候,我们有着这样一种考虑:简单的一本图像解决方案的书不足以给读者提供更深层次的理解,不能使读者将这些技术应用到新的问题当中去。为此我们从以下三个方面逐步展开:数学表达式的形式、简要的伪代码算法和完整的Java程序。我们再用一个统一的记号将这三个方面联系在一起--这样,我们就针对这个问题及其解决方案给出了多个角度的考虑,并且它们之间又是互相关联的。
预备知识
我们没有将数字图像处理当作一门数学学科,也没有严格地按照信号处理的形式来介绍,而是从一个从业者和编程人员的角度出发,将其他教科书普遍应用的形式替换为读者更容易理解的构成方式。为了更好地使用本书的程序部分,读者需要具备一些基本的数据结构和面向对象编程的知识,最好是Java。我们选择Java出于很多方面的考虑,其中之一是:Java是很多学生在工科课程中学习的第一门编程语言。对于具有相关语言知识(比如C或者C++)的从业者来说,本书中的示例程序是很容易理解和扩展的。
本书中的软件是基于ImageJ进行设计的。ImageJ是一个广泛应用的、可扩展编程的图像软件系统,由德国国家卫生总局(NIH) http://rsb.info.nih.gov/ij/. 的维恩·拉斯本德进行开发、维护和发布。ImageJ完全用Java语言来实现,因此它可以在所有的主流平台上运行。它被广泛应用的另外一个原因是它基于插件的结构使得它能够很容易地进行扩展。我们对在ImageJ下运行的所有的示例都进行了专门的设计,以便能够简单地移植到其他的环境和程序语言中。
研究和开发中的应用
我们将本书特别设计为教科书,其中的练习和精心构造的示例补充了基本概念和技术的综合细节。作为从业者和开发者,我们知道,正确理解和应用经典技术所需的细节资料有时是非常难以找寻的,所以,我们精心提供了这些细节、多年收集到的实际应用的实例以及成功应用这些技术所必须的东西。这使得这本教材相对于研究和开发中的其他教材来说更加宝贵,但这并不意味着它是一本综合的、完全引用的科学研究教材。相反,我们仔细地审查了我们的引用,确保他们可以从容易进入的资源中得到。
由于篇幅的限制,对于层次化方法、小波和特征图像等,我们只是简要地讨论了其基础,有些甚至完全省略。对于其他的一些内容,我们则是有意省略,包括一些高难度的话题,比如目标识别、图像理解和三维计算机视觉等。所以,虽然可以说该书中描述的多数技术可以被称为“聋哑的”,但是我们的经验是这样的: 这些较简单方法的直接的、技术上规则的实现对于一些特定领域、甚至“智能”方法的成功实现都是十分重要的。
如果你只是在寻找ImageJ或者Java的编程手册,那么肯定有更好的资源。虽然这本书中包含了很多ImageJ的参考和很多代码实例,但是编程本身并不是我们的重点,编程只是在用精确而直接的可测试方法描述一项技术的过程中的重要一步。
为什么写这本书
无论是称为信号处理,还是图像处理,或者是多媒体计算,数字图像的操作多年来已经是多数计算机科学工程教程中不可或缺的一部分。今天,随着全数字化工作流的普及,它已经变成多种学科专业技术中不可或缺的一部分。在数字媒体激增之前,往往只是提供一门课程,在工程上称为“数字信号处理”,在计算机科学中称为“数字图像处理”,而且还是一门选修课。
如今,这一课程已经被调整到了很多课程的前序阶段,成为了一门重要的基础课。这种迁移暴露了一个问题:许多作为研究生级课程所依赖的教科书对于初学者来说是不合适的。对于初学者来说,这些教科书通常太拘泥于形式,同时,不能对实际应用中多数流行的算法提供详细的介绍。结果,教师们发现选择一本教材或者是推荐少而精的文献给学生是一件十分困难的事情。我们也处在这样的两难境地,我们衷心希望这本书能够填补这一空缺。
接下来章节的内容可以分一学期或者连续的两学期来学习。为了让它比较灵活,我们增加了附加材料,以使每一章尽可能独立,也使教师在设计课程的过程中有更大的灵活性。第13~15章对图像处理中使用的频谱技术基础进行了详细的介绍,并且和本书中其他材料是独立的。根据教师和课程的要求,可以将这些内容根据具体要求包含进来,也可以完全不讲。
下面的计划图提供了用于一学期或者两个学期的课程建议。
一学期:一学期的课程可以围绕以下两个主题中的任意一个来展开:图像处理和图像分析。任意一个主题都可以很容易地融入之前学习的现代计算机科学或者IT课程中,图像分析更是医学信息学非常重要的基础课程。
两学期:如果该课程可以上两个学期,按照这里的设计,可以将内容按照难度(如下表所述)分成前后连贯的两部分(基础和高级). 用于一学期或者两个学期的课程建议图像处理图像分析基础高级第1章O第2章O第3章O第4章OO第5章OO第6章O第7章O第8章OO第9章OO第10章OO第11章OO第12章OO第13章OO第14章OO第15章OOO第16章OO第17章OO英文版的补充
本书是从德文第2版(2000年版)\翻译过来的,全书包含了很多优化处理。除了一些小的错误和改进外,我们对第5章中直方图匹配的表示、第11章中基于矩的集合区域特征、第10章中的形态学滤波器和第16章中的插值方法都进行了全面的修正。另外,重写了很多示例程序--比如,11.2.2节中的单程区域标记和轮廓找寻算法,以提高其清晰性并且利用了Java 5中新的语言特点。
在线资源
读者可以从本书的网站:www.imagingbook.com上下载补充材料,包括示例的完整源代码、示例中用到的测试图像和更正。对于教师来说还有一些额外的材料,包括本书中使用的所有公式和图表,都集中放在了一起。欢迎发邮件到:imagingbook@gmail.com提出意见、问题或者更正。
致谢
没有家庭的理解和支持,这本书是不会问世的。感谢维恩·拉斯本德(NIH)开发的ImageJ及其对社区的突出支持,感谢(TU Graz的)Axel Pinz教授和(TU Prague的)Vaclav Hlavac教授的意见,感谢第1版、第2版的读者在这方面的宝贵投入,是你们的建议使我们不断提高,是你们的鼓励促使我们翻译这一版。作者由衷地感谢索尼和苹果笔记本,为了这部手稿, CPU大约运转了1.6千万亿(1015)次,耗电560度,产生了196千克二氧化碳。最后感谢Springer-Verlag、Ursula Zimpfer和Jutta Maria Fleschutz的专家,和他们带领的德文版小组成员,以及负责英文版的Wayne Wheeler、Catherine Brett和Jeffrey Taub.
澳大利亚哈根堡/美国华盛顿
第1章 品味像素1
1.1 图像编程1
1.2 图像分析和计算机视觉2
第2章 数字图像4
2.1 数字图像的类型4
2.2 图像获取5
2.2.1 针孔照相机模型5
2.2.2 “薄”透镜6
2.2.3 数字化6
2.2.4 图像尺寸和分辨率8
2.2.5 图像坐标系统9
2.2.6 像素值9
2.3 图像文件格式11
2.3.1 光栅和矢量数据11
2.3.2 标签图像文件格式(TIFF) 12
2.3.3 图形交换格式(GIF) 13
2.3.4 可移植网络图形(PNG) 13
2.3.5 JPEG14
2.3.6 Windows位图(BMP) 16
2.3.7 简易位图格式(PBM) 16
2.3.8 其他文件格式17
2.3.9 比特和字节17
2.4 练习19
第3章 ImageJ20
3.1 图像操作和处理20
3.2 ImageJ综述21
3.2.1 关键特征22
3.2.2 交互式工具22
3.2.3 ImageJ插件23
3.2.4 第一个例子: 图像取反24
3.3 ImageJ和Java的其他信息26
3.3.1 ImageJ的资源26
3.3.2 用Java编程26
3.4 练习27
第4章 直方图28
4.1 什么是直方图28
4.2 解读直方图30
4.2.1 图像获取30
4.2.2 图像缺陷32
4.3 直方图计算34
4.4 多于8位图像的直方图36
4.4.1 像素组合36
4.4.2 例子36
4.4.3 实现36
4.5 彩色图像直方图37
4.5.1 强度直方图38
4.5.2 单个颜色通道直方图38
4.5.3 合并颜色直方图39
4.6 累积直方图39
4.7 练习40
第5章 点运算42
5.1 图像强度修正43
5.1.1 对比度和亮度43
5.1.2 利用设定门限限制结果值43
5.1.3 图像求反43
5.1.4 阈值操作44
5.2 点运算和直方图45
5.3 自动对比度调整45
5.4 修正的自动对比度调整47
5.5 直方图均衡化48
5.6 直方图规定化51
5.6.1 频率和概率51
5.6.2 直方图规定化的原理52
5.6.3 调整为分段线性分布52
5.6.4 调整到给定直方图(直方图匹配)54
5.6.5 例子57
5.7 Gamma校正59
5.7.1 为什么是Gamma60
5.7.2 Gamma函数60
5.7.3 真实Gamma值61
5.7.4 Gamma校正应用61
5.7.5 实现63
5.7.6 修正Gamma校正63
5.8 ImageJ中的点运算65
5.8.1 利用查找表进行点运算66
5.8.2 算术运算66
5.8.3 包含多幅图像的点运算67
5.8.4 两幅图像进行点运算的方法67
5.8.5 多幅图像的ImageJ插件67
5.9 练习69
第6章 滤波器72
6.1 什么是滤波器72
6.2 线性滤波器73
6.2.1 滤波矩阵74
6.2.2 运用滤波器74
6.2.3 计算滤波器算子75
6.2.4 滤波器插件示例76
6.2.5 整数系数78
6.2.6 任意尺寸的滤波器79
6.2.7 线性滤波器的类型80
6.3 线性滤波器的性质82
6.3.1 线性卷积82
6.3.2 线性卷积的性质83
6.3.3 线性滤波的可分离性84
6.3.4 滤波器的脉冲响应85
6.4 非线性滤波器87
6.4.1 最小值和最大值滤波87
6.4.2 中值滤波88
6.4.3 带权中值滤波器91
6.4.4 其他非线性滤波器92
6.5 滤波器的实现92
6.5.1 滤波程序的效率92
6.5.2 图像边界的处理93
6.5.3 调试滤波器程序93
6.6 ImageJ中的滤波运算94
6.6.1 线性滤波器94
6.6.2 高斯滤波器95
6.6.3 非线性滤波器95
6.7 练习96
第7章 边缘和轮廓98
7.1 边缘是怎么来的98
7.2 基于梯度的边缘检测99
7.2.1 偏导数和梯度99
7.2.2 导数滤波器100
7.3 边缘检测算子101
7.3.1 Prewitt算子和Sobel算子101
7.3.2 Roberts算子103
7.3.3 罗盘算子104
7.3.4 ImageJ中的边缘检测算子104
7.4 其他边缘检测算子105
7.4.1 基于二阶导数的边缘检测105
7.4.2 不同尺度下的边缘105
7.4.3 Canny算子106
7.5 从边缘到轮廓107
7.5.1 轮廓跟踪108
7.5.2 边缘图108
7.6 边缘锐化108
7.6.1 边缘锐化和拉普拉斯滤波器108
7.6.2 USM锐化111
7.7 练习114
第8章 角点检测116
8.1 感兴趣点116
8.2 Harris角点检测器116
8.2.1 局部结构矩阵117
8.2.2 角点响应函数117
8.2.3 确定角点118
8.2.4 例子120
8.3 实现121
8.3.1 步骤1: 计算角点响应函数121
8.3.2 步骤2: 选择“好的”角点123
8.3.3 显示角点126
8.3.4 小结127
8.4 练习128
第9章 检测简单曲线129
9.1 显著结构129
9.2 Hough变换130
9.2.1 参数空间131
9.2.2 累加器数组132
9.2.3 更好的直线表达式132
9.3 Hough变换的实现133
9.3.1 填写累加器数组134
9.3.2 分析累加器数组136
9.3.3 Hough变换的扩展136
9.4 圆与椭圆的Hough变换139
9.4.1 圆与弧139
9.4.2 椭圆141
9.5 练习142
第10章 形态学滤波器143
10.1 收缩和放大143
10.1.1 像素的邻域145
10.2 基本的形态学运算145
10.2.1 结构元素145
10.2.2 点集145
10.2.3 膨胀146
10.2.4 腐蚀147
10.2.5 膨胀与腐蚀的性质147
10.2.6 设计形态学滤波器149
10.2.7 应用举例: 轮廓152
10.3 复合运算153
10.3.1 开运算153
10.3.2 闭运算153
10.3.3 开运算和闭运算的性质153
10.4 灰度形态学154
10.4.1 结构元素154
10.4.2 膨胀与腐蚀155
10.4.3 灰度开运算与闭运算157
10.5 实现形态学滤波器158
10.5.1 ImagJ中的二值图像158
10.5.2 膨胀与腐蚀159
10.5.3 开运算与闭运算160
10.5.4 Outline函数160
10.5.5 ImageJ中的形态学运算161
10.6 练习162
第11章 二值图像中的区域164
11.1 寻找图像区域164
11.1.1 使用洪泛法进行区域标记165
11.1.2 顺序区域标记168
11.1.3 区域标记--总结172
11.2 区域轮廓173
11.2.1 外部和内部轮廓173
11.2.2 组合区域标记和轮廓寻找174
11.2.3 实现177
11.2.4 实例178
11.3 表征图像区域179
11.3.1 矩阵表示179
11.3.2 行程长度编码180
11.3.3 链式编码180
11.4 二值区域的属性182
11.4.1 形状特征183
11.4.2 几何特征183
11.4.3 统计形状属性185
11.4.4 基于矩的几何属性188
11.4.5 投影191
11.4.6 拓扑属性192
11.5 练习193
第12章 彩色图像195
12.1 RGB彩色图像195
12.1.1 彩色图像的组织197
12.1.2 ImageJ中的彩色图像199
12.2 颜色空间和颜色转换208
12.2.1 转换为灰度图像209
12.2.2 彩色图像的去饱和211
12.2.3 HSV/HSB和HLS彩色空间212
12.2.4 电视颜色空间--YUV、YIQ和YCbCr222
12.2.5 用于印刷的颜色空间--CMY和CMYK225
12.3 比色颜色空间228
12.3.1 CIE颜色空间228
12.3.2 CIE Lab233
12.3.3 sRGB235
12.3.4 Adobe RGB238
12.3.5 色度适应238
12.3.6 Java中的比色支持242
12.4 彩色图像统计248
12.4.1 一幅图像中有多少种颜色248
12.4.2 颜色直方图249
12.5 颜色量化251
12.5.1 标量颜色量化252
12.5.2 矢量量化253
12.6 练习258
第13章 频谱技术介绍260
13.1 傅里叶变换260
13.1.1 正弦和余弦函数260
13.1.2 周期函数的傅里叶级数263
13.1.3 傅里叶积分263
13.1.4 傅里叶频谱和变换264
13.1.5 傅里叶变换对265
13.1.6 傅里叶变换的重要性质267
13.2 离散信号268
13.2.1 采样269
13.2.2 离散周期函数273
13.3 离散傅里叶变换(DFT) 275
13.3.1 DFT的定义275
13.3.2 离散基函数276
13.3.3 又是混叠现象278
13.3.4 信号空间和频率空间的单位279
13.3.5 功率谱280
13.4 DFT的实现281
13.4.1 直接实现281
13.4.2 快速傅里叶变换(FFT) 282
13.5 练习283
第14章 二维离散傅里叶变换284
14.1 二维DFT的定义284
14.1.1 二维基函数284
14.1.2 二维DFT的实现286
14.2 二维傅里叶变换的可视化287
14.2.1 频谱范围287
14.2.2 中心表示法288
14.3 2D下的频率和方向289
14.3.1 有效频率289
14.3.2 2D下的频率限制和混叠290
14.3.3 方向291
14.3.4 二维频谱几何校正291
14.3.5 周期性效应292
14.3.6 窗口292
14.3.7 窗口函数294
14.4 二维傅里叶变换的例子296
14.5 DFT的应用300
14.5.1 频率空间的线性滤波运算300
14.5.2 线性卷积和互相关301
14.5.3 逆滤波器301
14.6 练习302
第15章 离散余弦变换(DCT) 303
15.1 一维DCT303
15.1.1 DCT基函数303
15.1.2 一维DCT的实现305
15.2 二维DCT306
15.2.1 分离性306
15.2.2 例子306
15.3 其他频谱变换307
15.4 练习308
第16章 几何运算309
16.1 二维映射函数310
16.1.1 简单映射310
16.1.2 齐次坐标311
16.1.3 仿射(三点)映射311
16.1.4 投影(四点)映射313
16.1.5 双线性映射317
16.1.6 其他非线性图像变换318
16.1.7 局部图像变换320
16.2 图像重采样321
16.2.1 源到目标的映射321
16.2.2 目标到源的映射322
16.3 插值323
16.3.1 简单插值方法323
16.3.2 理想插值324
16.3.3 通过卷积进行插值327
16.3.4 三次插值327
16.3.5 样条插值328
16.3.6 Lanczos插值331
16.3.7 二维插值333
16.3.8 混叠339
16.4 Java 实现341
16.4.1 几何变换341
16.4.2 像素插值351
16.4.3 采样的应用353
16.5 练习355
第17章 图像比较356
17.1 灰度图像的模板匹配357
17.1.1 图像之间的距离358
17.1.2 实现364
17.1.3 在旋转和比例变换下进行匹配366
17.2 二值图像匹配366
17.2.1 直接比较366
17.2.2 距离变换367
17.2.3 斜面匹配370
17.3 练习373
附录A 数学记号374
A.1 符号374
A.2 集合算子375
A.3 复数375
A.4 算法复杂度和O记号376
附录B Java摘记378
B.1 算术运算378
B.1.1 整数除法378
B.1.2 求模算子379
B.1.3 无符号字节型380
B.1.4 数学函数(类Math)381
B.1.5 舍入381
B.1.6 反正切函数382
B.1.7 Float和Double(类)382
B.2 数组和集合382
B.2.1 创建数组382
B.2.2 数组大小383
B.2.3 访问数组元素383
B.2.4 二维数组383
B.2.5 克隆数组385
B.2.6 对象数组,排序386
B.2.7 集合体(Collection)387
附录C ImageJ的简短参考388
C.1 安装与设置388
C.2 ImageJ API389
C.2.1 图像及其处理器390
C.2.2 图像(ij包)390
C.2.3 图像处理器(ij.process包)391
C.2.4 插件(ij.plugin、ij.plugin.filter包)391
C.2.5 GUI类(ij.gui包)392
C.2.6 窗口管理(ij包)393
C.2.7 工具类(ij包)393
C.2.8 输入-输出(ij.io包)394
C.3 创建图像和图像栈394
C.3.1 ImagePlus(类)394
C.3.2 ImageStack(类)395
C.3.3 IJ(类)395
C.3.4 NewImage(类)395
C.3.5 ImageProcessor(类)396
C.4 创建图像处理器396
C.4.1 ImagePlus(类)396
C.4.2 ImageProcessor(类)396
C.4.3 ByteProcessor(类)397
C.4.4 ColorProcessor(类)397
C.4.5 FloatProcessor(类)397
C.4.6 ShortProcessor(类)398
C.5 载入和存储图像398
C.5.1 IJ(类)398
C.5.2 Opener(类)399
C.5.3 FileSaver(类)400
C.5.4 FileOpener(类)401
C.6 图像参数402
C.6.1 ImageProcessor(类)402
C.6.2 ColorProcessor(类)402
C.7 访问像素402
C.7.1 通过2D图像坐标访问像素402
C.7.2 通过1D索引访问像素404
C.7.3 访问多个像素404
C.7.4 同时访问所有像素405
C.7.5 彩色图像的特有访问方法406
C.7.6 直接访问像素数组406
C.8 图像转换407
C.8.1 ImageProcessor(类)407
C.8.2 ImagePlus、ImageConverter(类)408
C.9 直方图与图像统计量410
C.9.1 ImageProcessor(类)410
C.10 点运算410
C.10.1 ImageProcessor(类)410
C.11 滤波器412
C.11.1 ImageProcessor(类)412
C.12 几何运算413
C.12.1 ImageProcessor(类)413
C.13 图形运算414
C.13.1 ImageProcessor(类)414
C.14 显示图像和图像栈415
C.14.1 ImagePlus(类)416
C.14.2 ImageProcessor(类)417
C.15 图像栈上的操作419
C.15.1 ImagePlus(类)419
C.15.2 ImageStack(类)419
C.15.3 图像栈的例子420
C.16 感兴趣区域424
C.16.1 ImagePlus(类)424
C.16.2 Roi、Line、OvalRoi、PointRoi、PolygonRoi(类)424
C.16.3 ImageProcessor(类)425
C.16.4 ImageStack(类)428
C.16.5 IJ(类)428
C.17 图像属性428
C.18 用户交互430
C.18.1 IJ(类)430
C.18.2 GenericDialog(类)431
C.19 插件432
C.19.1 PlugIn(接口)433
C.19.2 PlutInFilter(接口)433
C.19.3 插件的执行: IJ(类)434
C.20 窗口管理434
C.20.1 WindowManager(类)434
C.21 其他函数435
C.21.1 ImagePlus(类)435
C.21.2 IJ(类)436
附录D 源代码438
D.1 Harris角点检测器438
D.1.1 Harris_Corner_Plugin(类)438
D.1.2 Corner文件(类)439
D.1.3 HarrisCornerDetector文件(类)440
D.2 组合区域标记和轮廓跟踪445
D.2.1 Contour_Tracing_Plugin(类)445
D.2.2 Contour(类)447
D.2.3 BinaryRegion(类)449
D.2.4 ContourTracer(类)450
D.2.5 ContourOverlay(类)455