数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-23 23:24:04

点击下载

作者:张铮 徐超 任淑霞 韩海玲 编著

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)

数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)试读:

前言

图像处理与机器视觉是当今计算机科学中的一个热门研究方向,应用广泛,发展前景乐观。近年来,伴随着人工智能、模式识别学科以及人机智能接口技术的飞速发展,机器视觉的研究正在不断升温——从日常生活中与人类息息相关的光学字符识别(OCR)和汽车自动驾驶,到医学应用中的病灶检测与分析,再到未来人机智能交互领域中的人脸识别、情感计算等,图像处理作为机器视觉研究中必不可少的图像预处理环节是读者需要掌握的首要技术。

和图像相关的东西往往容易引起计算机初学者的兴趣,笔者在读本科的时候就觉得能让计算机理解所“看”到的东西是一件非常神秘和令人兴奋的事情;但同时它的理论性较强,门槛较高,在各个高校中,这门课程大多也是作为计算机专业研究生的选修课程。要理解该领域的知识,读者需要具有一定的数学基础,除此之外还涉及信号处理、统计分析、模式识别和机器学习等专业领域知识,因此令很多人望而却步。

其实“难以理解”的关键在于缺乏必要的先序知识,造成了读者在相关知识上难以跨越的鸿沟。在撰写本书过程中,对于可能造成读者理解困难的地方,均尽可能地给出了必要的基本知识,深入浅出,尽量定性地去描述,对于那些并不一目了然的结论均给出了思路和解释,必要的还提供了证明,对于某些非常专业已经超过本书讨论范围的相关知识在最后给出了参考文献,供有兴趣的读者进一步学习和研究。

本书的宗旨是在向读者介绍知识的同时,培养读者的思维方法,使读者知其然还要知其所以然,并在解决实际问题中能有自己的想法。1.内容安排

本书在第一版的基础上,根据技术的发展和应用的需求进行改版,主要内容介绍如下。

第0~2章介绍了数字图像处理的基础知识和编程基础,使读者第一步能够建立起对于数字图像本质的正确认识,了解和掌握必要的术语和预备知识,并且熟悉本书自始至终需要使用的两大工具MATLAB和Visual C++,给出了功能强大的C++数字图像处理基类CImg及其派生类CImgProcess的框架。

第3~4章分别介绍了图像的灰度变换和几何变换。通过灰度变换可以有效改善图像的外观,并在一定程度上实现图像的灰度归一化;几何变换则主要应用在图像的几何归一化和图像校准当中。总体而言,这些内容大多作为图像的前期预处理工作的一部分,是图像处理中相对固定和程式化的内容。

第5~6章分别从空间域和频率域两个角度去考量图像增强的各个主要方面。图像增强作为数字图像处理中相对简单却最具艺术性的领域之一,可理解为根据特定的需要突出一幅图像中的某些信息,同时,削弱或去除某些不需要的信息的处理方法。其主要目的是使处理后的图像对某种特定的应用来说,比原始图像更适用。

第7章小波变换继第6章之后继续在频率域中研究图像。傅里叶变换一直是频率域图像处理的基石,它能用正余弦函数之和表示任何分析函数,而小波变换则基于一些有限宽度的基小波,这些小波不仅在频率上是变化的,而且具有有限的持续时间。比如对于一个乐谱,小波变换不仅能提供要演奏的音符,而且说明了何时演奏等细节信息,但是傅里叶变换只提供了音符,局部信息在变换中丢失。

第8章图像复原与图像增强相似,其目的也是改善图像质量。但是图像复原是试图利用退化过程的先验知识使已被退化的图像恢复本来面目,而图像增强是用某种试探的方式改善图像质量,以适应人眼的视觉与心理。引起图像退化的因素包括由光学系统、运动等造成的图像模糊,以及源自电路和光学因素的噪声等。图像复原是基于图像退化的数学模型,复原的方法也建立在比较严格的数学推导上。

第9章是本书中相对独立的一章,以介绍色彩模型之间的相互转换以及彩色图像处理方面的基本概念和基本方法为主。随着基于互联网的图像处理应用在不断增长,彩色图像处理已经成为一个重要领域。

第10章图像压缩旨在减少表示数字图像时需要的数据量。主要介绍了图像压缩的基本原理、DCT变换、预测编码、霍夫曼编解码,以及算术编码和游程编码等知识,并给出了有关JPEG和JPEG2000压缩标准的内容。

第11~13章(形态学图像处理、图像分割、特征提取)是从单纯图像处理向图像识别(机器视觉)过渡,这一阶段的特点是输入是图像,输出则是在识别意义上读者感兴趣的图像元素。形态学处理是提取图像元素的有力技术,它在表现和描述形状方面非常有用;分割过程则将一幅图像划分为组成部分或目标对象;研究特征提取则是要将前面提取出来的图像元素或目标对象表示为适合计算机后续处理的数值形式,最终形成能够直接供分类器使用的特征。

第14章在前面知识的基础之上,引出了机器视觉的前导性内容,给出了解决识别问题的一般思路。

最后3章(人工神经网络、支持向量机和AdaBoost)介绍了3种十分强大的分类技术,并在手写数字字符识别、人脸识别和性别分类这样的经典案例中进行讲解。2.读者对象● 大学二年级以上(具备必要的数学基础)的相关专业的本科生、

研究生。● 工作在图像处理和识别领域一线的工程技术人员。● 对于数字图像处理和机器视觉感兴趣的并且具备必要预备知识的

所有读者。3.在阅读本书之前,读者最好具有如下的预备知识● 读者应该熟悉C++编程语言和面向对象的基本思想。书中的相当

一部分示例是以C++语言描述的。● 读者应具备一定的数学基础,主要的高等数学知识、少量的线性

代数基本概念加上对于概率理论主要思想的理解(识别部分)。4.附书光盘和读者反馈

本书所有Visual C++实例的源代码和大部分Matlab实例的源代码均可在随书附赠的光盘中找到。为了尽可能满足所有读者的需要,同时提供了C++代码的Visual C++ 6.0版本和Visual Studio 2010/2012版本。虽然本书中的所有例子都已经在Windows XP、Windows 2003和Windows7下测试通过,但由于许多算法比较复杂且笔者水平局限,也有存在缺陷的可能,即便正确也很可能存在更加优化的算法或更加合理的程序结构,如发现任何上述问题,欢迎读者通过以下方式联系本书作者,以便做出改进。

邮箱:book95_editor@qq.com

腾讯微博:@Book95_Aaron5.致谢

首先要感谢我的授业恩师——南开大学的白刚教授和天津大学的赵政教授,是他们引导我进入了图像处理与机器视觉的研究领域。同时,他们在我写作过程中的指点和教诲确保了本书的权威性和严谨性。

感谢我的好友王烨阳提供并调试了许多实例代码;感谢徐超、陈明、张阳、李广鹏、马惠来、马宏、卞长迪、郑琦、王命达、杜强、陈香凝、苑春苗、宁升、李鸿鹏、李明剑等参与了本书部分章节的编写和修改;感谢罗小科先生为本书制作了很多插图;感谢我的兄长张钊为本书提供了部分照片;还要感谢朱毅、丁宗尧、刘群忠、贾万宏等为本书的编写提出了很多的宝贵意见和建议。

最后感谢我的妻子马宏、儿子张垚淼及我的父母家人,没有你们的鼓励和支持就不会有我的这部作品。

编 著 第0章初识数字图像处理与机器视觉

图像是指能在人的视觉系统中产生视觉印象的客观对象,包括自然景物、拍摄到的图片、用数学方法描述的图形等。图像的要素有几何要素(刻画对象的轮廓、形状等)和非几何要素(刻画对象的颜色、材质等)。

本章中,主要讲解数字图像和数字图像处理的实质内容和一般步骤,以及一些后面会经常使用到的基本概念。0.1 数字图像

自然界中的图像都是模拟量,在计算机普遍应用之前,电视、电影、照相机等图像记录与传输设备都是使用模拟信号对图像进行处理。但是,计算机只能处理数字量,而不能直接处理模拟图像。所以要在使用计算机处理图像之前进行图像数字化。0.1.1 什么是数字图像

简单地说,数字图像就是能够在计算机上显示和处理的图像,可根据其特性分为两大类——位图和矢量图。位图通常使用数字阵列来表示,常见格式有BMP、JPG、GIF等;矢量图由矢量数据库表示,接触最多的就是PNG图形。提示本书只涉及数字图像中位图图像的处理与识别,如无特别说明,后文提到的“图像”和“数字图像”都仅仅是指位图图像。一般而言,使用数字摄像机或数字照相机得到的图像都是位图图像。

将一幅图像视为一个二维函数f(x, y),其中x和y是空间坐标,而在x – y平面中的任意一对空间坐标(x, y)上的幅值f称为该点图像的灰度、亮度或强度。此时,如果f、x、y均为非负有限离散,则称该图像为数字图像(位图)。

一个大小为M×N数字图像是由M行N列的有限元素组成的,每个元素都有特定的位置和幅值,代表了其所在行列位置上的图像物理信息,如灰度和色彩等。这些元素称为图像元素或像素。0.1.2  数字图像的显示

不论是CRT显示器还是LCD显示器,都是由许多点构成的,显示图像时这些点对应着图像的像素,称显示器为位映像设备。所谓位映像,就是一个二维的像素矩阵,而位图也就是采用位映像方法显示和存储的图像。当一幅数字图像被放大后就可以明显地看出图像是由很多方格形状的像素构成的,如图0.1所示。图0.1 位图图像示例0.1.3  数字图像的分类

根据每个像素所代表信息的不同,可将图像分为二值图像、灰度图像、RGB图像以及索引图像等。1.二值图像

每个像素只有黑、白两种颜色的图像称为二值图像。在二值图像中,像素只有0和1两种取值,一般用0来表示黑色,用1表示白色。2.灰度图像

在二值图像中进一步加入许多介于黑色与白色之间的颜色深度,就构成了灰度图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,每种灰度(颜色深度)称为一个灰度级,通常用L表示。在灰度图像中,像素可以取0~L-1之间的整数值,根据保存灰度数值所使k用的数据类型不同,可能有256种取值或者说2种取值,当k=1时即退化为二值图像。3.RGB图像

众所周知,自然界中几乎所有颜色都可以由红(Red, R)、绿(Green, G)、蓝(Blue, B)3种颜色组合而成,通常称它们为RGB三原色。计算机显示彩色图像时采用最多的就是RGB模型,对于每个像素,通过控制R、G、B三原色的合成比例决定该像素的最终显示颜色。

对于三原色RGB中的每一种颜色,可以像灰度图那样使用L个等级来表示含有这种颜色成分的多少。例如对于含有256个等级的红色,0表示不含红色成分,255表示含有100%的红色成分。同样,绿色和蓝色也可以划分为256个等级。这样每种原色可以用8位二进制数据表示,于是3原色总共需要24位二进制数,这样能够表示出的颜色种24类数目为256×256××256=2,大约有1600万种,已经远远超过普通人所能分辨出的颜色数目。

RGB颜色代码可以使用十六进制数减少书写长度,按照两位一组的方式依次书写R、G、B三种颜色的级别。例如:0xFF0000代表纯红色,0x00FF00代表纯绿色,而0x00FFFF是青色(这是绿色和蓝色的加和)。当RGB三种颜色的浓度一致时,所表示的颜色就退化为灰度,比如0 x808080就是50%的灰色,0x000000为黑色,而0xFFFFFF为白色。常见颜色的RGB组合值如表0.1所示。表0.1 常见颜色的RGB组合值 颜 色RGB 红(0xFF0000)2550  0   蓝(0x00FF00)0  2550   绿(0x0000FF)0  0  255 黄(0xFFFF00) 2552550   紫(0xFF00FF) 2550  255 青(0x00FFFF) 0  255255 白(0xFFFFFF) 255255255 黑(0x000000)0  0  0   灰(0x808080)128128128

未经压缩的原始BMP文件就是使用RGB标准给出的3个数值来存储图像数据的,称为RGB图像。在RGB图像中每个像素都是用24位二进制数表示,故也称为24位真彩色图像。4.索引图像

如果对每个像素都直接使用24位二进制数表示,图像文件的体积将变得十分庞大。来看一个例子,对一个长、宽各为200像素,颜色数为16的彩色图像,每个像素都用RGB三个分量表示。这样每个像素由3个字节表示,整个图像就是200×200×3=120kB。这种完全未经压缩的表示方式,浪费了大量的存储空间,下面简单介绍另一种更节省空间的存储方式:索引图像。

同样还是对200×200像素的16色图像,由于这张图片中最多只有16种颜色,那么可以用一张颜色表(16×3的二维数组)保存这16种颜色对应的RGB值,在表示图像的矩阵中使用那16种颜色在颜色表中的索引(偏移量)作为数据写入相应的行列位置。例如,颜色表中第3个元素为0xAA1111,那么在图像中所有颜色为0xAA1111的像素均可以由3-1=2表示(颜色表索引下标从0开始)。这样一来,每一个像素所需要使用的二进制数就仅仅为4位(0.5字节),从而整个图像只需要200×200×0.5=20kB就可以存储,而不会影响显示质量。

上文所指的颜色表就是常说的调色板(Palette),另一种说法叫作颜色查找表(Look Up Table,LUT)。Windows位图中应用到了调色板技术。其实不仅是Windows位图,许多其他的图像文件格式比如PCX、TIF、GIF都应用了这种技术。

在实际应用中,调色板中通常只有少于256种的颜色。在使用许多图像编辑工具生成或者编辑GIF文件的时候,常常会提示用户选择文件包含的颜色数目。当选择较低的颜色数目时,将会有效地降低图像文件的体积,但也会一定程度上降低图像的质量。

使用调色板技术可以减小图像文件体积的条件是图像的像素数目相对较多,而颜色种类相对较少。如果一个图像中用到了全部的24位真彩色,对其使用颜色查找表技术是完全没有意义的,单纯从颜色角度对其进行压缩是不可能的。0.1.4  数字图像的实质

实际上,0.1.1小节中对于数字图像f(x, y)的定义仅适用于最为一般的情况,即静态的灰度图像。更严格地说,数字图像可以是2个变量(对于静止图像,Static Image)或3个变量(对于动态画面,Video Sequence)的离散函数。在静态图像的情况下是f (x, y),而如果是动态画面,则还需要时间参数t,即f (x, y, t)。函数值可能是一个数值(对于灰度图像),也可能是一个向量(对于彩色图像)。提示静态的灰度图像是本书研究的主要对象,对于函数值为向量的情况会在第9章彩色图像处理中阐述。

图像处理是一个涉及诸多研究领域的交叉学科,下面就从不同的角度来审视数字图像。(1)从线性代数和矩阵论的角度,数字图像就是一个由图像信息组成的二维矩阵,矩阵的每个元素代表对应位置上的图像亮度和/或色彩信息。当然,这个二维矩阵在数据表示和存储上可能不是二维的,这是因为每个单位位置的图像信息可能需要不只一个数值来表示,这样可能需要一个三维矩阵来对其进行表示(参见1.2节关于Matlab中RGB图像表示的介绍)。(2)由于随机变化和噪声的原因,图像在本质上是统计性的。因而有时将图像函数作为随机过程的实现来观察其存在的优越性。这时有关图像信息量和冗余的问题可以用概率分布和相关函数来描述和①考虑。例如,如果知道概率分布,可以用熵(Entropy)H来度量图像的信息量,这是信息论中一个重要的思想。(3)从线性系统的角度考虑,图像及其处理也可以表示为用狄拉克冲激公式表达的点展开函数的叠加,在使用这种方式对图像进行表示时,可以采用成熟的线性系统理论研究。在大多数时候,都考虑使用线性系统近似的方式对图像进行近似处理以简化算法。虽然实际的图像并不是线性的,但是图像坐标和图像函数的取值都是有限的和非连续的。0.1.5  数字图像的表示

为了表述像素之间的相对和绝对位置,通常还需要对像素的位置进行坐标约定。本书中所使用的坐标约定如图0.2所示。但在MATLAB中坐标的约定会有变化,具体请参见1.1.5小节。图0.2 数字图像的坐标约定

在这之后,一幅物理图像就被转化成了数字矩阵,从而成为计算机能够处理的对象了。数字图像f的矩阵表示如下所示。(0-1)

有时也可以使用传统矩阵表示法来表示数字图像和像素,如下式所示。(0-2)

其中行列(M行N列)必须为正整数,而离散灰度级数目L一般为2的k次幂,k为整数(因为使用二进制整数值表示灰度值),图像的动态范围为[0, L-1],那么图像存储所需的比特数为b = M×N×k。注意到在矩阵f(y, x)中,一般习惯于先行下标,后列下标的表示方法,因此这里先是纵坐标y(对应行),然后才是横坐标x(对应列)。

而有些图像矩阵中,很多像素的值都是相同的。例如在一个纯黑背景上使用不同灰度勾勒的图像,大多数像素的值都会是0。这种矩阵称为稀疏矩阵(Sparse Matrix),可以通过简单描述非零元素的值和位置来代替,大量地写入0元素。这时存储图像需要的比特数可能会大大减少。0.1.6  图像的空间和灰度级分辨率1.图像的空间分辨率(Spatial Resolution)

图像的空间分辨率是指图像中每单位长度所包含的像素或点的数目,常以像素/英寸(pixels per inch, ppi)为单位来表示。如72ppi表示图像中每英寸包含72个像素或点。分辨率越高,图像将越清晰,图像文件所需的磁盘空间也越大,编辑和处理所需的时间也越长。

像素越小,单位长度所包含的像素数据就越多,分辨率也就越高,但同样物理大小范围内所对应图像的尺寸也会越大,存储图像所需要的字节数也越多。因而,在图像的放大缩小算法中,放大就是对图像的过采样,缩小是对图像的欠采样,这些会在4.5节图像缩放中进一步介绍。

一般在没有必要对涉及像素的物理分辨率进行实际度量时,通常会称一幅大小为M×N的数字图像的空间分辨率为M×N像素。

图0.3给出了同一幅图像在不同的空间分辨率下呈现出的不同效果。当高分辨率下的图像以低分辨率表示时,在同等的显示或者打印输出条件下,图像的尺寸变小,细节变得不明显;而当将低分辨率下的图像放大时,则会导致图像的细节仍然模糊,只是尺寸变大。这是因为缩小的图像已经丢失了大量的信息,在放大图像时只能通过复制行列的插值的方法来确定新增像素的取值。图0.3 图像的空间分辨率——一幅分辨率为1024×1024的图像逐次减少至32×32的分辨率2.图像的灰度级/辐射计量分辨率(Radiometric Resolution)

在数字图像处理中,灰度级分辨率又叫色阶,是指图像中可分辨的灰度级数目,即前文提到的灰度级数目L,它与存储灰度级别所使用的数据类型有关。由于灰度级度量的是投射到传感器上光辐射值的强度,所以灰度级分辨率也叫辐射计量分辨率。

随着图像的灰度级分辨率逐渐降低,图像中包含的颜色数目变少,从而在颜色的角度造成图像信息受损,同样使图像细节表达受到了一定的影响,如图0.4所示。图0.4 图像的灰度级分辨率——分别具有256、32、16、8、4和2个灰度级的一幅图像0.2 数字图像处理与机器视觉0.2.1 从图像处理到图像识别

图像处理、图像分析和图像识别是认知科学与计算机科学中的一个令人兴奋的活跃分支。从1970年这个领域经历了人们对其兴趣的爆炸性增长以来,到20世纪末逐渐步入成熟。其中遥感、技术诊断、智能车自主导航、医学平面和立体成像以及自动监视领域是发展最快的一些方向。这种进展最集中地体现在市场上多种应用这类技术的产品的纷纷涌现。事实上,从数字图像处理到数字图像分析,再发展到最前沿的图像识别技术,其核心都是对数字图像中所含有的信息的提取及与其相关的各种辅助过程。1.数字图像处理

数字图像处理(Digital Image Processing)就是指使用电子计算机对量化的数字图像进行处理,具体地说就是通过对图像进行各种加工来改善图像的外观,是对图像的修改和增强。

图像处理的输入是从传感器或其他来源获取的原始的数字图像,输出是经过处理后的输出图像。处理的目的可能是使输出图像具有更好的效果,以便于人的观察;也可能是为图像分析和识别做准备,此时的图像处理是作为一种预处理步骤,输出图像将进一步供其他图像进行分析、识别算法。2.数字图像分析

数字图像分析(Digital Image Analyzing)是指对图像中感兴趣的目标进行检测和测量,以获得客观的信息。数字图像分析通常是指将一幅图像转化为另一种非图像的抽象形式,例如图像中某物体与测量者的距离、目标对象的计数或其尺寸等。这一概念的外延包括边缘检测和图像分割、特征提取以及几何测量与计数等。

图像分析的输入是经过处理的数字图像,其输出通常不再是数字图像,而是一系列与目标相关的图像特征(目标的描述),如目标的长度、颜色、曲率和个数等。3.数字图像识别

数字图像识别(Digital Image Recognition)主要是研究图像中各目标的性质和相互关系,识别出目标对象的类别,从而理解图像的含义。这往往囊括了使用数字图像处理技术的很多应用项目,例如光学字符识别(OCR)、产品质量检验、人脸识别、自动驾驶、医学图像和地貌图像的自动判读理解等。

图像识别是图像分析的延伸,它根据从图像分析中得到的相关描述(特征)对目标进行归类,输出使用者感兴趣的目标类别标号信息(符号)。

总而言之,从图像处理到图像分析再到图像识别这个过程,是一个将所含信息抽象化,尝试降低信息熵,提炼有效数据的过程,如图0.5所示。图0.5 数字图像处理、分析和识别的关系

从信息论的角度上说,图像应当是物体所含信息的一个概括,而数字图像处理侧重于将这些概括的信息进行变换,例如升高或降低熵值,数字图像分析则是将这些信息抽取出来以供其他过程调用。当然,在不太严格时,数字图像处理也可以兼指图像处理和分析。

读者或许也听过另一个概念,计算机图形学(Computer Graphics)。此概念与数字图像分析大致相反,它是一个对由概念或数学表述的物体图像进行处理和显示的过程。0.2.2 什么是机器视觉

机器视觉(Machine Vision),又称计算机视觉(Computer Vision)。它是将数字图像处理和数字图像分析、图像识别结合起来,试图开发出一种能与人脑的部分机能比拟,能够理解自然景物和环境的系统,在机器人领域中为机器人提供类似人类视觉的功能。计算机视觉是数字成像领域的尖端方向,具有最综合的内容和最广泛的涵盖面。提示后文中,如无特别说明,文章通常使用广义的图像处理概念,即用数字图像处理这个词涵盖上文所提到的图像处理和数字图像分析;而对于图像识别和机器视觉的概念常常不加区分,尽管严格地说识别只对应于高级视觉的范畴。0.2.3 数字图像处理和识别的应用实例

如今,数字图像处理与机器视觉的应用越来越广泛,已经渗透到国家安全、航空航天、工业控制、医疗保健等各个领域乃至人们的日常生活和娱乐当中,在国民经济中发挥着举足轻重的作用。

一些典型的应用如表0.2所示。表0.2 图像处理与识别的典型应用相关领域典型应用安全监控指纹验证、基于人脸识别的门禁系统 工业控制产品无损检测、商品自动分类 医疗保健X光照片增强、CT、核磁共振、病灶自动检测   生活娱乐基于表情识别的笑脸自动检测、汽车自动驾驶、手写字符识别

下面结合两个典型的应用来说明。1.图像处理的典型案例——X光照片的增强

图0.6中的两幅图片,图0.6(a)是一幅直接拍摄未经处理的X光照片,对比度较低,图像细节难以辨识;图0.6(b)中呈现了图0.6(a)经过简单的增强处理后的效果,图像较为清晰,可以有效地指导诊断和治疗。从中读者应该可以看出图像处理技术在辅助医学成像上的重要作用。图0.6 图像处理前后的效果对比2.图像识别的典型案例——ALVINN汽车自动驾驶系统

著名的自动驾驶系统ALVINN是人工神经网络(关于人工神经网络的介绍详见第15章)的一个典型的应用。该系统使用一个经过训练的神经网络以正常速度在高速公路上驾驶汽车。如图0.7(b)所示,ALVINN具有一个典型的3层结构,网络的输入层共有30×32个单元,对应于一个30×32的像素点阵,是由一个安装在车辆上的前向摄像机获取的图像经过重采样得到的。输出层共有30个单元,输出情况指出了车辆行进的方向。图0.7 学习汽车自动驾驶的ALVINN系统

在训练阶段,ALVINN以人类驾驶时摄像机所捕获的前方交通状况作为输入,以人类通过操作方向盘给出的前进方向作为目标输出,整个训练过程大约5分钟;在测试阶段,ALVINN用学习到的网络在高速公路上以70英里的时速成功地驾驶了90英里。注(a)为车内的摄像头和前方的实际情况;(b)为ALVINN的网络结构,摄像头捕获图像的30×32的重采样图像被作为网络的输入,对应于960个输入层单元,这些输入又连接至4个隐藏单元,再连接到30个输出单元,输出为一个30维向量,相当于把整个方向盘的控制范围分成30份,每个输出单元对应一个特定的驾驶方向,决策结果为输出值最大的单元对应的行驶方向。0.3 数字图像处理的预备知识

数字图像是由一组具有一定的空间位置关系的像素组成的,因而具有一些度量和拓扑性质。理解像素间的关系是学习图像处理的必要准备,这主要包括相邻像素,邻接性、连通性,区域、边界的概念,以及今后要用到的一些常见距离度量方法。另外0.3.3小节还将简单介绍几种基本的图像操作。0.3.1 邻接性、连通性、区域和边界

为理解这些概念,需要首先了解相邻像素的概念。依据标准的不同,可以关注像素P的4邻域和8邻域,如图0.8所示。图0.8 P的各种邻域1.邻接性(Adjacency)

定义V是用于决定邻接性的灰度值集合,它是一种相似性的度量,用于确定所需判断邻接性的像素之间的相似程度。比如在二值图像中,如果认为只有灰度值为1的像素是相似的,则即V={1},当然相似性的规定具有主观标准,因此也可以认为V={0,1},此时邻接性完全由位置决定;而对于灰度图像,这个集合中则很可能包含更多的元素。此外,定义对角邻域N(P)为8-邻域中不属于4-邻域的部分(见图D0.8(c)),那么有如下的规定。(1)4邻接(4-Neighbor):如果 Q∈N(P),则称具有V中数值的4两个像素P和Q是4邻接的。(2)8邻接(8-Neighbor):如果 Q∈N(P),则称具有V中数值的8两个像素P和Q是8邻接的。

举例来说,图0.9(a)、图0.9(b)分别是像素和Q、Q、Q的124邻接和8邻接示意图。而对于两个图像子集S和S,如果S中的某121些像素和S中的某些像素相邻,则称这两个子集是邻接的。2图0.9 邻接示意图2.连通性

为了定义像素的连通性,首先需要定义像素P到像素Q的通路(Path)。这也是建立在邻接性的基础上的。

像素P到像素Q的通路(Path)指的是一个特定的像素序列(x, 0y), (x, y), …, (x, y),其中(x, y) = (x, y),(x, y) = (x, y)。并011nn00ppnnqq且像素(x, y) 和(x, y) 在满足1≤i≤n时是邻接的。在上面的定义iii-1i-1中,n是通路的长度,若(x, y) = (x, y),则这条通路是闭合通路。00nn相对应于邻接的概念,在这里有4通路和8通路。这个定义和图论中的通路定义是基本相同的,只是由于邻接概念的加入而变得更加复杂。

像素的连通性(Contiguous):令S代表一幅图像中的像素子集,如果在S中全部像素之间存在一个通路,则可以称2个像素P和Q在S中是连通的。此外,对于S中的任何像素P,S中连通到该像素的像素集叫作S的连通分量。如果S中仅有一个连通分量,则集合S叫做连通集。3.区域和边界

区域的定义是建立在连通集的基础上的。令R是图像中的一个像素子集,如果R同时是连通集,则称R为一个区域(Region)。

边界(Boundary)的概念是相对于区域而言的。一个区域的边界(或边缘、轮廓)是区域中所有有一个或多个不在区域R中的邻接像素的像素所组成的集合。显然,如果区域R是整幅图像,那么边界就由图像的首行、首列、末行和末列定义。因而,通常情况下,区域指一幅图像的子集,并包括区域的边缘。而区域的边缘(Edge)由具有某些导数值的像素组成,是一个像素及其直接邻域的局部性质,是一个有大小和方向属性的矢量。

边界和边缘是不同的。边界是和区域有关的全局概念,而边缘表示图像函数的局部性质。0.3.2 距离度量的几种方法

基于上一小节提到的相关知识,来理解距离度量的概念。假设对于像素P(x, y)、Q(x, y)、R(x, y)而言,有函数D满足如下3个条件,ppqqrr则函数D可被称为距离函数或度量。

① D(P, Q) ≥0,当且仅当P = Q时,有D(P, Q) = 0

② D(P, Q) = D(Q, P)

③ D(P, Q) ≤D(P, R) + D(R, Q)

常见的几种距离函数如下所示。 ① 欧氏距离  (0-3)

即距离等于r的像素形成的以P为圆心的圆。

② D距离(街区距离)4(0-4)

即距离等于r的像素形成的以P为中心的菱形。

③ D距离(棋盘距离)8        (0-5)

即距离等于r的像素形成的以P为中心的方形。

距离度量参数可以用于对图像特征进行比较和分类或者进行某些像素级操作。最常用的距离度量是欧氏距离,然而在形态学中,也可能使用街区距离和棋盘距离。0.3.3 基本的图像操作

在后续章节中,将涉及各种各样的图像操作,这里就几种最为典型和常用的图像操作着重说明。按照处理图像的数量分类,可以分为对单幅图像操作(如滤波)和对多幅图像操作(如求和、求差和逻辑运算等);按照参与操作的像素范围的不同,可以分为点运算和邻域运算;而根据操作的数学性质,又可以分为线性操作和非线性操作。1.点运算和邻域运算

点运算指的是对图像中的每一个像素逐个进行同样的灰度变换运算。设r和s分别是输入图像f(x, y)和输出图像g(x, y)在任一点(x, y)的灰度值,则点运算可以使用下式定义。

s = T(r)(0-6)

而如果将点运算扩展,对图像中每一个小范围(邻域)内的像素进行灰度变换运算,即称为邻域运算或邻域滤波。这可以使用下式定义。

g(x, y) = T[f(x, y)](0-7)

文章将分别在第3章和第5章介绍点运算和邻域运算。2.线性和非线性操作

令H是一种算子,其输入输出都是图像。若对于任意两幅(或两组)图像F1和F2及任意两个标量a和b都有如下关系成立,

H(aF+bF)=aH(F)+bH(F)1112(0-8)

则称H为线性算子。也即对两幅图像的线性组合应用该算子与分别应用该算子后的图像在进行同样的线性组合所得到的结果相同,也即算子H满足线性性质。同样的,不符合上述定义的算子即为非线性算子,对应的是非线性图像操作。举例来说,滤波中的平均平滑、高斯平滑、梯度锐化等都是线性运算,而中值滤波(详见第5章空间域图像增强)则是非线性的。

线性操作由于其稳定性的特点而在图像处理中占有非常重要的地位。 尽管非线性算子常常也能够提供较好的性能,但它的不可预测性使其在一些如军事图像处理和医学图像处理等严格的应用领域中难以获得广泛的应用。① 熵(Entropy):熵是信息论中用于度量信息量的一个概念。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以,信息熵也可以说是系统有序化程度的一个度量。第1章MATLAB数字图像处理编程基础

MATLAB是Mathworks公司开发的一款工程数学计算软件。不同于C++、Java、FORTRAN等高级编程语言,它们是对机器行为进行描述,而MATLAB是对数学操作进行更直接的描述。MATLAB图像处理工具箱(Image Processing Toolbox,IPT)封装了一系列针对不同图像处理需求的标准算法,它们都是通过直接或间接地调用MATLAB中的矩阵运算和数值运算函数来完成图像处理任务的。1.1 MATLAB R2011a简介

本节将介绍一些MATLAB R2011a中与图像处理密切相关的数据结构及基本操作,如基本文件操作、变量使用、程序流程控制、打开和关闭图像以及图像格式转换和存储方式等。这些都是后续将要学习的图像处理算法的基础。1.1.1 MATLAB软件环境1.软件界面

图1.1所示是运行于32-bit Windows操作系统上的MATLAB R2011a截图。软件主界面由3个子窗口组成,左上为当前工作目录的文件列表,右上方为当前工作区的变量,右下为当前和最近会话的命令历史记录,而中间的主窗口则是命令输入和结果输出区,>>为提示符。图1.1 MATLAB界面2.MATLAB命令与程序

可以在>>提示符后面输入简单的算式(例如5*3-2)或带有函数的算式(例如sin(pi/2)*sqrt(3)/2)并回车,会提示ans=0.8660,这就是MATLAB最基本的计算功能。

这样的输入形式实际上是MATLAB命令,而如果在每行命令的结尾输入半角分号,命令窗口不会立即显示命令执行的结果,而会将结果保存在工作区中。例如下面的命令。>> res = sin(pi/2)*sqrt(3)/2;  % 将计算结果保存至变量res当中

此时,变量res已经存在于工作区中,但是命令窗口不会回显它的值。

另外,也可以在文件菜单下执行“New”→“M-Files”命令来创建一个新的MATLAB文件,在里面输入命令(以半角分号结尾),从而得到一个MATLAB程序。在MATLAB程序中,使用“%”表示注释,其用法和C/C++中的“//”注释符类似。3.跨行语句

MATLAB允许在同一行中输入多条语句,之间用分号隔开。同时,MATLAB还允许将同一条语句分割在多行中书写以方便较长语句的阅读,方法是在行末使用3个半角圆点。例如下面的语句。>> z = 2 .* x +exp( x .^ 2 + y .^ 2 - sqrt(1 - log(x) - log (y) ) )...    - y .* sqrt(t) - x .* sqrt(t);1.1.2 文件操作

默认情况下,MATLAB可以自动搜索到当前目录(Current Directory)和MATLAB的路径变量path中所含有目录下面的文件。对处在这些位置可由MATLAB执行的文件,直接在命令窗口中输入文件名即可运行。如果需要直接运行其他目录下的文件,就要使用addpath和genpath等命令向路径列表中添加路径。1.addpath函数

向path变量中加入指定的目录路径,其原型如下。addpath('dir','dir2','dir3' ...'-flag')

该函数可以接受任意数目的参数。

参数说明:● dir、dir2、dir3等为要加入的目录路径,这些变量必须是绝对路

径;● flag参数可以用来指定函数的行为,它是可选参数,其取值的含

义如表1.1所示。表1.1 addpath函数中flag参数的取值合法取值含  义0或者begin这些路径将被添加到搜索列表的最前面,这些目录中含有的文件将先于原列表中的同名文件被找到从而执行。这往往用于需要修改系统某一命令行为的场合1或者end这些路径将被添加到搜索列表的最后面,原列表中的同名文件将先于这些目录中含有的文件被找到从而执行。这样可以避免用户M文件覆盖系统M文件的功能省略与0或begin相同

可以在使用addpath函数前后查看path变量的内容,以确定添加成功。2.genpath函数

生成包含指定目录下所有子目录的路径变量,其原型如下。p = genpath('directory');

参数说明:● 参数directory为指定的目录。

返回值:● 函数返回包含指定目录本身和其全部子目录的数据。返回值也可

以直接提供给addpath,从而直接添加一个目录及其全部子目录

到当前路径列表中。通过这样的方式可以方便地调用自己的程序

工具箱,例如使用下面的命令将目录“F:\doctor research

\Matlab Work\FaceRec”添加到系统当前路径列表后,就可以直

接调用人脸识别工具箱FaceRec中的任何函数了。>> addpath(genpath('F:\doctor research\Matlab Work\FaceRec'))  %注意这里要使用绝对路径

也可以在运行M文件时使用完整的文件路径,从而避免同名文件的冲突问题,或是从资源管理器中将M文件拖动到MATLAB的命令窗口中直接运行。3.打开与编辑M文件

如果需要编辑某个M文件,可以使用open命令和edit命令,它们的调用形式如下。open filenameedit filename

参数filename为需要打开的文件名。edit命令只能编辑M文件,而open命令可以使用Windows默认操作打开一系列其他类型的文件。1.1.3 在线帮助的使用

在MATLAB中,有以下4种方法获取软件的在线帮助。1.help命令

help命令可以用于查看MATLAB系统或M文件中内置的在线帮助信息。命令格式如下。help command-name

command-name为需要查看在线帮助的命令或函数的名称。例如,想要查看doc命令的使用方法,可在命令提示符下直接输入“help doc”,如图1.2所示。图1.2 help命令界面2.doc命令

doc命令可以用于查看命令或函数的HTML帮助,这种帮助信息可以在帮助浏览器窗口中打开。其调用格式如下。doc function-name

doc命令可提供比help命令更多的信息,还可能包含图片或视频等的多媒体例子,对图像处理工具箱中的函数更是如此。

图1.3所示为在命令行中输入doc imhist命令后出现的帮助示例界面。图1.3 doc命令结果3.lookfor命令

当忘记命令或函数的完整拼写时,可以使用lookfor命令查找当前目录和自动搜索列表下所有名字中含有所查内容的函数或命令。其调用格式如下。lookfor keyword

keyword为指定要查找的关键字。此命令可以给出一个包含指定字符串的函数列表,其中的函数名称为超链接,点击即可查看该函数的在线帮助,如图1.4所示。图1.4 lookfor命令界面4.F1命令打开帮助浏览器

在MATLAB R2011a的主界面中按键盘的“F1”键,弹出如图1.5所示的对话框。图1.5 F1命令界面

单击左下角的“Open Help Browser”链接打开如图1.6所示的帮助浏览器窗口。在左上角的编辑框中输入感兴趣的关键字,单击回车进行查询,右侧会出现相应的帮助信息。

在后面的章节中,如果忘记了曾经提到的命令的含义,建议首先通过在线帮助寻求相关信息,以此增强自学能力。图1.6 Help浏览器界面1.1.4 变量的使用

变量可以保存中间结果和输出数值等信息,MATLAB中变量的命名规则和C/C++等常见的编程语言很类似,同时也对大小写是敏感的。另外,MATLAB中的变量不需要先行定义,但在使用前一定要赋值。1.变量的赋值

可以通过赋值语句来给变量赋值。赋值操作使用等号“=”,例如a=5是给a(注意不是A)这个变量赋值5,如果未定义变量a,会自动定义。在MATLAB中,变量定义时不需要显式地指明类型,Matlab会根据等号右边的值自动确定变量的类型。默认的对数字的存储类型为double型或double型数组,而字符的存储类型为char型,字符串的存储类型为char型数组。

对字符串赋值时,需要用半角单引号“'”括起来(注意不是双引号,也不是任何的全角字符),例如msg='Hello world'。2.内部变量

MATLAB有某些内部变量名和保留字,如表1.2所示。变量命名时不要与它们重名。表1.2 MATLAB内部变量列表特殊变量说  明ans默认的结果输出变量pi圆周率Inf或inf无穷大值,如1/0i和j单位虚数值eps浮点运算的相对精度realmax最大的正浮点数realmin最小的正浮点数NaN或nan不定量,如0/0nargin函数输入参数个数nargout函数输出参数个数lasterr最近的错误信息lastwarning最近的警告信息computer计算机类型versionMATLAB版本3.查看工作区中的变量

使用who和whos命令可以查看所有当前工作区中变量的情况。使用clear或clear all命令可以清除工作区中所有的变量定义,也可以在clear后面加上变量名,清除特定的变量定义。另外,clc命令可以用来清屏,所以这两个命令常常用在M文件的开头用来构造一个干净的工作区。>> a = 1; %定义一个数值型变量a>> str = 'hello'; %定义一个字符串变量(字符数组)>> v = [3 2 1] %定义一个数值型向量v =   3   2   1>> whos Name   Size      Bytes Class   Attributes a     1x1         8 double        str    1x5        10 char         v     1x3        24 double       >> clear all>> whos>>4.数据类型及其转换

MATLAB中的数据类型列表如表1.3所示。表1.3 MATLAB数据类型数据类型说  明doubleMATLAB中最常见也是默认的数据类型,双精度方式存储的浮点数。有308308效范围是-10到10。这同时也是MATLAB所能直接给出的最大数值范围。此种类型占用的内存空间为8字节uint88位无符号整数,范围是0到255。此种类型占用的内存空间为1字节uint1616位无符号整数,范围是0到65 535。此种类型占用的内存空间为2字节uint3232位无符号整数,范围是0到4 294 967 295。此种类型占用的内存空间为4字节uint6464位无符号整数,范围是0到18 446 744 073 709 551 615。此种类型占用的内存空间为8字节int88位有符号整数,范围是-128到127。此种类型占用的内存空间为1字节int1616位有符号整数,范围是-32 768到32 767。此种类型占用的内存空间为2字节int3232位有符号整数,范围是-2 147 483 648到2 147 483 647。此种类型占用的内存空间为4字节int6464位有符号整数,范围是-9 223 372 036 854 775 808到9 223 372 036 854 775 807。此种类型占用的内存空间为8字节3838single单精度浮点数,范围是-10到10。此种类型占用的内存空间为4字节char字符型变量,占用空间为2字节logical布尔型变量,占用空间为1字节。此种类型的转换函数也可以使用boolean,与logical等效

默认情况下,MATLAB将变量存储为双精度浮点数(double),而MATLAB中的很多函数也只接受这种类型的数据。然而,图像处理操作中经常使用到uint8等类型的数据,这就需要执行数据类型的强制转换操作。这种操作很简单,调用格式统一如下。Destination_Var = type_name(Source_Var)

其中,type_name即数据的存储类型,Destination_Var和Source_Var分别为目标变量和原始变量。例如下面的命令将double原始变量a转换为uint8变量b。>> a = 1;>> b = uint8(a);5.读取与保存工作区中的变量

save命令可以将当前工作区的变量以二进制的方式保存到扩展名为MAT的文件中;load命令可以读出这样的文件。它们的调用格式如下。save filename arg1 arg2 arg3, …load filename arg1 arg2 arg3, …● filename参数指定保存或读取变量所使用的文件名。如果不指定

文件名,默认使用的文件是matlab.mat。● arg1、arg2、arg3等参数是需要从文件中存储或读出的变量名。

这两个命令分别可以存储或读取一个或一组变量。

下面的命令将price、age和number三个变量保存到文件MyData.mat中。>> save('MyData.mat', 'price', 'age', 'number')提示也可以不指定变量名,从而将当前工作区中所有的变量一起储存到mat文件或将文件中保存的所有变量一起读入工作区,这个批量保存和读取功能在运行非常耗时的程序时显得十分有用——由于MATLAB执行效率并不高(和Visual C++相比),所以对于一个计算量很大的程序而言,运行几个小时并不稀奇。这时,可以根据需要在希望中断程序时保存程序的所有上下文变量,以备之后随时从中断点开始执行。1.1.5 矩阵的使用1.矩阵的定义

在MATLAB中定义矩阵很简单。可以使用半角分号分隔行与行,使用半角逗号(或者空格)分隔列与列来直接定义矩阵,比如下面的命令就定义了一个3行3列的二维矩阵A。A=[1, 2, 3; 4, 5, 6; 7, 8, 9]A =   1   2   3   4   5   6   7   8   9

还有另一种方式可以生成行向量,[begin:inc:end]会生成从begin开始到end结束,增量为incre的一系列数字组成的向量。如v=[2:1:10]表示生成从2到10的间隔为1的向量(一维矩阵),即:v= [2:1:10]v=   2   3   4   5   6   7   8   9  10

如果间隔为1,也可以忽略中间的参数,直接输入I=[2:10]即可。2.生成特殊矩阵

除直接定义外,可以通过函数生成特定的矩阵,比如eye(n)生成N阶单位阵,zeros(n)生成N阶每个元素均为0的方阵,magic(n)生成N阶幻方阵等。常见的用于生成矩阵的函数列表如表1.4所示。表1.4 生成矩阵的函数函数名称用  途eye产生单位矩阵zeros产生全部元素为0的矩阵ones产生全部元素为1的矩阵true产生全部元素为真的逻辑矩阵false产生全部元素为假的逻辑矩阵rand产生均匀分布随机矩阵randn产生正态分布随机矩阵randperm产生随机排列Linspace产生线性等分的矩阵Logspace产生对数等分向量Company产生伴随矩阵Hadamarb产生Hadamarb矩阵Magic产生幻方矩阵Hilb产生Hilbert矩阵Invhilb产生逆Hilbert矩阵3.获得矩阵大小和维度

size函数可以获得指定数组某一维的大小,可以用来查看图像的高度和宽度以及动态图像的帧数等。其调用方法如下。size(A,dim)● A为需要查看大小的数组;● dim为指定的要查看的维数,这是一个可选参数,若不指定此参

数,返回值为一个包含数组从第一维到最后一维大小的数组。

例如,对于一个3行5列的矩阵B,有size(B, 1)=3,size(B, 2) = 5,size(B) = [3 5]。

函数ndims可以查看数组的维数。调用方式如下。ndims(A)

其中A为需要查看维数的数组。4.访问矩阵元素

访问矩阵的一个元素的方式是在矩阵名字的后面注明行列序号,例如访问A的第3行第2列元素就是A(3,2)。提取矩阵的一整行元素,如要提出A的第2行使用A(2,:),如果是第2列则是A(:,2);而A(:)表示将矩阵按列存储得到一个长列向量。示例如下。>> A=[1, 2, 3; 4, 5, 6; 7, 8, 9] ; %定义矩阵A>> A(1, :) %提取第1行ans =   1   2   3>> A(:, 3) %提取第3列ans =   3   6   9>> A(:)'ans =   1   4   7   2   5   8   3   6   9注意MATLAB中的矩阵下标是从1开始的。对图像矩阵也是一样,所以一个m×n的矩阵实际的下标范围为[1:m]和[1:n]。

对于矩阵A,提取矩阵元素或子块的方法如表1.5所示。表1.5 提取矩阵元素或子块的方法命令片断用  途

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载