使用ismember和regionprops的输出
我最近听到一位MathWorks应用工程师(嗨,布雷特!)说一小段regionprops文档非常“强大”。下面就是:
这个函数ismember和一起使用有用吗regionprops根据一定的标准选择区域。例如,这些命令创建一个仅包含面积大于80的区域的二进制图像。
Idx = find([stats.]面积]> 80);BW2 = ismember(L,idx);
当我听到布雷特的评论时,我立即从我的后口袋里拿出我的高科技笔记设备(索引卡)并写道:“regionprops - ismember -博客主题。”
基本思想是这样的:如果我有一个包含对象的二值图像,我如何制作一个包含满足特定条件的对象子集的新二值图像?答案分为三个部分:
1.使用bwlabel而且regionprops计算物体的测量值。
2.为满足条件的对象计算一个标签向量。有时一种叫做“逗号分隔列表”的特殊结构语法对这一步非常有用;我将在下面展示该语法。
3.使用ismember计算所需的二值图像。
我已经发布了几个使用bwlabel而且regionprops,所以我就不详细讲了。在二值图像中使用标记对象bwlabel,然后使用。计算标记对象的几何测量regionprops.
让我们使用blobs.png图像作为示例。
Bw = imread(“blobs.png”);imshow (bw)
L = bwlabel(bw);s = regionprops(L,“区域”,的边界框(“大小));(1)
ans =区域:35 BoundingBox: [0.5000 0.5000 14 14]
regionprops返回一个结构数组,其中包含每个对象所需的测量值。
结构的逗号分隔列表语法提供了一种简单的方法,可以将特定字段从结构数组转换为向量,假设字段值始终是标量。下面是它的工作原理。当年代是一个包含字段foo的结构数组,您可以编写以下表达式:
s.foo
MATLAB将其转换为“逗号分隔的列表”:
(1)。喷火,年代(2).foo, ..., s(end).foo
因此,如果(k) . foo是标量,你可以创建一个矢量的所有喷火的值s.foo在括号中,像这样:
Foo_fector = [s.foo];
这是它是如何工作的“区域”我们在上面计算了blobs.png图像的测量值。
Area_values = [s.]区)
area_values = 1 ~ 7列35 393 19 139 36 58 736 8 ~ 14列53 22 1 22 2 15 ~ 21列1 196 3940 4326 504 40 422 22 ~ 28列966 655 175 40 39 1108 35
假设我们想要一个区域在100到1000之间的所有对象的列表。我们可以用找到关系操作符,像这样:
Idx = find(100 <= area_values) & (area_values <= 1000))
Idx = 24 7 16 19 21 22 23 24
这就把我们带到ismember.我们可以通过传递构造一个包含所有面积在100到1000之间的物体的二值图像l而且idxismember。
bw2 = ismember(L, idx);imshow (bw2)
让我们尝试另一种测量方法,可靠性.固体度定义为区域的面积除以该区域的凸包面积。
s = regionprops(L, {“稳健”});坚固度= [s]。可靠性)
solid =第1至9列0.2397 0.9680 0.6786 0.0700 0.8000 0.1321 0.4461 0.7910 1.0000第10至18列1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0972 0.1681第19至27列1.0000 0.2235 0.0386 0.1505 0.9791 0.9669 0.2260 0.2191 0.5604第28列0.2397
以下是所有固体度为0.9或更高的物体:
imshow(ismember(L, find(固体度>= 0.9)))
这里是所有固体度为0.25或更低的物体:
imshow(ismember(L, find(固体度<= 0.25)))
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。