Matlab图像处理函数:regionprops
这⾥给出在Matlab图像处理⼯具箱中⾮常重要的⼀个图像分析函数:regionprops。顾名思义:它的⽤途是get the properties of region,即⽤来度量图像区域属性的函数。
语法
STATS = regionprops(L,properties)
描述
测量标注矩阵L中每⼀个标注区域的⼀系列属性。L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。返回值STATS是⼀个长度为max(L(:))的结构数组,结构数组的相应域定义了每⼀个区域相应属性下的度量。properties 可以是由逗号分割的字符串列表、饱含字符串的单元数组、单个字符串 'all' 或者 'basic'。如果 properties 等于字符串 'all',则所有下述字串列表中的度量数据都将被计算,如果 properties 没有指定或者等于 'basic',则属
性: 'Area', 'Centroid', 和 'BoundingBox' 将被计算。下⾯的列表就是所有有效的属性字符串,它们⼤⼩写敏感并且可以缩写。
属性字符串列表Area EquivDiameter MajorAxisLength
BoundingBox EulerNumber MinorAxisLength
Centroid Extent Orientation
ConvexArea Extrema PixelIdxList
ConvexHull FilledArea PixelList
ConvexImage FilledImage Solidity
Eccentricity Image
属性详细定义
本部分将结合⼀个具体的例⼦说明各种字串相关属性的意义,矩阵取⾃在蚁蛉模式识别中做过预处理后的斑纹分割图像,如下图:
这是⼀幅⼆值图像,在应⽤regionprops函数之前必须将其标注,可以调⽤ bwlabel函数和伪彩⾊处理,标注后的图像如下图:
下⾯基于以上的材料来考察属性的含义。
'Area'
是标量,计算出在图像各个区域中像素总个数。注意:这个数值可能与由函数 bwarea 计算的值有轻微的不同。对于这样⼀个数值,我们可以使⽤它除以整个图像区域的像素个数⽽得到斑纹⽐例,可以作为模式识别的候选特征,并且这个特征是仿射不变的。在本例中最后计算出的⾯积向量是
[3.8952,9.7213,17.663,3.5762,1.3432,1.6958,0.41974,0.41974,21.625,12.324,4.8187,1.5111]/10000.
'BoundingBox'
是1⾏ndims(L)*2列的向量,即包含相应区域的最⼩矩形。BoundingBox 形式为 [ul_corner width],这⾥ ul_corner 以 [x y z ...] 的坐标形式给出边界盒⼦的左上
⾓、boxwidth 以 [x_width y_width ...] 形式指出边界盒⼦沿着每个维数⽅向的长度。本例的各部分区域最⼩矩形如下图!注意:请在这熟悉⼀下函数rectangle的使⽤⽅法。
'Centroid'
是1⾏ndims(L)列的向量,给出每个区域的质⼼(重⼼)。注意:Centroid 的第⼀个元素是重⼼⽔平坐标(x坐标)、第⼆个元素是重⼼垂直坐标(y坐标)。Centroid 所有其它
元素则按照维顺序排列。下图采⽤以中⼼为圆⼼的⼩圆来演⽰质⼼检测的效果:
图中各质⼼坐标(标准化后的)依次为:
(x,y)= 0.10478, 0.76739 0.11883, 0.081545 0.19586, 0.61092 0.30701, 0.30807 0.65712, 0.31613 0.73165, 0.30531 0.74548, 0.35378 0.80624, 0.72802 0.84546, 0.61564 0.90554, 0.079574 0.93477, 0 'MajorAxisLength'
是标量,与区域具有相同标准⼆阶中⼼矩的椭圆的长轴长度(像素意义下)。本属性只⽀持⼆维标注矩阵。
'MinorAxisLength'
是标量,与区域具有相同标准⼆阶中⼼矩的椭圆的短轴长度(像素意义下)。本属性只⽀持⼆维标注矩阵。
'Eccentricity'
是标量,与区域具有相同标准⼆阶中⼼矩的椭圆的离⼼率(可作为特征)。本属性只⽀持⼆维标注矩阵。
'Orientation'
是标量,与区域具有相同标准⼆阶中⼼矩的椭圆的长轴与x轴的交⾓(度)。本属性只⽀持⼆维标注矩阵。
本例的各区域椭圆数据为:长轴:18.767,45.172,43.003,30.687,16.505,15.698,5.8833,5.8833,46.954,38.873,22.929,15.429 短
轴:16.211,26.079,32.709,9.8458,6.8019,8.6386,5.8833,5.8833,35.976,31.022,16.98,7.8038 离⼼
率:0.50387,0.81652,0.6492,0.94713,0.91114,0.83497,0,0,0.64262,0.60262,0.67205,0.86266 ⽅向⾓:-29.219,-32.192,-9.3909,-50.904,-
70.333,48.823,0,0,14.035,17.986,3.0319,-34.238
我们可以考察离⼼率的变化趋势,得到对于整个区域中的各区域的似圆性如何的⼤致感觉,⽐如下图是12个区域的离⼼率变化情形:
由上图可以看出区域整体的似圆性并不好,实际上可以考虑使⽤离⼼率向量作为⼀个模式识别的特征!!
'Image'
⼆值图像,与某区域具有相同⼤⼩的逻辑矩阵。你可以⽤这个属性直接将每个⼦区域提取出来,然后再作相应的处理!⽐如本例的第⼀个斑纹区域提出后是:
'FilledImage'
与上相同,唯⼀区别是这是个做了填充的逻辑矩阵!
本例中和上⾯的没有区别,只有区域有空洞时才有明显差别。
'FilledArea'
是标量,填充区域图像中的 on 像素个数。
'ConvexHull'
是p⾏2列的矩阵,包含某区域的最⼩凸多边形。此矩阵的每⼀⾏存储此多边形⼀个顶点的xy坐标。此属性只⽀持2维标注矩阵。例如:本例中的所有⼦区域的最⼩凸多边形图形
如下图
'ConvexImage'
⼆值图像,⽤来画出上述的区域最⼩凸多边形。同时此凸包内的像素均打开,图像尺⼨和此区域对应边界矩形相同。此属性只⽀持2维标注矩阵。例如:本例中的第2个⼦区域的最⼩凸多边形图形为
。注意:此处函数roipoly很有⽤!
'ConvexArea'
是标量,填充区域凸多边形图像中的 on 像素个数。
'EulerNumber'
是标量,⼏何拓扑中的⼀个拓扑不变量--欧拉数,等于图像中⽬标个数减去这些⽬标中空洞的个数。此属性只⽀持2维标注矩阵。本例中的欧拉数均为1。
'Extrema'
8⾏2列矩阵,⼋⽅向区域极值点。矩阵每⾏存储这些点的xy坐标,向量格式为 [top-left top-right right-top right-bottom bottom-right bottom-left left-bottom left-top]。此属性只⽀
持2维标注矩阵。
'EquivDiameter'
是标量,等价直径:与区域具有相同⾯积的圆的直径。计算公式为:sqrt(4*Area/pi)。. 此属性只⽀持2维标注矩阵。本例标准化后的12区域直径向量为:
[2.227,3.5182,4.7423,2.1339,1.3077,1.4694,0.73105,0.73105,5.2473,3.9612,2.477,1.3871]/100.
'Solidity'
是标量,同时在区域和其最⼩凸多边形中的像素⽐例。计算公式为:Area/ConvexArea,这也是个仿射特征,实际上反映出区域的固靠性程度。此属性只⽀持2维标注矩阵。本例12区域凸元素⽐例向量为:
[0.97071,0.66171,0.90846,0.86585,0.84211,0.94393,1,1,0.9096,0.75514,0.90823,0.94737].
'Extent'
是标量,同时在区域和其最⼩边界矩形中的像素⽐例。计算公式为:Area除以边界矩形⾯积,这也是个仿射特征,实际上反映出区域的扩展范围程度。此属性只⽀持2维标注矩阵。不再给出计算结果!!
'PixelIdxList'
p元向量,存储区域像素的索引下标。
'PixelList'
p⾏ndims(L)列矩阵,存储上述索引对应的像素坐标。
⽀持类
输⼊的标注矩阵L可以有任意的数值类型。
提醒
使⽤逗号分割列表语法
当你基于regionprops函数的输出作算法设计时,使⽤逗号分割列表语法就凸显出其⾮常的价值。例如:对于⼀个存储标量的属性,可以利⽤此语法创建⼀个包含图像中不同区域内此属性值的向量。例如以下两句是等价的:
stats(1).Area, stats(2).Area, ..., stats(end).Area
stats.Area
因此,可以使⽤下⾯的⽅法创建相应的向量:
regionprops(L,'Area'); allArea = [stats.Area];
allArea 就是⼀个与结构数组 stats 具备相同长度的向量。
基于特定原则的区域选择
当你要基于特定准则条件选择某个区域时,将函数 ismember 和 regionprops 联合使⽤是很有⽤处的。例如:创建⼀个只包含⾯积⼤于80的⼆值图像,⽤以下命令
idx = find([stats.Area] > 80); BW2 = ismember(L,idx);
ismember解释:
a=[1 2 3 4 5];
b=[3 2 5 6 7 8 77 44 3];
[tf index]=ismember(a,b); %判断a中的元素有没有在b中出现
tf =
0    1    1    0    1
index =
0    2    9    0    3
%tf返回⼀个和a同样⼤⼩的矩阵,a的元素在b中出现,tf上的相应位置元素值为1,没有出现则为0;index也是返回⼀个和a同样⼤⼩的矩阵,其相应位置的值为a相应位置的元素在b中出现的最后标号,注意是最后的标号,若某元素在b中出现多次,则记录的是最后⼀次出现的标号,若该位置上的a的元素没有在b中出现,则返回0. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
计算性能考虑
⼤多数的属性测量计算时间都⾮常地少,除了那些⾮常依赖于图像L中区域个数和像素个数的属性。例如:
'ConvexHull' 'ConvexImage' 'ConvexArea' 'FilledImage'
另外建议⼀次性计算所有属性值,因为分开计算和⼀起计算时间相差⽆⼏!
使⽤⼆值图像⼯作
在调⽤regionprops之前必须将⼆值图像转变为标注矩阵。两个函数可以做到:
L = bwlabel(BW); L = double(BW);
注意:虽然这两个函数从同⼀⼆值图像产⽣不同的标注矩阵,但是它们是等效的!例如:给出如下的⼆值矩阵BW,
1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1
bwlabel 创建⼀个包含两个分别由整数1和2标注的连续区域标注矩阵
mylabel = bwlabel(BW) mylabel = 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 2 2
double 创建⼀个包含⼀个由整数1标注的不连续区域标注矩阵。
mylabel2 = double(BW) mylabel2 = 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1
regionprops 并不负责⾃动转换⼆值图像数据类型,⽽是由你⾃⼰决定使⽤何种数据转换⽅法来存储⾃⼰想要的数据。
regionprops函数的扩展思路
逗号分割字符串转数组在regionprops函数的基础上,你可以使⽤它提供的基本数据来扩展它的功能,将区域的曲率数据和⾻架数据作为它的另外属性值来开发,从⽽希望它能⽤来做更细致的特征提取。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。