你不能那样做logical
索引。最简单的方法可能是使用布尔语句来组合事物。
connectedCompoonent1and4 = labelledImage == 1 | labelledImage == 4;
一般来说,假设你有一个元素向量来表示你想保留哪些组件,你可以使用bsxfun
,permute
来any
帮助你。像这样的东西应该工作:
components = [1 4];
connected = any(bsxfun(@eq, labelledImage, permute(components, [1 3 2])), 3);
上面的代码使用矩阵广播创建一个临时 3D 矩阵,其中每个切片i
包含i
向量的第 th 值,components
其中包含您想要保留的所需标签。 labelledImage
也在第三维中复制,因此使用的结果bsxfun
会创建一个 3D 矩阵,其中每个切片分割i
出i
您要保留的第 th 个对象。any
然后,我们使用并查看第三维将所有对象组合在一起。
如果你不喜欢单行,你甚至可以使用一个简单的for
循环:
components = [1 4];
connected = false(size(labelledImage, 1), size(labelledImage, 2));
for ind = 1 : numel(components)
connected = connected | labelledImage == components(ind);
end
这将创建一个输出图像 all false
,然后我们遍历要保留的组件向量中的每个值,并将这些结果附加到结果之上。最后将为您提供您想要保留的所有组件。
最后,您还可以使用ismember
并确定矩阵中可以在标签矩阵和分量向量之间找到的那些值,并以这种方式简单地创建您的掩码:
connected = ismember(labelledImage, components);
现在您有了要提取的对象蒙版,要在原始图像上使用它,只需将每个通道与蒙版相乘。的另一个用途bsxfun
可以为您做到这一点。假设您的 RGB 图像被调用img
,只需执行以下操作:
outImg = bsxfun(@times, img, cast(connected, class(img)));
要执行逐元素乘法,您必须确保要相乘的两个矩阵具有相同的类型。我将掩码转换为与输入图像相同的类并执行乘法。