1

labelledImagefromという画像に 5 つの接続されたコンポーネント (ラベル付きオブジェクト) があるとしbwlabelます。labelledImage2、3、5のラベルが付いたオブジェクトを削除しながら、1 と 4 のラベルが付いたオブジェクトのみが表示されるように操作するにはどうすればよいでしょうか。 1 と 4 のみ表示されます。

以下のコード行を使用して、単一の接続されたコンポーネントを保持する方法を知っています。ただし、複数のラベル付き領域に対してこれを行う方法がわかりません。

動作します。

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

うまくいきません。

connectedComponent1and4 = (labelledImage == [1 4]);
imshow(connectedComponent1and4)
4

2 に答える 2

1

を使用しismemberます。

元:

A = randi(5,5);  % your connected component matrix
B = [1 4]        % list of components you want to keep

A =

     4     2     1     3     5
     2     4     2     5     1
     3     4     5     1     4
     1     4     1     3     5
     4     3     5     1     5


A(~ismember(A,B)) = 0

A =

     4     0     1     0     0
     0     4     0     0     1
     0     4     0     1     4
     1     4     1     0     0
     4     0     0     1     0
于 2016-07-21T15:43:36.743 に答える
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 行列を作成します。各スライスには、保持したいラベルを含む ベクトルiith 値が含まれます。は 3 次元でも複製されるため、 を使用した結果は、保持したい th オブジェクトを各スライスで分割する 3D マトリックスを作成します。次に、3 次元を使用してすべてのオブジェクトを結合します。componentslabelledImagebsxfuniiany

ワンライナーが気に入らない場合は、単純な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)));

要素ごとの乗算を実行するには、乗算される両方の行列が同じ型であることを確認する必要があります。マスクを入力画像と同じクラスに変換し、乗算を実行します。

于 2016-07-21T15:37:50.097 に答える