假设我在来自labelledImage
的{{1}}图像中有5个连接组件(标记为对象)。如何操作bwlabel
以便标记为1和4的对象仅显示,同时删除标记为2,3和5的对象。然后,如何操作原始RGB图像以便标记为1和4的连接组件仅显示。
我知道如何使用下面这行代码保留单个连接的组件。但是,我不知道如何为多个标记区域执行此操作。
作品。
labelledImage
不起作用。
connectedComponent1 = (labelledImage == 1);
imshow(connectedComponent1)
答案 0 :(得分:1)
您无法以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
的{{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