第2章基本原理 29 乘积是与A和B大小相同的数组,其每个元素都是A和B中相应元素的乘积。换言之,若C=A.*B, 则C(杠,J)=A(I,J)*B(红,J)。由于对加法和诚法来说,矩阵运算和数组运算是相同的,所以不 使用字符对+和.- 在编写如B=A这样的表达式时,MATLAB将做一个B等于A的“记录”,但实际上并不 将数据复制到B,除非在程序中A的内容以后有了变化。这一点很重要,因为使用不同的变量 来“存储”相同的内容有时可以增强代码的清晰性和可读性。因此,在编写MATLAB代码时 一定要记住MATLAB不复制信息这一功能。表2.4列出了MATLAB的算术运算符,其中A与B 是矩阵或数组,a与b是标量。所有的操作数可以是实数或复数。若操作数是标量,则数组运算 符中的小圆点可以省略。记住,图像是等价于矩阵的二维数组,因此,表中的所有运算符都适用 于图像。 表2.4数组和矩阵算术运算符。涉及这些运算符的计算可使用运算符本身实现】 如A+B,或使用所示的MALAB函数实现,如plus(A,B)。 为数组录 示的示例使用矩阵来简化表示, 但它们可很窖易地扩展到高维形 算符 名 MATLAB 注释和示例 组和拖阵加 plus (A,B a+b,A+B或a+A 数组和矩阵城 minus (A,B) a-b,A=B,A-a或a-A 效组束 tim阳s(A,B) C=A.*B.C(I,J)-A(I.JI*B(I.J) 矩阵乘 mtimes (A,B) *B,即标准矩阵乘:或aA,即一个标量乘 以A的所有元素 数组右除 rdivide (A.B) C-A/B.CILJ=AILJ/RIT.T 数组左除 ldivide (B) C-A.\B.CULJ)=BULJ)/AULJ) 矩阵右除 mrdivide (a B A/B与A1nv(B}大致相,具体取决于计算精 矩阵左险 midivide (A.B) A1日与inv(a*B大致相同,具体取决于计 数组求摇 power [A.B) 矩阵良延 (A.B 该运算符的讨论请参间在线帮助 向量和矩阵转置 e 标准的向量 和矩库转置 向量和矩阵复北转 ctranspose(A 的量共转。当人是实时 A 元和 uplus (A +A与0+A相问 uminus (A) A与0-A或-1*A相同 冒号 详见2.8节的讨论 表2.51PT支持的图像算术函数 石的 两银图像相加或把常数加到图像 imsubtract 两幅图像相球或从图像中减去常数 immultiply 两幅图像相乘,其中相乘是在相应的像察对间进行的:或图像乘以一个常数 individe 两银图像相除,其中相酴是在相应的像素对间进行的,或图像除以一个常数 imabsdiff 计算两相因像间的绝对差 imcomplertent 对困像求补,参见32.1节 imlincomb 计算两幅或多摄图像的线性组合。示例请参阅53.1节 工具箱支持表2.5中列出的图像算术函数。尽管这些函数可以使用MATLAB算术运算符直接 实现,但使用PT函数的优点在于它们支持整数数据类,而等同的MATLAB数学运算符要求输人 是double类数据
30 数字图像处理(MATLAB版) 后面的例2.6用到了函数max和m1n。前者的语法形式有如下几种 ax() C max (A. 【J,dim IC,I]=max(...) 在第一种形式中,若A是一个向量,则max(A)返回其最大元素;若A是一个矩阵,则max(A)将 A的列作为向量来处理,并返回 一个包含了每列最大值的行向量。在第二种形式中,max《A,B) 返回一个与A和B大小相同的数组,该数组由A与B中最大的元素组成。在第三种形式中, max(A,【】,dim)返回沿标量dim指定的A的维度上的最大元素。例如,max(a,【,l)产生的 是A的第一维(行)上的最大值。最后,C,]=max(·)会找出A的最大值的索引,并将它们返 回到输出向量工中。若有几个相等的最大值,则返回找到的第一个最大值的素引。圆点表示使用的 语法是前三种形式的右侧这一。函数m1n的语法形式与函数max的语法形式类似 例2.6算术运算特与函数max和m1n的示例 假设我们要篇写一个称为faproc的M函数,该函数的功能是将两幅输入图像相乘,并输出 像的乘积、乘积的最大值与最小值以及一幅归一化的乘积像(其取值范国为0,1])。使用 文本编辑器,我们可写出期望的函数,如下所示: function [p,pmax,pmin,pn]-improd(f,g) &IMPROD Computes the product of two images. 【P,pMAx,PNTN,PN】。IMPROD(E,G)outputs the element-by element product of two input images,F and G,the product minimum values,and a normalized product array with the range[o,l】.The mages must be of the same of class uint8,unit16,or double.The outputs fd double(f); gd double(g); fd.*gd; max(p(: (P) 注意,输入图像是使用函数double而不是函数im2doub1e来转换为doub1e类困像的。因 为,若输入是uint8类图像,则函数1m2 double会将它们转换到苑围0,1]。微定我们想将 原始值的乘积放在P中。为得到一个取值范为0,刂的归一化数组P,我们可以使用函数 mat2gray。还要注意单个冒号索引的使用,讲见2.8节中的讨论。 假设£=[12:341,g=[12:21]。在提示符处键入上迷函数可以得到如下输出: >【p,pmax,pmin,pn=improd(f,g) 14 64 pmax ①在MAT八B文献中,在指函数名和参量时,在H1行和帮助文本中常常使用大写字母,以是免程序名或变量与通 芳的解释性文本相混滑
第2章基本原理 31 6 pmin= 1 pn 1.000 0.600 0.6000 在提示特处缄入nelp1 mprod可以得到如下输出: >help improd the element produc t of two in ment-by maximum and minimum value and m12d values in the range [0,1].The input images must be of the same size.They can be of class uint8,unit16,or double.The outputs are of class double. 关系运算符 表2.6列出了MATLAB的关系运算符。这些运算符可以对相同维数的数组中的相应元素进行 比较,或逐个元素地进行比较。 例27关系运算符 尽管关系运算将的关健应用是在210.3节讨论的流控制中(如在1上语句中),但这里还是简单 地演示一下这些运算符是怎祥真接用于数组的。考虑下面的输入和输出序列: 2A123影456:789 123 456 >B=024:356:349】 B- 024 2>A =B ans 819 001 可以看到,运算符A■=日生成一个与A和B维数相同的逻样数组,当A与B的相应元素匹配 时,新数组中的相应位置取1,其余位置取0。考虑另一个例子,语句 >A>=B 111 生成一个辽林数组,当A的元素大于或等于B的相应元素时,新数组中的相应位置取1,其余 位置取0
数字图像处理(MATLAB版) 表2.6关系运算符 还真符 名称 小于 G= 小厅等于 大于 大于等于 等于 不等于 对于向量和炬形数组,两个操作数必须有相同的维数,或者其中一个操作数是标量。此时, MATLAB将这个标量与另-一个操作数的每一个元素相比较,产生 个与操作数 大小相同的逻辑数 组,在满足指定关系的位置取1,其余位置取0。若两个操作数都是标量,则当指定关系满足时结 果为1,否则为0。 逻辑运算符与函数 表2.7列出了MATLAB的逻辑运算符,且下面的例子说明了其中一些运算符的性质。不同于 逻辑运算符的通用描述,表27中的运算符既能作用于逻辑数据又能作用于数值数据。在所有的 逻辑测试中,MATLAB将逻辑1或非零数值量作为true来处理,将逻辑0和数值0作为Ea1se 来处理。例如,当两个操作数都为逻辑1或非零数值时,两个操作数AND运算的结果为1;当两 个操作数中的任何一个是逻辑0或数值0时,或两个操作数都为逻辑0或数值0时,AND运算的 结果为0。 表2.7逻,运算符 运算符 名称 AND(与) OR(或) NOT(非) 例2.8逻样运算杆 考虑下面两个数值数组的AND运算: >A=[120;045]: >日=1-230111 >>A&B ans 日9 可以看出,AND运算符产生一个与输入戴组大小相同的逻样数组,并在两个输入数组相应揉作 戴都为非零值的位置取1,其他位置取0。像前面一样,每次运算都在输入数组的相应位置的 一对操作数上进行。 OR运算符的使用方式与AND运算特的使用方式类似。当两个操作数中任何一个为逻辑1或非 零数值时,或两个操作数都为逻辑1或非零数字时,OR运算表达式的值为tuxe;否则为false. OT运算符只作用于个输入。逻辑上,若一个操作数为ture,则NOT选算符会将其转换为 false。当特0T作用于数值数据时,所有非零操作数将变为0,零操作数变为1。 MATLAB也支持表2.8中总结的逻辑函数。在编程中,函数al1与any是非常有用的
第2章基本原理 33 例2.9逻锌函教 考虑简单的数组A=[123;456]与B=[0-11;002】。将表2.8中的函教作用于这 两个数组,可得到如下结果 >xor(A,B) ans■ 100 0 >a11a ans 1 1 >any (A) an 111 >a11(B) ans-0 1 >>any(B) ans 011 表2.8逻相函数 函数 注释 x0r(异或) 若两个操作数逻上不同,则函数×0r返回1:否则,返回0 a11 世1:否,返回0 any 若个向量中的仟何元素都非。则函数ay返回1;香财,返回0。该函数在矩阵中按列揉作 仔细观黎函数a11与ay是如何作用于A和B的列的。例如,由al1(B)产生的向量的前两 个元素为0,因为B的前两列中每一列都至少含有一个0:最后一个元素为1,因为B的最后一 列的所有元素都非零。 除了表2.8中列出的函数,MATLAB还提供了很多其他的函数,这些函数可以检测到特殊条件 或特殊值的存在并返回逻辑的结果。表2.9列出了一些这样的函数。其中一小部分涉及到了本章前 面提到的一些术语和概念(如2.6,2节中的1s1og1ca1函数):其他的函数将在后面的时论中用 到。记住,表2.9中列出的函数在条件满足时将返回逻辑1,否则将返回逻辑0。当变量是数组时, 表2.9中的一些函数会产生一个与输人变量大小相同的数组,在满足函数条件的位置取逻辑1,其 他位置取逻辑0。例如,假设A=12;31/0],函数1 stinite(A)会返回矩阵11:10],该 矩阵中的0(假)表示A的最后一个元素不是有限值。 表2.9在变量为ture或fa1se时,根据数值或条件返回逻辑1成0的某些函数 丽数 描米 iacelc) 若C是单元数组,则为真 iscellatrta) 若s是字符串单元数组,则为真 igchar(a) 若。是字符串,则为真 ig合otvi1 若A是空数组[】」 叫为直 iseal ta 若和B有相国的元 isfield(S,'name') 若n3 结物令的 若数组A的元素有限,则为直