2.5 MATLAB控制语句
2.5.1 循环结构
1、for 语句
一般表达式为:
for 循环控制变量=表达式1:表达式2:表达式3
语句
end
一般情况,表达式1为循环初值,表达式2为循环增量,表达式3为循环终值。循环增量可以是正数也可以是负数,当没有指定循环增量时,系统默认为1。for语句可以嵌套使用。
for语句的循环控制变量还可以是数组表达式,表达式如下:
for 循环控制变量=数组表达式
语句
end
2、while 语句
while 关系表达式
语句
end
2.5.2 选择结构
1、if 语句
if 表达式
语句1
else
语句2
end
判断关键字if后关系表达式或逻辑表达式返回值为逻辑真,则执行语句1;如果为逻辑假,执行语句2;如果为算术表达式,则认为返回值非零为真,返回值是0为假。
if 表达式1
语句1
else
if 表达式2
语句2
else
…
if 表达式n
语句n
else
语句n+1
end
end
...
end
if 表达式1
语句1
elseif 表达式2
语句2
......
elseif 表达式n
语句n
else
语句n+1
end
2、switch 语句
switch 表达式
case 表达式1
语句1
case 表达式2
语句2
….
case 表达式n
语句n
otherwise
语句n+1
end
判断switch 关键字后的表达式值,如与表达式1相等执行语句1,如与表达式2相等则执行语句2,依次类推,如与n个表达式都不相同则执行语句n+1后跳出switch语句。
3、try 语句
try
语句1
catch
语句2
end
try是一个错误捕获语句,程序先执行语句1,如果没有错误,则跳出 try语句;如果语句1出错,则执行语句2。
2.5.3 程序流程控制
- break 语句:可以从本次循环中跳出循环体,执行结束语句end 的下一条语句。
- return语句:终止被调用函数的运行,返回到调用函数。
- pause 语句:若其调用格式为 pause,则暂停程序运行,按任意键继续;若调用格式为pause(n),则程序哲停运行n秒后继续;调用格式为pause on/off,允许/禁止其后的程序暂停。
- continuc语句:可以结束本次循环,将跳过其后的循环体语句,进行下一次循环。
2.6 MATLAB的m文件
2.6.1 m文件的分类
- 脚本文件:不接受输入参数,也不返回输出参数,文件执行过程中产生的所有变量都存储在工作空间中。
- 函数文件:可以接受输入参数,也可以有返回值,文件执行过程中产生的局部变量在文件执行完毕后自动释放,不保存在工作空间中。
1、脚本文件
2、函数文件
函数文件可以从外部接受输入参数,运行结束后返回输出参数。文件的名称和函数名称必须一致。函数文件中的变量(除殊声明外)均为局部变量,这些变量单独存放在函数工作区内,不与MATLAB工作空间相互覆盖,函数执行完毕后即刻释放。工作空间内只存放输入和输出参数。
2.7 MATLAB图形可视化
2.7.2 二维图形绘制
函数plot()的具体调用格式如下:
- plot(x):该函数当x为一维向量时,以该向量元素的下标为横坐标,x为纵坐标绘制一条曲线;当x为矩阵时,以该矩阵元素的“行下标”为横坐标,矩阵元素的值为纵坐标绘制多条曲线;当x为复数组成的向量时,以复数的实部为横坐标,以复数的虚部为纵坐标绘制二维曲线。
- plot(x, y):该函数当x和y为同维向量,以x为横坐标,y为纵坐标的逐点连接的一条曲线。当x是向量,y是矩阵,向量x的维数与矩阵y的行数或列数相等,以x为横坐标的绘制多条不同颜色的曲线,曲线的条数等于的y维数。当x和y是同维的矩阵时,以矩阵x列元素为横坐标、矩阵y列元素为纵坐标分别绘制曲线,曲线条数等于矩阵的列数。
- plot(x1,y1, x2, y2,...):该函数在同一图形窗口中绘制多组曲线,各组之间没有相互关联。
2.7.3 图形的修饰
1、选择图形窗口设置
MATLAB提供了函数figure( )用来打开不同的图形窗口,具体调用格式如下:
figure(1); figure(2);…; figure(n):该函数用来同时打开多个图形窗口,以便在不同
窗口中绘制不同的图形。
MATLAB提供函数subplot( )用来分割同一个图形窗口,具体调用格式如下:
subplot(m,n, p):该函数将当前窗口分割为m×n个图形区域,m为分割行数,n为分割列数,p为子图形编号,在不同的图形区域可以以独立的坐标系绘制图形,其简化形式为subplot(mnp)。
2、线型、顶点和颜色的设置
在函数plot( )调用时,MATLAB会自动对线型、顶点和颜色进行设置,用户也可以根据需要对线型、顶点和颜色自行设置。
3、坐标轴的设置
MATLAB在绘制图形的同时会自动选择合适的坐标轴,也提供函数axis( )设置用户自定义坐标轴,具体调用格式如下:
- axis( [xmin xmax ymin ymax] ):该函数中[xmin xmax ymin ymax]定义二维图形x轴和y轴坐标轴的范围,其中必须满足: xmin
- axis cqual:该函数将横轴和纵轴单位长度设置相同。
- axis square:该函数设置坐标轴为正方形。
- axis normal:该函数解除对坐标轴的任何限制。
- axis off:该函数取消坐标轴的一切设置。
- axis on:该函数恢复坐标轴的一切设置。
4、图形标注的设置
- title('string'):该函数在图形的最上端设置当前图形的标题为字符串string。
- xlabel('string'):该函数在图形的最下端设置图形横轴的标题为字符串string。
- legend('string1' , 'string2',...):该函数在屏幕上开启小视窗,添加图例,根据绘图的顺序依次给出各个图形的描述。
- text(x,y, 'string'):该函数在二维平面的指定坐标(x, y)处添加文本标注,文本的内容为字符串 string。
- gtext('string'):该函数通过单击鼠标来确定文本的位置,文本的内容为字符串stringo
5、棚格的设置
- grid:该函数给图形加上栅格,不带参数时,在grid on和grid off之间进行切换。
- grid on:该函数给当前坐标系添加坐标网格。
- grid off:该函数从当前坐标系中删去坐标网格。
- grid minor:该函数设置网格线间的间距。
6、图形叠加设置
MATLAB在默认情况下,绘制第二条曲线时,若没有叠加设置,则第一条曲线就会被第二条曲线所覆盖,不会两条曲线绘制在同一图形窗口下。为了在一张图中绘制多条曲线,及多次叠加绘制曲线,MATLAB提供了函数hold(),具体调用格式如下。
- hold on:该函数将当前曲线与坐标保持在屏幕上,同时在这个坐标系中画出另一个图形。
- hold off:该函数将旧图用新图覆盖。
- hold:该函数在 hold on和 hold off之间进行切换。
2.7.4 特殊图形的绘制
1、直方图绘制
MATLAB提供了函数hist( )绘制直方图,具体调用格式如下。
- hist(y):该函数将y的取值范围分成等差的10段,然后将所有元素分类到这10段中,根据每段元素个数绘制直方图的高度。
- hist(y,n):该函数将y的取值范围分成n段,根据n个区域进行统计画图。
- hist(y,x):该函数将y的取值分成等差的 length(x)份,将y中的元素放到各个分段中,然后由x中元素指定的位置为中心的直方图。
2、柱状图绘制
MATLAB提供函数bar( )和 barh( )绘制柱状图,具体调用格式如下。
- bar(x,y)或barh(x,y):该函数在指定的横坐标x上画出y,参数x为单调增加的。如果y为矩阵,则将每个行向量画出。
3、等高线绘制
MATLAB提供函数contour( )绘制等高线图,函数 contourf( )绘制经过填充的等高线图,具体调用格式如下。
- contour(z):该函数绘制矩阵z的等高线。
- contour(x,y,z):该函数在指定坐标(x,y)下,画出矩阵z的等高线。
- contour(z,n):该函数绘制n条等高线。
- contour(x,y,z,[v v]):该函数绘制高度为v的等高线。
第3章 MATLAB图像处理基础
3.1 图像处理工具箱
打开图像处理工具箱的方式:在 MATLAB界面的窗口菜单栏中选中Help选项,选择Products Help或者Demos选项,然后会弹出Help窗口,在左侧边栏中找到ImageProcessing Toolbox 即为图像处理工具箱。
3.2 图像类型的转换
图像类型:索引色图像、二值图像、灰度图像、真彩色(RGB)图像、数据矩阵
3.2.1 RGB图像转换为灰度图像
- X=rgb2gray(A):该函数是将RGB 图像A转换为灰度图像X,其中A表示RGB图像,X表示转换后的灰度图像。
- newmap=rgb2gray(map):该函数是将彩色颜色映射表map转化成灰度颜色映射表。其中,map代表原图像的颜色映射表,newmap 代表转换后的图像颜色映射表。
注:如果输入的是真彩色图像,则可以是uint8或者double类型,输出图像与输入图像类型相同。如果输入的是颜色映射表,则输入和输出都是double类型。
3.2.2 RGB图像转换为索引图像
- [X,map]=rgb2ind(Ⅰ,tol):该函数是利用均匀量化的方法将 RGB 图像转换为索引图像。其中,Ⅰ就是原RGB图像,tol 的范围是从0.0至1.0,[X,map]对应生成的索引图像,map包含至少个颜色。
- [X,map]=rgb2ind(Ⅰ,N):该函数是利用最小方差量化的方法,将RGB图像转换为索引图像。其中,Ⅰ就是原RGB图像,[X,map]对应生成的索引图像,map中包含至少N个颜色。
- X=rgb2ind(Ⅰ,map):该函数是通过与 RGB中最相近的颜色进行匹配生成颜色映射表map,将 RGB 图像转换为索引色图像。其中,Ⅰ就是原RGB图像,[X,map]对应生成的索引图像,map中的颜色是与RGB图像中颜色匹配最相近的颜色。
- [..] = rgb2ind(...,dither_option):该函数是通过参数dither_option来设置图像转换是否进行颜色抖动,dither_option取值为dither则表示抖动,从而可以达到更好的颜色效果;该参数项默认取值为nodither,表示不进行抖动。该格式中“...”表示根据显示任务的不同可以采取上面介绍的某种格式。
3.2.3 灰度图像转换为索引图像
- [X,map]=gray2ind(Ⅰ,n):该函数是将灰度图像Ⅰ转换为索引图像,其中Ⅰ指的是原灰度图像,n是灰度级数,默认值为64,[X,map]对应转换后的索引图像,map 中对应的颜色值为颜色图gray(n)中的颜色值。
- [X,map]=gray2ind(BW,n):该函数是将二值图像BW转换为索引图像,其中Ⅰ指的是二值图像,n是灰度级数,默认值为2,[X,map]对应转换后的索引图像,map中对应的颜色值为颜色图 gray(n)中的颜色值。二值图像实际上也是灰度图像,只是其灰度级为2而已。
- l=grayslice(G,n):该函数是将灰度图像中像素灰度均匀量化为n个等级并转换为索引色图像。其中G表示灰度图像,n表示灰度级,I表示转换后的索引图像。
- l=grayslice(G,v):该函数是将灰度图像按照阈值矢量v进行值域划分并转换为索引色图像。其中G表示灰度图像,v中每一个元素都在0和1之间,I表示转换后的索引图像。
3.2.4 索引图像转换为灰度图像
- I=ind2gray(X,map):该函数是将具有颜色映射表map 的索引图像转换为灰度图像,去除了索引图像中的颜色、饱和度信息,保留了图像的亮度信息。其中[X,map]对应索引图像,I表示转换后的灰度图像。输入图像的数据类型可以是 double型或uint8型,但输出为double型。
3.2.5 索引图像转换为RGB图像
- RGB=ind2rgb(X,map):该函数是将索引图像[X,map]转换为RGB图像,其中[X,map]指向索引图像,RGB指向转换后的真彩色图像。转换过程中形成一个三维数组,然后将索引图像的颜色映射表中的颜色值赋值给三维数组。输入图像的数据类型可以是double型、uint8型或uint16型,输出为double 型。
3.2.6 二值图像的转换
在MATLAB中,二值图像中的数据类型实际上是logical 型, 0代表黑色、1代表白色,所以二值图像实际上是一幅“黑白”图像。那么,将其他图像转换为二值图像,首先必须规定一个规则,即将其他数组中哪些数据变为1,哪些数据变为0。常用的方法是“阅值法”,它是确定一 个國值,小于阙值就取为0,其他的全部取为1。在MATLAB中,实现这一功能的函数为im2bw(), 其调用格式根据转换的原图像不同而各有差异。如果输入的不是灰度图像,则先将其转换为灰度图像,然后通过阈值法转换为二值图像。二值图像中只有黑白两种灰度值。
1、将灰度图像转换为二值图像
- BW=im2bw(Ⅰ,level):该函数是通过设置成值参数level,将灰度图像转换为二值图像。其中Ⅰ为灰度图像,level 为设置的阈值参数,取值范围为[0,1],BW是转换后的二值图像。level 值较小,则会出现背景区域与目标区域混淆;level值较大,则会丢失部分目标信息。
2、将索引图像转换为二值图像
- BW=im2bw(X,map,level):该函数是通过设置阈值参数level,将索引色图像转换为二值图像。其中[X,map]代表索引图像,参数 level 设置阈值水平,取值范围[0,1],BW代表二值图像。
3、将RGB图像转换为二值图像
- BW=im2bw(Ⅰ,level):该函数是通过设置阈值参数 level,将 RGB图像转换为二值图像。其中Ⅰ代表RGB 图像,参数level设置阈值水平,取值范围[0,1],BW代表二值图像。
3.2.7 数值矩阵转换为灰度图像
在 MATLAB中,一个数据矩阵就相当于一幅数字图像,只是在数字图像中对应的数组元素必须在一定的取值范围,因此,只要将对应数据矩阵中的元素按一定规律进行转换,就可以将矩阵转换为图像了。在MATLAB中可以利用函数 mat2gray( ),将一个数据矩阵转换为一幅灰度图像,其调用格式如下。
- l=mat2gray(X,[ xmin, xmax]):该函数是按照指定的取值区间[xmin,xmax]将数据矩阵X转换为灰度图像I。xmin对应灰度值0,即黑色,xmax对应灰度值1,即白色。数据矩阵中小于xmin的值取为0,大于xmax的值取为1。如果不指定取值区间[xmin,xmax],即默认情况下,将数据矩阵X中的最小值设为xmin,最大值设为xmax。
3.3 图像文件的读写
3.3.2图像文件的读取
1、常见图像格式读取
- I=imread('filename','fmt')或者('filename.fmt'):该函数是用于读取字符串 filename指定的灰度图像和真彩色图像文件。其中 filename是文件名,fmt是文件扩展名或文件格式。如果该文件不在当前路径下,或者在MATLAB路径下,那么需要写出完整的路径。如果读取的是灰度图像,则Ⅰ是一个M×N的二维数组;如果读取的是彩色图像,则Ⅰ是一个M×N×3的三维数组。数组Ⅰ的数据类型由图像文件的数据类型决定。一般而言,彩色图像数据使用RGB的颜色空间类型。此外,也可以使用CIELAB、ICCLAB和 CMYK等颜色空间。如果一幅彩色图像使用CMYK颜色空间,则返回的矩阵Ⅰ将是一个M×N×4的数组。
- [X,map]=imread('filename', 'fmt')或者('filename.fmt'):该函数是读取字符串 filename指定的索引图像文件。其中X用于存储索引图像数据,即对应颜色映射表的“映射序号值”,map用于存储与该索引图像相关的颜色映射表。
- [...]=imread('filename'):该函数是在执行图像读取操作时,首先需要从图像文件filename的内容推断其图像类型,即 imread()参数中没有给出图像文件的类型fmt,而是需要推断得到。而该语句左边“[...]”表示根据待读取的图像数据是真实像素值,还是索引图像的相应颜色映射表的序号值,而分别采用格式1和格式2中的不同形式。
- [...]=imread(URL,...):该函数是读取Internet URL的图像文件,URL要求其必须包含协议类型,例如 http://。该语句中 imrcad()函数的第二个参数即是所要读取的Internet URL。语句左边的形式同格式3。
2、特殊图像格式读取
- [...]=imread('filename',idx):该函数是只针对包含多幅图像的文件,例如 ico、tif、cur、gif等格式的文件。该格式实现的功能是读取相应文件中的第几幅图像,或者多幅图像。其中idx是一个整数或者整型向量。例如 idx=3,那么imread将读取该文件中的第3幅图像;如果idx=1∶5,那么读取的将是文件中的前5幅图像。如果IDX为默认值,则只读取第1幅图像。
- [...]=imread(....,'frames',idx):该函数是只适用于读取GIF格式图像文件。它与格式[...]=imread('filename', idx)功能基本上相同,两者的区别是前者的idx的取值可以是all,在这种情况下,该格式将读取图像文件中的所有帧图像,并且按照在文件中的存储顺序返回。
- [...]=imread(... "BackgroundColor',BG):该函数是只适用于PNG文件的读取,其功能是将透明的像素与指定的颜色进行合成。其中 BG的形式取决于文件是否包含一个索引、强度(灰度)或RGB图像。如果 BG为none,将不进行合成。如果输入图像是索引图像,BG将是取值范围为[1,P]内的整数,其中Р是颜色映射表的长度;如果输入图像是灰度图像,BG应该是在[0,1]的范围内的整数;如果输入图像是RGB图像,BG应该是一个三元素的向量,每一个元素的取值在[0,1]范围内。
- [...]=imread('filename',ref):该函数是只用于HDF文件的读取,只读取 HDF文件中多幅图像中的一幅,其中 ref是一个整数,用来确定要读取图像的参考编号。(注意,一个HDF 文件中的参考号不一定对应图像在文件中的顺序,你可以用imfinfo搭配参考编号与图像顺序相匹配。)例如,读取一幅HDF 文件中的第3幅图像,对应该图像的参考编号ref不一定为3,其 MATLAB代码为:info=imfinfo('hdffile.hdf "); [X,map]=imread('hdf_file.hdf ',info(3).Reference);该代码执行时先读取HDF文件中的信息,存放在 info 中,然后调用函数imread(),设置参数为ref 为info(3).Rcfcrcncc,这样就将HDF中的第三幅图像读取出来并存放在[X,map]中。
- [...]=imread(.., 'Param1', valuc1,'Param2', value2,..):该函数是使用参数/值对控制读取操作。如表3.3和表3.4列出了TIFF 和JPEG图像格式文件可以使用的参数。
3.3.3 图像文件的保存
- imwrite(Ⅰ, 'filename", 'fmt'):该函数是把图像数据Ⅰ保存到由字符串 filename指定的文件中,存储的文件格式由 fmt指定。与函数 imread( )使用类似,如果所指定的保存文件 filename不在当前目录下或MATLAB的目录下,则必须指明其完整路径。fmt的取值必须是MATLAB所支持的图像文件格式。图像数据Ⅰ不能为空,如果Ⅰ为灰度图像,那么Ⅰ应该是一个MXN的二维数组;如果Ⅰ为彩色图像,那么I应该是一个M×N×3的三维数组。如果fmt指定的格式为TIFF,那么函数imwrite( )可以接受M×N×4的三维数组。
- imwrite(X,map, 'filename', 'fmt'):该函数是用于保存索引色图像,其中X表示索引色图像数据矩阵,map表示与其关联的颜色映射表,filename为保存的文件名,fmt为文件的保存格式。如果X是uint8或uint16类型的数组,函数imwrite( )将数组中的实际数据按相同的类型保存在文件 filename中,前提是所保存的文件格式必须支持uint8或 uint16的数据类型,否则会出错。在 MATLAB中支持16位图像的存储的文件格式有PNG和 TIFF。如果X是double类型的数组,函数 imwrite( )采用uint8(X-1)表示数组中的值并写入到文件filename 中。颜色映射表map必须是MATLAB所支持的颜色映射表类型。
- imwrite(... 'filename'):该函数是将图像保存到文件中时,从filename的扩展名中推断图像的文件格式,该扩展名要求必颈是MATLAB所支持的类型。函数 imwrite( )中在 filename之前的参数“...”与前面提到的格式是相同的调用方式。
- imwrite(...,'Param1', Val1,'Param2','Val2',...):该函数是用于在保存HDF、JPEG、PBM、PGM、PPM、PNG、RAS、GIF和TIFF等类型文件时指定某些参数值。例如,在保存JPEG文件时,可以存储品质(Quality)、注释(Comment)、模式(Mode)和像素位数(BitDepth)等参数;在保存 HDF 文件时,可以指定图像的压缩性(Compression)、品质( Quality)和写入模式( WriteMode)。不同的文件格式所保存的参数不同,用户可以参考帮助文档中的相关介绍。例如,imwrite(I,'trecs.png', ' BitDepth',8)其含义是将图像Ⅰ保存在文件“trees.png”中,并且给参数BitDcpth赋值为8。