如何从图像中删除连接的组件,同时保留一些

时间:2016-07-21 15:31:42

标签: image matlab image-processing label connected-components

假设我在来自labelledImage的{​​{1}}图像中有5个连接组件(标记为对象)。如何操作bwlabel以便标记为1和4的对象仅显示,同时删除标记为2,3和5的对象。然后,如何操作原始RGB图像以便标记为1和4的连接组件仅显示。

我知道如何使用下面这行代码保留单个连接的组件。但是,我不知道如何为多个标记区域执行此操作。

作品。

labelledImage

不起作用。

connectedComponent1 = (labelledImage == 1);
imshow(connectedComponent1)

2 个答案:

答案 0 :(得分:1)

您无法以logical方式进行索引。最简单的方法是使用布尔语句来组合事物。

connectedCompoonent1and4 = labelledImage == 1 | labelledImage == 4;

通常,假设您有一个元素向量来表示您要保留哪些组件,您可以使用bsxfunpermuteany来帮助您。这样的事情应该有效:

components = [1 4];
connected = any(bsxfun(@eq, labelledImage, permute(components, [1 3 2])), 3);

以上代码使用矩阵广播来创建临时3D矩阵,其中每个切片i包含向量i的{​​{1}}值,其中包含您想要保留的所需标签。 components也会在第三维中复制,因此使用labelledImage的结果会创建一个3D矩阵,其中每个切片bsxfun将您要保留的i对象分割出来。然后,我们使用i将所有对象组合在一起并查看第三维。

如果您不喜欢单行,您甚至可以使用简单的any循环:

for

这将创建一个全部为components = [1 4]; connected = false(size(labelledImage, 1), size(labelledImage, 2)); for ind = 1 : numel(components) connected = connected | labelledImage == components(ind); end 的输出图像,然后我们遍历您要保留的组件向量中的每个值,并将结果附加到结果之上。最后将为您提供您想要保留的所有组件。

最后,您还可以使用ismember并确定矩阵中可以在标签矩阵和组件向量之间找到的那些值,并简单地创建掩码:

false

现在你有一个想要提取的对象的掩码,要在原始图像上使用它,只需将每个通道与掩码相乘即可。 connected = ismember(labelledImage, components); 的另一个用途可以为您做到这一点。假设您的RGB图像被称为bsxfun,只需执行以下操作:

img

要执行逐元素乘法,必须确保正相乘的两个矩阵具有相同的类型。我将掩码转换为与输入图像无关的类,并执行乘法。

答案 1 :(得分:1)

使用woocommerce_remove_cart_item

例如:

ismember