16 教字图像处理(MATLAB版) 分排率为300dpi的新图像与原图像完全一致,只是其450×450像素分布在1.5×1.5英寸的 区域内。这样的过程在打印文档时控剿图像的大小而不牺牲其分排率是非常有用的。 通常,有必要将图像按它们在MATLAB桌面.上显示的那样输出到磁盘中。对于下一章将要讲 到的绘图,更应如此。图形窗口的内容可以按两种方法输出到磁盘。第一种方法是在图形窗口的( 下拉菜单(见图2.2)中选择Export,使用这一选项,用户可以选释保存路径、文件名以及文件格 式。使用print命令可以获得更多的输出参数: print -fno -dfileformat -rresno filename 其中,no是感兴趣的图形窗口的图形第号,f红2 eformat是表2.l中的-种文件格式,resno是 单位为dpi的分辨率,f11 ename是我们希望为文件指定的文件名。例如,要将图2.2所示图形窗 口的内容以300dpi的分辨率输出到-个名为hi_xes_xose的tif文件中,可以键入 >print-f1-dtiff-1300 hi_res_rose 该命令会把文件hi res_.rose发送到当前目录中 若在命令行中简单地键人Pxit,则MATLAB会(使用默认的打印机)打印上一个显示的图 形窗口的内容。也可以指定prit的其他选项,如某个指定的打印设备。 2.5数据类 虽然我们处理的是整数坐标,但MATLAB中的像素值本身并不是整数。表2.2中列出了 MATLAB和PT为表示像素值所支持的各种数据类。表中的前8项称为数值数据类,第9项称为 字符类,最后一项称为逻辑数据类。 MATLAB中所有的数值计算都可用doub1e类来进行,所以它也是图像处理应用中最常使用 的数据类。u1t8数据类也是一种频繁使用的数据类,尤其是在从存储设备中读取数据时,因为8 比特图像是实际中最常用的图像。logica1类和使用较少的uint16类构成了本书集中讨论的基 础数据类。但是,很多PT函数都支持表2.2中列出的所有数据类。doub1e数据类需要使用8个 字节来表示一个数字,而uint8和int8只需要1个字节,uint16和int16需要2个字节,uint32, int32和single则需要4个字节。char数据类用来表示Unicode字符。一个字符串就是一个1×n 字符矩昨。10g1ca1类矩阵中每个元素的取值只能是0和1,并且每个元素都用1字节存储在存储 器中。逻辑矩阵的创建可通过函数1og1ca1(见2.62节)或相关的运算符来实现(见2.10.2节)。 表2.2数据类。前8项称为数值数据类,第9项称为宇符类,最后一项称为逻辑数据类 名称 双精度浮点数,花围为-10m一10四(8比特每像素) 王8比特整数,芯图为[0255](1比特每像素) 的[0.65535](2比特每像素) 有符号8比 年9 67295:4 比特每象素) int16 有符号6比特.为 int32 有符号32比特整数.范园为 single 单精度浮点数,范闲为-10一10,(4比特每像家) cha 字符(2比待每像素。 logical 值为0或1(1比特每像素) 语留给图像使用】 常互换地使用术语“数据炎”和“数据类型”。本书中,如2.6节讨论的那样,我们把“类型”术
第2章基本原理 17 2.6图像类型 工具箱支持以下4种图像类型: ●亮度图像(Intensity images) ●二值图像(Binary images) ·索引图像(Indexed images) ●RGB图像(RGB images) 大多数单色图像的处理运算是通过二值图像或亮度图像来进行的,所以我们首先重点研究这两 种图像。素引图像和RGB图像将在第6章中讨论。 2.6.1亮度图像 一幅亮度图像是一个数据矩阵,其归一化的取值表示亮度。若亮度图像的像素都是uit8类 或uint16类,则它们的整数值范围分别是0,255]和0,655351。若图像是doub1e类,则像素的 取值就是浮点数。规定双精度型归一化亮度图像的取值范围是0,]。 2.6.2二值图像 二值图像在MATLAB中具有非常特殊的意义。一幅二值图像是一个取值只有O和1的逻辑数 组。因而,一个取值只包含0和1的uit8类数组,在MATLAB中并不认为是二值图像。使用 1og1ca1函数可以把数值数组转换为二值数组。因此,若A是一个由0和1构成的数值数组,则可 使用如下语句创建一个逻辑数组B: B-logical(A) 若A中含有除了0和1之外的其他元素,则使用1 ogica1函数就可以将所有非零的量变换为逻辑1, 而将所有的0值变换为逐辑0。使用关系和逻辑运算符也可以创建逻辑数组(见2,10.2节)。 要测试-个数组是否为逻辑数组,可以使用函数islog1ca1: islogical(c) 若c是逻辑数组,则该函数返回1:否则,返回0。使用27.1节所讨论的数据类转换函数,可将逻 辑数组转换为数值数组。 2.6.3术语注释 前两节用了大量的笔墨来阐明术语“数据类”和“图像类型”。通常,在我们提到一幅图像时, 是指一幅“data_class image_typel图像",其中的data_clas3s是表2.2中的类之一,而image_yp 则是本节开始时定义的图像类型之一。因此,一幅图像的特性是由数据类和图像类型这两者来表征 的。例如,“uint8亮度图像”表示一幅像素都是uint8数据类的亮度图像。工具箱中的有些函数 支持所有的数据类,而有些函数只支持特殊的数据类。例如,前面提到的二值图像中的像素只能是 1 ogica1数据类。 27数据类与图像类型间的转换 在PT应用中,数据类与图像类型间的转换是非常频繁的操作。在数据类间转换时,记住表2.2 中详细列出的每种数据类的取值范围是很重要的
18 数字图豫处理(MATLAB版) 2.7.1数据类间的转换 数据类间的转换相当直接。通用的语法为 B=data_class_name(A) 其中,data_class_name可以是表2.2中第一列的任何一项。例如,假设A是-个uint8类数 组,则命令B=doub1e(A)会产生一个双精度数组B。这种转换贯穿全书,因为MATLAB希望数 值计算中的所有操作数都是双精度浮点数。假设℃是一个取值范围为0,255](很有可能包含小数) 的double类数组,则命令D=uint8(c)可将其转换为一个uint8类数组。 若一个doub1e类数组包含有区间0,255]之外的值,则在使用上述方法将其转换成u1nt8类 数组时,MATLAB会将所有小于0的值转换为0,所有大于255的值转换为255,而在0和255之 间的值将全部舍去小数部分转换为整数.因此,在将doub1e类数组转换成uint8类数组之前,有 必要先对其进行适当的缩放,以使其元素的取值尽量在区间0.255)内。如2.6.2节中提到的那样,在 将任何数值数据类转换为1 ogica.1类时,数组中的所有非0值将转换为逻辑1,0值将转换为逻辑0。 2.7.2图像类和类型间的转换 工具箱中提供了执行必要缩放的函数(见表2.3),以在图像类和类型间进行转换。函数 1m2uint8可以检测出输入的数据类,并进行所有必要的缩放,以便使工具箱能将这些数据识别为 有效的图像数据。例如,考下面这个doub1e类2×2图像f,它可以是中间计算的结果: f -0.50.5 0.751.5 执行转换 >g-im2uint8(f) 得出结果 g 128 191 255 可以看出,函数1m2u1t8将输人中所有小于0的值设置为0,而将输入中所有大于1的值设置为 255,再将所有的其他值乘以255。将得到的结果四舍五人为最接近的整数后,就完成了转换。注 意,im2uint8的舍入行为与前一节中讨论的数据类转换函数uint8是不一样的,后者只是简单 地将小数部分金部舍夫】 中进行国像类和类型间的转换的雨数。适用于彩色图像的李 将输入转换为 有效的第入闲像数据类 uint8 logical,uint8,uint16double im2uint16 uint16 logical,uint8,uint16double mat2gray doab1o,范围c,11 donble im2double double logical,vint8,vint16 double im2bw logical uint8,uint16和doub1e 要把一个doub1e类的任意数组转换成取值范围为0,)的归一化double类数组,可以通过 函数mat2gray完成,其基本语法为
20 数字图像处里(MATLAB版) 转换为一幅这样的二值图像,即原图像中的1和2变为0,其余两个值变为1。首先,我们济 原图像的取值范国变换为区同0,: >>g-mat2gray(f) 0.3333 0.6667 1.0000 然后,我们使用阚值0.6将其转换为二值图像: -nwg.6 00 11 正如在25节中提到的那样,我们可以使用关系运算符(见210.2节)直接生成一个二值数组 这样,我们就可使用如下语句衍到相同的果: gb 我们可以使用函数1s1og1ca1将gb是一个逻辑数组的事实存储为一个变量(如gbv方 b)假设我们现在要将gb转换为一个值为0和1的doub1e类数值数组。实现的方法如下: 00 11 若gD是一个uint8类数值数组,则对其使用函数im2 double可以得到取值为 0.00390.0039 的数组,因为函数im2doub1e会将所有的元素都除以255。这在前面的转挽中都没有出现过, 因为那时函数im2doub1e检测到输入是一个值只能为0和1的逻拜数组。若输入是一个uint8 类数值数组,则在保持其值为0和]的前提下要将它转换为d0ub1e类数组,可以使用如下语 向完成: 06 1 最后要指出的是,MATLAB支持丧套语句。固此,上述对图像f产生相同结果的所有操作,可 只用单行语句 >gbd =im2double(im2bw (mat2gray(f),0.6));
第2章基本原理 21 来完成,浅者使用这些函数的部分组合来完成。当然,在这种情况下,整个过程也可以用一条 更简单的命令实现: >gbd double(t>2); 这又一次证明了MATLAB语言的简洁性。 2.8数组索引 MATLAB支持大量功能强大的索引方案,这些素引方案不仅简化了数组操作,而且提高了程 序的运行效率。本节将讨论并举例说明一维和二维〔向量和矩阵)的基本素引。后面的讨论将根据 需要介绍更复杂的技术。 2.8.1向量索引 如我们在2,12节中讨论的那样,维数为1×N的数组称为行向蟹。行向量中元素的存取是使 用一维索引进行的,因此,v(1)是向景v的第一个元素,V(2)是第二个元素,依次类推,MATLAB 中向量的元素使用方括号括起,并由空格或逗号隔开。例如, >v=[135791 V 3579 >v(2 使用转置运算符(,)可将行向量转换为列向量: >w-v, 1 9 要存取元素的数据块,我们可使用MATLAB的冒号。例如,要存取v的前三个元素,可使用 语句 >v(1:3) ans- 135 类似地,也可以使用如下语句存取第二个到第四个元素: 357 或使用如下语句存取第三个到最后一个元素: >>v(3:end) ans 579-