图像处理系统基础设计的一个重要特点是测试和实验的有效程度。本书含有配套的函数列表。
一幅图可以定义为一个二维函数f(x,y),x、y是空间坐标,f在任意坐标处的幅度称为图像在该点的亮度或灰度。当x、y和f的幅度值都是有限离散值时,称该图像为数字图像。
数字图像是由有限数量的元素组成,每个元素都有一个特殊的位置和数值,称为图片元素、图像元素和像素。像素是用来定义数字图像的最广泛的术语。
三种类型的计算机化处理:低、中、高级。
·低级处理:原始操作,如图像预处理、对比度增强和图像锐化。特点:输入输出都是图像。
·中级处理:包括诸如分割的任务,将其简化为适合计算机处理的形式,并对单个目标进行分类(识别)。特点:输 入是图像,输出是从图像中提取出的属性。
·高级处理:通过执行通常与人类视觉相关的感知函数来对识别的对象进行总体确认。
MATLAB的典型应用:
·数学和计算
·算法开发
·数据获取
·建模、仿真和原型设计
·数据分析、检测和可视化
·科学和工程图形学
·应用开发,包括GUI界面构建
MATLAB的基本数据元素是矩阵。
·灰度变换与空间滤波
·频率域滤波
·图像复原与重建
·彩色图像处理
·图像压缩
·图像分割
·表示与描述
·综述图像处理工具箱和本书开发的自定义图像处理函数
·讨论MATLAB中GUI的实现
·开发函数时正文中会包含这些自定义函数的代码
是MATLAB的主要工作环境,是针对诸如运行MATLAB命令、观察输出、编辑和管理文件与变量、观察绘画历史等任务的一个图形工具集
使用clear以删除工作空间的所有变量,clc以清除命令窗口的所有内容
主要目的是创建和编辑MATLAB函数与脚本文件,并发布.m文件,生成诸如HTML、LaTeX、Word和PowerPoint等格式的输出。
主要使用MATLAB的帮助浏览器或者使用导航,MathWorks网站也含有相应的帮助
一幅图可以定义为一个二维函数f(x,y),x、y是空间坐标,f在任意坐标处的幅度称为图像在该点的亮度或灰度。当x、y和f的幅度值都是有限离散值时,称该图像为数字图像。灰度级通常指单色图像的亮度。彩色图像是由多幅单色图像组合而成。
图像经采样和量化之后得到的是一个实数矩阵。本书使用两种主要方法表示数字图像。一种是(x,y)坐标法,图像经采样后得到M行N列的图像,则0≤x≤M-1,0≤y≤N-1,整数递增。图像处理工具箱使用另一种,用(r,c)表示行(row)和列(column),原点为(r,c)=(1,1)处,其他和第一种方式相同。
数字图像表示为一个矩阵,等式右边定义的是一幅数字图像,矩阵的每个元素都称为图像元素、图片元素或像素。也可以表示成一个MATLAB矩阵,仅原点发生了平移
使用函数imread将图像读入MATLAB环境中,基本语法为imread(‘filename’)。filename是一个含有图像文件全名的字符串(包括扩展名),读入时要对图像命名一个变量(假定为f)。
使用函数imshow将图像显示在MATLAB桌面上,基本语法为imshow(f)。
若要保留显示第一幅图像并输出第二幅图像,使用 figure,imshow(g) 即可。
图像被函数imwrite写入当前目录,基本语法为imwrite(f,‘filename’),该函数还可以有其他参数,具体取决于被写的文件格式。 仅适用于JPEG图像的一种更为通用的语法为imwrite(f,‘filename.jpg’,‘quality’,q),其中q是介于0~100之间的整数(对于JPEG压缩,数字越小劣化越高)。 仅适用于TIFF图像的一种更通用的语法为imwrite(g,‘filename.tif’,‘compression’,‘parameter’,…,‘resolution’,[colres rowres]),parameter可以为none(无压缩)、packbits(默认用于二值图像)、lwz、deflate、jpeg、ccitt(仅针对二值图像,默认值)、fax3(仅针对二值图像)、fax4之一。数组*[colres rowres]*包含两整数,以点数/单位给出列分辨率和行分辨率(默认[72,72])。使用单个标量res指定分辨率等同于写为[res,res]。
表1.1 MATLAB中用于图像处理的类
名称 | 描述 |
---|---|
double | 双精度浮点数,范围±10^308(8字节/元素) |
single | 单精度浮点数,范围±10^38(4字节/元素) |
uint8 | 无符号8bit整数,范围[0,255](1字节/元素) |
uint16 | 无符号16bit整数,范围[0,65535](2字节/元素) |
uing32 | 无符号32bit整数,范围[0,4294967295](4字节/元素) |
int8 | 有符号8bit整数,范围[-128,127](1字节/元素) |
int16 | 有符号16bit整数,范围[-32768,32767](2字节/元素) |
int32 | 有符号32bit整数,范围[-2147483648,2147483647](4字节/元素) |
char | 字符(2字节/元素) |
logical | 值为0或1(1字节/元素) |
以TIFF或JPEG格式读取图像时常用到uint8和logical类(每像素1字节)。一些动态范围要求大的科学数据源经常使用uint16和int16(每像素2字节)。灰度运算经常使用浮点类double(每元素8字节)和single(每元素4字节)。
支持的图像类型:灰度级图像、二值图像、索引图象、RGB图像。
一幅灰度级图像就是一个数据矩阵,值表示灰度的浓淡。
二值图像在MATLAB中经过logical函数转化为二值图像。
使用函数islogical测试数组是否为logical类,语法:islogical©,若是则返回1,否则0。
使用函数mat2gray将图像转换为标定到范围[0,1]的double类数组,语法g=mat2gray(A,[Amin,Amax])(若A中的值小于Amin则在g中变为0,若A中的值大于Amax则在g中变为1),语法*g=mat2gray(A)*将Amin和Amax的值设置为A中的实际最小值和最大值。
M文件既可以是简单执行一系列MATLAB语句的脚本,又可以是能够接受参量并产生一个或多个输出的函数。
文件组成:函数定义行、H1行、帮助文本、函数体、注释。
函数定义行的形式:function [outputs]=name(inputs) 输出参量在方括号内,输入参量在圆括号内,若只有单个输出参量则不用括号直接列出。
函数可以在命令提示符处调用,也可以作为其他函数的元素(称为子函数)。
H1行是第一个文本行,是函数定义行后面的单独的注释行。函数定义语句和H1行之间可以没有空行或者前导空格。当用户在命令行输入help function_name时H1行是最先出现的文本。输入lookfor keyword就会显示含有字符串keyword的所有H1行。
帮助文本是紧跟在H1行后面的文本块,两者之间没有空行,用于为函数提供注释和在线帮助。输入help function_name就会显示函数定义行和第一个非注释行之间的全部注释行。帮助系统会忽略帮助文本块之后出现的所有注释行。
符号%后的非H1行或者帮助文本的所有行都被认为是函数注释行,并且也不认为是帮助文本块的一部分。代码末尾允许添加注释。
创建或编辑m文件可以使用任何文本编辑器或在命令提示符中输入edit filename即可。
MATLAB使用两种算术运算,矩阵运算按照线性代数规则定义,数组运算则逐个元素执行,且可使用多维数组。句点字符(.)用于区分数组运算和矩阵运算。例如A*B表示矩阵乘法,A.×B表示数组乘法(乘积是与A和B大小相同的数组)。加减运算不使用句点字符。
类似于B=A等表达式时MATLAB将做一个B等于A的“记录”,但并不真的将A的数据复制到B中,除非A在后面发生了变化。
表1.2 数组和矩阵的算术运算符(a和b是标量)
运算符 | 名称 | MATLAB函数 | 注释和例子 |
---|---|---|---|
+ | 数组和矩阵加 | plus(A,B) | a+b、A+B或a+A |
- | 数组和矩阵减 | minus(A,B) | a-b、A-B、A-a或a-A |
.* | 数组乘 | times(A,B) | C=A.×B, C(I,J)=A(I,J)×B(I,J) |
* | 矩阵乘 | mtimes(A,B) | A×B,标准矩阵乘或a*A,标量乘法会乘以A的所有元素 |
./ | 数组右除* | rdivide(A,B) | C=A./B, C(I, J)=A(I, J)/B(I, J) |
.\ | 数组左除* | ldivide(A,B) | C=A.\B, C(I, J)=B(I, J)/A(I, J) |
/ | 矩阵右除 | mrdivide(A,B) | A/B是计算A*inv(B)的首选方法 |
\ | 矩阵左除 | mldivide(A,B) | A\B是计算inv(A)*B的首选方法 |
.^ | 数组乘幂 | power(A,B) | 若C=A.^B,则C(I, J)=A(I, J)*B(I, J) |
^ | 矩阵乘幂 | mpower(A,B) | 见在线帮助 |
.’ | 向量和矩阵转置 | transpose(A) | A.’,标准向量和矩阵的转置 |
’ | 向量和矩阵复共轭转置 | ctranspose(A) | A’,标准向量和矩阵复共轭转置。A是实数时A.’=A’ |
+ | 一元加 | uplus(A) | +A与0+A相同 |
- | 一元减 | uminus(A) | -A与0-A或-1*A相同 |
: | 冒号 | 稍后讨论 |
表1.3 关系运算符
运算符 | 名称 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于 |
~= | 不等于 |
表1.4 逻辑运算符
运算符 | 名称 |
---|---|
& | 对应元素“与” |
| | 对应元素“或” |
~ | 对应元素和标量“非” |
&& | 标量“与” |
|| | 标量“或” |
这些运算符既能对逻辑数据进行运算又能对数值数据进行运算。MATLAB中任意非零数值作为true处理,逻辑0或数值0作为false处理。&和|针对数组运算,分别针对输入的对应元素进行“与”运算和“或”运算;&&和||仅针对标量进行运算,主要用于各种形式的if、while、for循环之中。
表1.5 流程控制语句
语句 | 描述 |
---|---|
if | if、else、elseif一起,执行基于指定逻辑条件的一组语句 |
for | 对一组语句执行规定的次数 |
while | 根据规定的逻辑条件对一组语句执行不确定的次数 |
break | 终止执行for或while循环 |
continue | 将控制传递到for或while循环的下一次迭代,跳过循环体中所有剩余的语句 |
switch | switch、case、otherwise一起,根据规定的值或字符串执行不同的语句组 |
return | 使执行返回到调用函数 |
try…catch | 若在执行过程中检测到错误,则改变流程控制 |
访问元素块可以使用MATLAB中的冒号,如要访问数组v的前三个元素则可以写成v(1:3);也可以访问第三个到最后一个元素,写成v(3:end);也可以用一个向量作为另一个向量的索引,写成v([1 4 5])(输出1、4、5号位的数据);索引并不限于相邻的元素,例如v(1:2:end)(第二个数表示累加的数)。
矩阵运算中选择一整行或一整列元素使用单冒号进行选择。函数sum可以计算其参量的每一列的和,单冒号索引把A变换为列向量,并将结果传递给sum。
逻辑索引具有形式A(D),A是一个数组,D是与A大小相同的逻辑数组。表达式A(D)提取A内与D中1值元素相对应的所有元素。
线性索引表达式使用单一下标来索引矩阵或高维数组。对于一个M×N的矩阵,元素(r,c)可以用单一下标*r+M(c-1)*来访问。
函数句柄是一种MATLAB数据类型,包含引用函数时所用的信息,主要优点可以将函数句柄作为调用中的参量传递给另一个函数。若一个函数句柄携带MATLAB计算一个函数所需要的所有信息,则可使程序变得更容易实现。函数句柄还可以改进重复运算的性能,保存到数据结构或文件中,以备将来使用。
函数句柄分为两种,均使用函数句柄运算符@创建。第一个函数句柄类型时命名(简单)函数句柄,创建方法是在@后面跟一个希望的函数名称,如f=@sin;第二个函数句柄是匿名函数句柄,由代替函数名的MATLAB表达式形成,构建格式为*@(input-argument-list) expression*。
单元数组提供了一种在一个变量名下组合一套对象(如数字、字符、其他单元数组)的方法,包含所用参量的副本,而不包含指向这些参量的指针。
结构类似于单元数组,都可以将不同的数据组合为单个变量,区别是单元的地址由数字寻址,结构的元素则由用户定义的称为字段的名称寻址。字段名任意,但是必须以非数字的字符开始。
方法主要为预分配数组和向量化循环。
预分配是指在进入一个计算数组元素的for循环之前,初始化数组。
MATLAB函数tic和toc可以用于测量函数执行的时间,语法tic; function_name; toc。使用调用的计时函数会使得测量时间产生较大的变化,特别是在命令提示符中使用时。
函数timeit用于得到函数调用的可靠的、可重复的时间测量。
MATLAB中的向量化指使用矩阵/向量运算符、索引技术和现有的MATLAB或工具箱函数来完全消除循环的一种技术。
首先应编写正确且容易理解的代码,然后如果代码运行的不够快,则使用MATLAB Profiler确定可能的故障点。如果故障点是for循环,则在确定没有预分配问题后即可考虑使用向量化技术。