原文地址:Matlab图像处理函数:regionprops
作者:448967013
这里给出在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
属性详细定义本部分将结合一个具体的例子说明各种字串相关属性的意义,矩阵取自在蚁蛉模式识别中做过预处理后的斑纹分割图像,如下图:
这是一幅二值图像,在 应用regionprop s函数之前必须将其标注,可以 调用 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.767390.11883, 0.0815450.19586, 0.610920.30701, 0.308070.65712, 0.316130.73165, 0.305310.74548, 0.353780.80624, 0.728020.84546, 0.615640.90554, 0.0795740.93477, 0.778710.97611, 0.15576'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维标注矩阵。例如:本例中的所有子区域的最小凸多边形 图形如下图
看看第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).Areastats.Area因此,可以使用下面的方法创建相应的向量: regionprops(L,'Area');allArea = [stats.Area];allArea 就是一个与结构数组 stats 具备相同长度的向量。 基于特定原则的区域选择当你要基于特定准则条件选择某个区域时,将函数 ismember 和 regionprops 联合使用是很有用处的。例如:创建一个只包含面积大于80的二值图像,用以下 命令 idx = find([stats.Area] > 80);BW2 = ismember(L,idx);计算性能考虑大多数的属性测量计算 时间都非常地少,除了那些非常依赖于图像L中区域个数和像素个数的属性。例如: 'ConvexHull' 'ConvexImage' 'ConvexArea' 'FilledImage' 另外建议一次性计算所有属性值,因为分开计算和一起计算时间相差无几!使用二值图像工作在调用regionprops之前必须将二值图像转变为标注矩阵。两个函数可以做到: L = bwlabel(BW); L = double(BW);注意:虽然这两个函数从同一二值图像产生不同的标注矩阵,但是它们是等效的!例如:给出如下的二值矩阵BW, 1 1 0 0 0 01 1 0 0 0 00 0 0 0 0 00 0 0 0 1 10 0 0 0 1 1bwlabel 创建一个包含两个分别由整数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 2double 创建一个包含一个由整数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 1regionprops 并不负责自动转换二值图像数据类型,而是由你自己决定使用何种数据转换方法来存储自己想要的数据。 regionprops函数的扩展思路在regionprops函数的 基础上,你可以使用它提供的基本数据来扩展它的功能,比如我就将区域的曲率数据和骨架数据作为它的另外属性值来开发,从而希望它能用来做更细致的特征提取。
EquivDiameter
MajorAxisLength
BoundingBox
EulerNumber
MinorAxisLength
Centroid
Extent
Orientation
ConvexArea
Extrema
PixelIdxList
ConvexHull
FilledArea
PixelList
ConvexImage
FilledImage
Solidity
Eccentricity
Image
属性详细定义本部分将结合一个具体的例子说明各种字串相关属性的意义,矩阵取自在蚁蛉模式识别中做过预处理后的斑纹分割图像,如下图:
这是一幅二值图像,在 应用regionprop s函数之前必须将其标注,可以 调用 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.767390.11883, 0.0815450.19586, 0.610920.30701, 0.308070.65712, 0.316130.73165, 0.305310.74548, 0.353780.80624, 0.728020.84546, 0.615640.90554, 0.0795740.93477, 0.778710.97611, 0.15576'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维标注矩阵。例如:本例中的所有子区域的最小凸多边形 图形如下图
看看第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).Areastats.Area因此,可以使用下面的方法创建相应的向量: regionprops(L,'Area');allArea = [stats.Area];allArea 就是一个与结构数组 stats 具备相同长度的向量。 基于特定原则的区域选择当你要基于特定准则条件选择某个区域时,将函数 ismember 和 regionprops 联合使用是很有用处的。例如:创建一个只包含面积大于80的二值图像,用以下 命令 idx = find([stats.Area] > 80);BW2 = ismember(L,idx);计算性能考虑大多数的属性测量计算 时间都非常地少,除了那些非常依赖于图像L中区域个数和像素个数的属性。例如: 'ConvexHull' 'ConvexImage' 'ConvexArea' 'FilledImage' 另外建议一次性计算所有属性值,因为分开计算和一起计算时间相差无几!使用二值图像工作在调用regionprops之前必须将二值图像转变为标注矩阵。两个函数可以做到: L = bwlabel(BW); L = double(BW);注意:虽然这两个函数从同一二值图像产生不同的标注矩阵,但是它们是等效的!例如:给出如下的二值矩阵BW, 1 1 0 0 0 01 1 0 0 0 00 0 0 0 0 00 0 0 0 1 10 0 0 0 1 1bwlabel 创建一个包含两个分别由整数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 2double 创建一个包含一个由整数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 1regionprops 并不负责自动转换二值图像数据类型,而是由你自己决定使用何种数据转换方法来存储自己想要的数据。 regionprops函数的扩展思路在regionprops函数的 基础上,你可以使用它提供的基本数据来扩展它的功能,比如我就将区域的曲率数据和骨架数据作为它的另外属性值来开发,从而希望它能用来做更细致的特征提取。