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 値が含まれます。は 3 次元でも複製されるため、 を使用した結果は、保持したい th オブジェクトを各スライスで分割する 3D マトリックスを作成します。次に、3 次元を使用してすべてのオブジェクトを結合します。components
labelledImage
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
これにより、 all である出力イメージが作成されますfalse
。次に、保持したいコンポーネントのベクトル内の各値をループし、それらの結果を結果の上に追加します。最後に、保持したいすべてのコンポーネントが提供されます。
最後に、ラベル マトリックスとコンポーネント ベクトルの間にあるマトリックスの値を使用ismember
して決定し、その方法でマスクを作成することもできます。
connected = ismember(labelledImage, components);
抽出したいオブジェクトのマスクができたので、これを元の画像で使用するには、各チャンネルにマスクを掛けるだけです。の別の使用法でbsxfun
それを行うことができます。RGB の画像が と呼ばれると仮定するとimg
、単純に次の操作を行います。
outImg = bsxfun(@times, img, cast(connected, class(img)));
要素ごとの乗算を実行するには、乗算される両方の行列が同じ型であることを確認する必要があります。マスクを入力画像と同じクラスに変換し、乗算を実行します。