接触Matlab是从大二开始的,但那时对数字信号处理不怎么感兴趣,因此一学期下来,连编写一个最基本的function都不会……
大三开始学习数字图像处理,无奈,只好重拾Matlab。虽然Matlab的交互界面做的很好,Manual尤其强大,但由于基础不好,在写程序时还是不时地被细节问题困扰,因此决定用此文来记录那些让我不胜其烦的细节问题,同时也分享给大家
1.
在进行图像处理时常常会用到图像的长宽像素信息,一般语句为
[M N]=size('figurename');
这里M是图像二维矩阵的行数,N是二维图像的列数。比如下面的图像,是一个5*8大小。学过framebuffer的同学应该知道,对于显示屏,一般的坐标是从左向右是x坐标,从上到下是y坐标,因此对于图像来说N表示的是x方向上的大小,M表示y方向的大小。如果不注意,在进行图像几何变换时要注意。否则常常会把因为习惯问题把M误以为是x方向的,而N是y方向的。
2.关于Matlab中变量的类型问题。在Matlab中,我们处理的是整数坐标,但Matlab中像素值本身并不是整数,在Matlab和IPT为表示像素值所支持的数据类型有以下10种:
①double 8byte/pix
②uint8
1byte/pix
平时我们用imread读出图像时一般都是这个类型的
③uint16 2byte/pix
④uint32 4byte/pix
⑤int8
1byte/pix
⑥int16
2byte/pix
⑦int32
4byte/pix
⑧single 4byte/pix
⑨char
2byte/pix
第十种只有在二值图像中才会用到,即logical类的。logical型虽然只用1bit就可以表示,但在Matlab中却需要占用1byte。为嘛?其实我也不清楚,可能Matlab不能像C一样进行位操作吧。
我们知道,Matlab内部是以double类型进行计算的,因此在初始化一个变量时,如果不指定你要给变量赋什么类型的值,它就默认是double型的。如:
a=1;
则a将占8byte,假如你想把a初始化为一个logical类型的,这这样写:a=logical(1);
用一个变量对另一个变量进行初始化,如果不进行类型转换,则被初始化的变量将和用于初始化的变量的类型一致,看下面的例子:
>> a=uint8([255 255])
a
=
255 255
>> b=a(1)+a(2)
b
=
255
类型转换格式如下:
B=data_class_name(A)
data_class_name可以使以上类型中的任意一种。转换的原则可参照下面的例子
>> a=[256 3 500 -1]
a =
256.00
3.00
500.00
-1.00
>> b=uint8(a);
>> b
b =
255 3
255 0
a是double型的,要转换成uint8型时,大于uint8类型最大值255的就变成255,小于uint8型最小值0的,就变为0,其他不变。
函数islogical用来判断数据是否是logical型的,用法是
islogical(a);
若a为logical的,则返回1,否为为0
图像类和类型间的转换函数主要有:
名称:
输出类型:
输入类型
im2uint8
uint8
logical,uint8,uint16,double
im2uint16
uint16
logical,uint8,uint16,double
mat2gray
double(在0到1之间)
double
im2double
double
logical,uint8,uint16,double
im2bw
logical
uint8,uint16,double
用法直接查看Manual就好。
3. 对数组的索引
直接上例子>> a=[1 2;4 3]
a =
1.00
2.00
4.00
3.00
>> a(1:end)
ans =
1.00
4.00
2.00
3.00
>> a(:)
ans =
1.00
4.00
2.00
3.00
没错:a(1:end)产生行向量,a(:)产生列向量
其实a(:)有一个很重要的用法,就是对一个数组进行重新变为a的形状。前提是两者元素数量相等。
例子:
a =
0
0
0
0
0
0
>> b=[1 2 3 4 5 6]
b =
1.00
2.00
3.00
4.00
5.00
6.00
>> a(:)=b
a =
1.00
3.00
5.00
2.00
4.00
6.00
b不限于向量,也可以是3*2的数组。
4.Matlab中句柄的使用
句柄是什么?没学过Windows编程,因此对句柄的理解也停留在字面上。百度百科上这样解释:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的。相反,WINDOWS
API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
在《WINDOWS编程短平快》(南京大学出版社)一书中是这么说的:句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
从上面的2个定义中我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。
对于matlab下的句柄使用,也是从百度知道上了解到的:
比如定义f(x)=x^2,可以写为
f=@(x)(x.^2)
其中@(x)(x.^2)就是匿名函数,第一个括号里面是自变量,第二个括号里面是表达式,@是函数指针
f=@(x)(x.^2)表示将匿名函数@(x)(x.^2)赋值给f,于是f就表示该函数。
于是f(2)=2.^2=4;f(1:3)=[1:3].^2=[1 4 9]等等
定义匿名函数时也可以调用别的匿名函数,比如
f1=@(x,y)(x.^2+y.^2)
定义了函数x^2+y^2
f2=@(t)(f1(t,2))
定义了函数t^2+4
f3=@(x)(f1(x(1),x(2)))
定义了函数x(1)^2+x(2)^2
使用匿名函数时一定要注意函数本身的参数形式,如
f1(2,3)
表示2^2+3^2
f2(3)=3
表示3^2+4
f3([1,2])
表示1^2+2^2
说白了就是函数指针
ps:这里还是有点晕,句柄到底是不是函数指针?
1、
matlab函数bwareaopen──删除小面积对象
|
格式:BW2 =
bwareaopen(BW,P,conn)
作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。
算法:
(1)Determine the connected components.
L = bwlabeln(BW, conn);
(2)Compute the area of each component.
S = regionprops(L, 'Area');
(3)Remove small objects.
bw2 = ismember(L, find([S.Area] >= P));
|
2、matlab函数bwarea──计算对象面积
格式:total = bwarea(BW)
作用:估计二值图像中对象的面积。
注:该面积和二值图像中对象的像素数目不一定相等。
3、matlab函数imclearborder──边界对象抑制
|
格式:IM2 =
imclearborder(IM,conn)
作用:抑制和图像边界相连的亮对象。若IM是二值图,imclearborder将删除和图像边界相连的对象。默认情况conn=8。
注:For grayscale images, imclearborder tends to reduce the overall
intensity level in addition to suppressing border structures.
算法:
(1)Mask image is the input image.
(2)Marker image is zero everywhere except along the border, where
it equals the mask image.
|
|
4、matlab函数bwboundaries──获取对象轮廓
格式:B =
bwboundaries(BW,conn)(基本格式)
作用:获取二值图中对象的轮廓,和OpenCV中cvFindContours函数功能类似。B是一个P×1的cell数组,P为对象个数,每个cell是Q×2的矩阵,对应于对象轮廓像素的坐标。
5、matlab函数imregionalmin──获取极小值区域
|
格式:BW =
imregionalmin(I,conn)
作用:寻找图像I的极小值区域(regional maxima),默认情况conn=8。
Regional minima are connected components of pixels with a constant
intensity value, and whose external boundary pixels all have a
higher value.
|
|
6、matlab函数bwulterode──距离变换的极大值
格式:BW2 =
bwulterode(BW,method,conn)
作用:终极腐蚀。寻找二值图像BW的距离变换图的区域极大值(regional
maxima)。用于距离变换的距离默认为euclidean,连通性为8邻域。
7、regionprops统计被标记的区域的面积分布,显示区域总数。
函数regionprops语法规则为:STATS =
regionprops(L,properties) 该函数用来测量标注矩阵L中每一个标注区域的一系列属性。
L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。
返回值STATS是一个 长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。
Properties可以是由逗号分割的字符串列表、包含字符 串的单元数组、单个字符串'all'或者'basic'。如果properties等于字符串'all',则表4.1中的度量数据都将被计算;如果properties等于字符串'basic',则属性:'Area','Centroid'和'BoundingBox'将被计算。表1就是所有有效的属性字符串。
表1 属性字符串列表
|
properties值
|
度量图像区域的属性或功能
|
|
'Area'
|
图像各个区域中像素总个数
|
|
'BoundingBox'
|
包含相应区域的最小矩形
|
|
'Centroid'
|
每个区域的质心(重心)
|
|
'MajorAxisLength'
|
与区域具有相同标准二阶中心矩的椭圆的长轴长度(像素意义下)
|
|
'MinorAxisLength'
|
与区域具有相同标准二阶中心矩的椭圆的短轴长度(像素意义下)
|
|
'Eccentricity'
|
与区域具有相同标准二阶中心矩的椭圆的离心率(可作为特征)
|
|
'Orientation'
|
与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)
|
|
'Image'
|
与某区域具有相同大小的逻辑矩阵
|
|
'FilledImage'
|
与某区域具有相同大小的填充逻辑矩阵
|
|
'FilledArea'
|
填充区域图像中的on像素个数
|
|
'ConvexHull'
|
包含某区域的最小凸多边形
|
|
'ConvexImage'
|
画出上述区域最小凸多边形
|
|
'ConvexArea'
|
填充区域凸多边形图像中的on像素个数
|
|
'EulerNumber'
|
几何拓扑中的一个拓扑不变量——欧拉数
|
|
'Extrema'
|
八方向区域极值点
|
|
'EquivDiameter'
|
与区域具有相同面积的圆的直径
|
|
'Solidity'
|
同时在区域和其最小凸多边形中的像素比例
|
|
'Extent'
|
同时在区域和其最小边界矩形中的像素比例
|
|
'PixelIdxList'
|
存储区域像素的索引下标
|
|
'PixelList'
|
存储上述索引对应的像素坐标
|
|