22 数字图像处理(MATLAB版) 其中,end表示向量中的最后一个元素。若v是一个向量,则 >>v(:) 产生一个列向量,而语句 >>v(1:end) 产生一个行向量 素引并不限于连续的元素。例如, >v(1:2:end) ans 159 注意,符号1:2:e表示索引从1开始计数,步长为2,直到最后个元素时停止。步长也可以为负: >v(end:-2:1) 这时,索引从最后一个元素开始计数,步长为-2,直到第一个元素时停止。 函数linspace的语法为 x-linspace(a,b,n) 该语句产生一个含有n个元素的行向量x,这个元素之间线性地隔开并且包含a与b。后续章节 会在一些地方使用到该函数。 一个向量也可用做另一个向量的素引。例如,我们可以使用如下命令挑出向量v的第一个、第 四个和第五个元素: >v(1451) ans 179 就像下一节所示的那样,使用一个向量作为另一个向量的索引这种功能,在矩阵索引中起着非常重 要的作用。 2.8.2矩阵索引 在MATLAB中,矩阵可以很方便地用一列被方括号括起并用分号隔开的行向量表示。例如 >A=[123:456:789] 显示了3×3矩阵 A- 注意,此处分号的作用,与前面提到的取消命令行的输出或在一行中写入多条命令时所用分号的作 用是不同的。 从矩阵中选取元素和从向量中选取元素是一样的,但我们现在需要两个索弘:一个用于确定行 位置,另一个用于确定相应的列位置。例如,要提取第2行第3列的元素,可使用语句
第2章基本原理 25 583 9 使用单个下标存储A可直接对该列索引。例如,A(3)存取的是列中的第三个值,即数字7:A(8) 存取的是第8个值,即数字6,如此等等。当我们使用这个列符号时,表示我们正简单地对所有元素 A(1:en)寻址。这种类型的素引是为优化程序而使循环向量化的基本成分,详见2.10.4节中的讨论。 例2.5使用数组索引进行简单的图像禁作 图2.6(a)是一幅大小为1024×1024的u1nt8类亮度圈像f。图2.6b)是孩图像经过如下语句 操作后垂直翻转的图像: fp=flend:-1:1,:) 图2.6C)所示的图像是图像a)中的一部分,由以下语句获得: >Ef257:768,257:768): 类似地,图2.6©是使用如下语句进行二次取样后得到的图像: >fs-f(1:2:end,1:2:end): 最后,围2.6c)显示了通过图2.6)中部的一条水平扫描线,它是使用如下语句得到的 >p1ot(f512,:) 函数p1ot将在3.31节中详细讨论 50 (c) 00204006008001000 图2.6使用数组索引得到的结果:(a)原图像:b垂直翻转的图像:(©)裁剪 后的图像:(d二次取样后的图像:(e)通过图(a)中间的水平扫描线
26 数字困绿处理(MATLAB版) 2.8.3选择数组的维数 本书中频繁地使用了形如 operation(A,dim) 的操作,operation表示MATLAB中的一种可用操作,A是一个数组,dim是一个标量。例如! 假设A是一个大小为M×N的数组。命令 >k=s1ze(A,1): 沿A的第一个维数(在MATLAB中定义为垂直方向)给出A的大小。换言之,该命令给出A的行 数。类似地,数组的第二个维数为水平方向,所以语句size(,2)给出A的列数。单-一维数是任 意维数dim,且s1ze(a,dim)=1。使用这些概念,我们可将例2.5中的最后一条命令写为 >p1ot(f(s1ze(f,1)12,:) MATLAB并不限制数组的维数,因此,以任何一个维数来提取某个数组的分量就成为了一个 重要的特性。大部分情况下,我们只处理二维数组,但有时(如处理彩色图像或者多谱段图像时)》 需要将图像“堆叠”到第工维或更高维上去。这些内容将会在第6章、第11章和第12章中详细解 释。函数ndims的语法为 d-ndims(A) 它将给出数组A的维数。函数nims返回的值不会小于2,因为即使是标量,我们也认为它有两个 维数,这时的标量是大小为1×1的数组。 2.9一些重要的标准数组 在开发期间,用一些简单的图像数组来检验算法并测试函数的语法常常是很有用的。本节将分 绍7种数组生成函数,这些函数将在后面的章节中用到。在下面的任何一个函数中,若只包含一个 参量,则结果将是一个方阵。 ●zeros(M,N)生成-个大小为MxN的double类矩阵,其元素均为0。 ●ones(M,N)生或一个大小为M×N的doub1e类矩阵,其元素均为1。 ●ture(M,N)生成个大小为M×N的1 ogica1类矩阵,其元素为1。 ●false(M,N)生成一个大小为M×N的1 ogica1.类矩阵,其元素为0。 ●magic(M生成一个大小为M×N的“魔术方阵”。在该方阵中,每一行中的元素之和、每 一列中的元素之和以及主对角线中的元素之和均相等。魔术方阵可用于测试目的,因为它们 易于生成,且其元素均为整数。 ●rand(M,N)生成一个大小为M×N的矩阵,矩阵中的元素都是在区间O,1]中均匀分布的随 机数。 ●randn(M,N)生成-个大小为M×N的矩阵,矩阵中的元素是正态分布(如高斯分布)的随 机数,随机数的均值为0,方差为1。 例如 A5”ore.(,3
第2章基本原理 27 555 >magic(3) ans- 49 B cand(2,4) 0.2311 0.4860 0.7621 0.0185 0.60680.8913 0.45650.8214 2.10M函数编程简介 图像处理工具箱最强大的特在之一是其对MATLAB箱程环境的透明访问。MATLAB函数编程 非常灵活,并且非常容易学习,随着我们学习的深人,这一特性将会很快呈现。 2.10.1M文件 MATLAB中的M文件可以是简单执行一系列MATLAB语句的脚本,也可以是接受变量并产 生一个或多个输出的函数。本节重点介绍M文件函数。这些函数将MATLAB和IPT的功能扩展到 了寻址用户定义的特定应用。 M文件由文本编辑器创建,并以filename,m形式的文件名存储,如average,m和filter,ma M文件函数的组成部分为 ·函数定义行 ●H1行 ●帮助文本 ●函数体 ·命令 函数定义行的形式为 function【outputs】=name(1 nputs) 例如,计算两幅图像的和与积(两个不同的输出)的函数的形式为 function [s,pl-sumprod(f,g) 其中E和g是输人图像,s是和图像,P是积图像。名称sumprod可任意定义,但字function必 须出现在左侧,如上所示。注意,输出变量必须位于方括号内,而输入变量必须位于圆括号内。若 函数只有单个输出变量,则也可不使用括号而直接列出。若函数没有输出,则只需要使用字 function,.而无须括号或等号。函数名必须以字母开头,后而可以跟字母、数字、下划线的任意 组合,但不允许有空格。MATLAB可以识别长达63个字符的函数名,超过此长度的字符将被忽略。 函数可以在命令提示符处调用;例如, >【s,p】=sumprod(E,g):
28 数字用像处理(MATLAB版) 也可以用做其他函数的元素,此时的函数就成为了子函数。正如前一段提到的那样,若输出只有 个变量,则也可不使用括号,例如 >y-sum(x); H1行是第一个文本行。它是单个注释行,其前面为函数定义行。H1行与函数定义行间无空行 或前导空格。H1行的 一个例子为 SUMPROD Computes the sum and product of two images. 如我们在1.7.3节中提到的那样,当用户在MATLAB提示符处键人 >help function_name 时,HI行是最先出现的文本。此外,该节还提到健人lookfor keyword会显示出所有含有字符 串keywor的Hl行。该行提供了关于M文件的重要摘要信息,所以应尽可能地描述它。 帮助文本是紧跟在H1行后面的文本块,二者之间无空行。帮助文本用来为函数提供注释或在 线帮助。当用户在提示符处键人help function_name时,MATLAB会显示函数定义行和第 个非注释(可执行或空白的)行之间的全部注释行。帮助系统会忽略帮助文本块后的任何注释行。 函数体包含了所有执行计算并给输出变量赋值的MATLAB代码。MATLAB代码的几个例子将 在本章后面给出。 符号“%”后面非H山行或帮助文本的所有行可看做是函数注释行,它们不是帮助文本的一部 分。代码行的末尾可附加注释。 M文件可以使用任何文本编辑器创建和编辑,并以扩展名,m保存到指定的目录下,一般会保 存在MATLAB搜素路径中。创建M文件的另一种方法是在提示符处使用edit函数。例如,若文 件存在于MATLAB搜索路径的目录中或者在当前目录中,则键入 >edit sumprod 会打开文件sumprod.m并进行编辑。若找不到该文件,MATLAB会为用户提供创建该文件的选 项。如17.2节中提到的那样,MATLAB编辑器窗口有很多下拉菜单,可以完成诸如保存文件、查 看文件以及调试文件等任务。由于文本编辑器可以执行一些简单的检查并使用不同的颜色来区分各 种代码元素,所以建议用户在写M文件或编辑M文件时使用该文本编辑器, 2.10.2运算符 MATLAB运算符可以分为以下三种主要类别: ·执行数值计算的算术运算符 ●在数量上比较操作数的关系运算符 ●执行函数AND、OR和NOT的逻辑运算符 本节的剩余部分将讨论这些运算符。 镜术污算符 MATLAB有两种不同类型的算术运算符。矩阵算术运算符由线性代数的规测定义。数组算术 运算符可以逐个元素地执行,并且可以用于多维数组。句点(圆点)字符(,)用来区分数组运算 符与矩阵运算符。例如,A*B表示传统意义上的矩阵乘法,而A.*B则表示数组乘法,这种乘法的