regionprops

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
|
|

属性详细定义

本部分将结合一个具体的例子说明各种字串相关属性的意义,矩阵取自在蚁蛉模式识别中做过预处理后的斑纹分割图像,如下图:

image.png

这是一幅二值图像,在应用regionprops函数之前必须将其标注,可以调用 bwlabel函数和伪彩色处理,标注后的图像如下图:


image.png

下面基于以上的材料来考察属性的含义。

'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的使用方法。


image.png

'Centroid'

是1行ndims(L)列的向量,给出每个区域的质心(重心)。 注意:Centroid 的第一个元素是重心水平坐标(x坐标)、第二个元素是重心垂直坐标(y坐标)。Centroid 所有其它元素则按照维顺序排列。下图采用以中心为圆心的小圆来演示质心检测的效果:


image.png

图中各质心坐标(标准化后的)依次为:
(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.77871 0.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.png

由上图可以看出区域整体的似圆性并不好,实际上可以考虑使用离心率向量作为一个模式识别的特征!!

'Image'

二值图像,与某区域具有相同大小的逻辑矩阵。你可以用这个属性直接将每个子区域提取出来,然后再作相应的处理!比如本例的第一个斑纹区域提出后是:
image.png

'FilledImage'

与上相同,唯一区别是这是个做了填充的逻辑矩阵!!


image.png

本例中和上面的没有区别,只有区域有空洞时才有明显差别。

'FilledArea'

是标量,填充区域图像中的 on 像素个数。

'ConvexHull'

是p行2列的矩阵,包含某区域的最小凸多边形。此矩阵的每一行存储此多边形一个顶点的xy坐标。此属性只支持2维标注矩阵。例如:本例中的所有子区域的最小凸多边形图形如下图


image.png

看看第2个区域的大图:


image.png

'ConvexImage'

二值图像,用来画出上述的区域最小凸多边形。同时此凸包内的像素均打开,图像尺寸和此区域对应边界矩形相同。此属性只支持2维标注矩阵。例如:本例中的第2个子区域的最小凸多边形图形为
image.png

。注意:此处函数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区域直径向量为:

'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);

计算性能考虑

大多数的属性测量计算时间都非常地少,除了那些非常依赖于图像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函数的基础上,你可以使用它提供的基本数据来扩展它的功能,将区域的曲率数据和骨架数据作为它的另外属性值来开发,从而希望它能用来做更细致的特征提取。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335