解决方案

matlab的Regionprops详解

seo靠我 2023-09-24 04:50:39


Regionprops:用途是get the properties of region,即用来度量图像区域属性的函数。

语法:STATS = regionprops(L,properties)

描述:测量SEO靠我标注矩阵L中每一个标注区域的一系列属性。L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。返回值STATS是一个长度为max(L(:)SEO靠我)的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。properties 可以是由逗号分割的字符串列表、饱含字符串的单元数组、单个字符串 all 或者 basic。如果 propertieSEO靠我s 等于字符串 all,则所有下述字串列表中的度量数据都将被计算,如果 properties 没有指定或者等于 basic,则属性: Area, Centroid, 和 BoundingBox 将被计SEO靠我算。下面的列表就是所有有效的属性字符串,它们大小写敏感并且可以缩写。

属性字符串列表

Area

EquivDiameter

MajorAxisLength

BoundingBox

EulerNumber

MinorSEO靠我AxisLength

Centroid

Extent

Orientation

ConvexArea

Extrema

PixelIdxList

ConvexHull

FilledArea

PixelList

ConvexISEO靠我mage

FilledImage

Solidity

Eccentricity

Image

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

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

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

Area:是标量,计算出在SEO靠我图像各个区域中像素总个数。注意:这个数值可能与由函数 bwarea 计算的值有轻微的不同。对于这样一个数值,我们可以使用它除以整个图像区域的像素个数而得到斑纹比例,可以作为模式识别的候选特征,并且这个SEO靠我特征是仿射不变的。

BoundingBox:是1行ndims(L)*2列的向量,即包含相应区域的最小矩形。BoundingBox 形式为 [ul_corner width],这里 ul_corner 以SEO靠我 [x y z ...] 的坐标形式给出边界盒子的左上角、boxwidth 以 [x_width y_width ...] 形式指出边界盒子沿着每个维数方向的长度。本例的各部分区域最小矩形如下图!注意SEO靠我:请在这熟悉一下函数rectangle的使用方法。

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

MajorAxisLength:是标量,与区域具有相同标准二阶中心矩的椭圆的长SEO靠我轴长度(像素意义下)。本属性只支持二维标注矩阵。

MinorAxisLength:是标量,与区域具有相同标准二阶中心矩的椭圆的短轴长度(像素意义下)。本属性只支持二维标注矩阵。

Eccentricity:SEO靠我是标量,与区域具有相同标准二阶中心矩的椭圆的离心率(可作为特征)。本属性只支持二维标注矩阵。

Orientation:是标量,与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)。本属性只支持二维SEO靠我标注矩阵。

我们可以考察离心率的变化趋势,得到对于整个区域中的各区域的似圆性如何的大致感觉,比如下图是12个区域的离心率变化情形:

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

Image:二值图像,与某区域具有相同大小的逻辑矩阵。你可以用这个属性直接将每个子区域提取出来,然后再作相应的处理!

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

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

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

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

看看第2个区域的大图:

ConvexImage:二值图像,用来画出上述的区域最小凸多边形。同SEO靠我时此凸包内的像素均打开,图像尺寸和此区域对应边界矩形相同。此属性只支持2维标注矩阵。注意:此处函数roipoly很有用!

ConvexArea:是标量,填充区域凸多边形图像中的 on 像素个数。

EuleSEO靠我rNumber:是标量,几何拓扑中的一个拓扑不变量--欧拉数,等于图像中目标个数减去这些目标中空洞的个数。此属性只支持2维标注矩阵。本例中的欧拉数均为1。

Extrema:8行2列矩阵,八方向区域极值点SEO靠我。矩阵每行存储这些点的xy坐标,向量格式为 [top-left top-right right-top right-bottom bottom-right bottom-left left-bottoSEO靠我m left-top]。此属性只支持2维标注矩阵。

EquivDiameter:是标量,等价直径:与区域具有相同面积的圆的直径。计算公式为:sqrt(4*Area/pi)。. 此属性只支持2维标注矩阵。SEO靠我

Solidity:是标量,同时在区域和其最小凸多边形中的像素比例。计算公式为:Area/ConvexArea,这也是个仿射特征,实际上反映出区域的固靠性程度。此属性只支持2维标注矩阵。

Extent:是SEO靠我标量,同时在区域和其最小边界矩形中的像素比例。计算公式为:Area除以边界矩形面积,这也是个仿射特征,实际上反映出区域的扩展范围程度。此属性只支持2维标注矩阵。不再给出计算结果!!

PixelIdxLiSEO靠我st:p元向量,存储区域像素的索引下标。

PixelList:p行ndims(L)列矩阵,存储上述索引对应的像素坐标。

支持类:输入的标注矩阵L可以有任意的数值类型。

提醒

使用逗号分割列表语法:当你基于reSEO靠我gionprops函数的输出作算法设计时,使用逗号分割列表语法就凸显出其非常的价值。例如:对于一个存储标量的属性,可以利用此语法创建一个包含图像中不同区域内此属性值的向量。例如以下两句是等价的:

staSEO靠我ts(1).Area, stats(2).Area, ..., stats(end).Area stats.Area

因此,可以使用下面的方法创建相应的向量:

regionprops(L,SEO靠我Area); allArea = [stats.Area];

allArea 就是一个与结构数组 stats 具备相同长度的向量。

基于特定原则的区域选择:当你要基于特定准则条件选择某个区域时,将函数 iSEO靠我smember 和 regionprops 联合使用是很有用处的。例如:创建一个只包含面积大于80的二值图像,用以下命令

idx = find([stats.Area] > 80); BW2 = ismSEO靠我ember(L,idx);

计算性能考虑:大多数的属性测量计算时间都非常地少,除了那些非常依赖于图像L中区域个数和像素个数的属性。例如:

ConvexHull ConvexImage ConvexAreaSEO靠我 FilledImage

另外建议一次性计算所有属性值,因为分开计算和一起计算时间相差无几!

使用二值图像工作:在调用regionprops之前必须将二值图像转变为标注矩阵。两个函数可以做到:

L = bwSEO靠我label(BW); L = double(BW);

注意:虽然这两个函数从同一二值图像产生不同的标注矩阵,但是它们是等效的!例如:给出如下的二值矩阵BW,

1 1 0 0 0 0 1 1 0 0 0 0SEO靠我 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1

bwlabel 创建一个包含两个分别由整数1和2标注的连续区域标注矩阵

mylabel = bwlabel(BW) mylabelSEO靠我 = 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标注的不连续区域标注矩阵。

mylabeSEO靠我l2 = 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 并不SEO靠我负责自动转换二值图像数据类型,而是由你自己决定使用何种数据转换方法来存储自己想要的数据。

regionprops函数的扩展思路:在regionprops函数的基础上,你可以使用它提供的基本数据来扩展它的SEO靠我功能,将区域的曲率数据和骨架数据作为它的另外属性值来开发,从而希望它能用来做更细致的特征提取。

获取图像中的连通区域,可以使用以下代码:

src_img_name = 1.jpg; imgSEO靠我 = imread(src_img_name);% get binary image gray_img = rgb2gray(img); T = graythresh(SEO靠我gray_img); bw_img = im2bw(gray_img, T);% find the largest connected region img_reg =SEO靠我 regionprops(bw_img, area, boundingbox); areas = [img_reg.Area]; rects = cat(1, img_SEO靠我reg.BoundingBox);

显示所有连通区域

% show all the largest connected region figure(1), imshow(bSEO靠我w_img); for i = 1:size(rects, 1)rectangle(position, rects(i, :), EdgeColor, r); end

SEO靠我示最大连通区域,

[~, max_id] = max(areas); max_rect = rects(max_id, :);% show the largest connected rSEO靠我egion figure(2), imshow(bw_img); rectangle(position, max_rect, EdgeColor, r)SEO靠我;

显示结果:

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2