0

bwconncomps で分離された接続コンポーネントを含むバイナリ イメージ (添付) があります。これらの各コンポーネントのアウトラインを特定しようとしていますが、塗りつぶされたオブジェクトを参照できる方法で (アウトラインをグレースケール イメージのマスクとして使用して値を取得し、それに応じて塗りつぶされた元の関心領域で操作を実行する値)

添付の画像で bwconncomps を実行すると、814 個のオブジェクトが識別されます。bwmorph(D,'remove'); を実行できます。そして、オブジェクトの輪郭/周囲を取得しますが、これで bwconncomps を実行すると、827 個のオブジェクトが取得されます (これらの余分なオブジェクトがどこから来ているのかわからないため、値に基づいて塗りつぶされたオブジェクトを参照する能力が台無しになります)アウトラインから引っ張る)。

基本的に、元のバイナリ イメージの bwconncomps に見られるのと同じ数の接続されたコンポーネントを残す bwmorph(D,'remove') のバージョンが必要です。これにより、元のバイナリのコンポーネント #30 をアウトラインと比較できます。 bwconncomps の同じ #30。

これが明確であることを願っています、何か提案はありますか?

ありがとう

ここに画像の説明を入力

4

1 に答える 1

1

bwboundaries を使用して、白い連結成分のピクセル境界を見つけ、各連結成分が対応する境界のセットを持つようにすることができます。

%calculate boundries and generate boundry mask
B = bwboundaries(im,'noholes');
boundriesImage = zeros(size(im));
boundriesPixels = cell2mat(B);
boundriesImage(sub2ind(size(im),boundriesPixels(:,1),boundriesPixels(:,2)))=1;

%finds the connected component in the original image and in the boundry
%mask
CC = bwconncomp(im);
CC2 = bwconncomp(boundriesImage);

結果: CC と CC2 には、同じ数の接続されたコンポーネントが含まれます。

CC = 

    Connectivity: 8
       ImageSize: [535 1571]
      NumObjects: 814
    PixelIdxList: {1x814 cell}

CC2 = 

    Connectivity: 8
       ImageSize: [535 1571]
      NumObjects: 814
    PixelIdxList: {1x814 cell}

また、次のテスト結果からわかるように、各接続コンポーネント CC2{ii} はその CC{ii} に一致します。

%tests that for each ii, CC{ii} is contained in CC{i}
CC2MatchesToCC1 = true;
for ii=1:length(CC.PixelIdxList)
    if length(intersect(CC2.PixelIdxList{ii},CC.PixelIdxList{ii}))~=length(CC2.PixelIdxList{ii})
        CC2MatchesToCC1 = false;
    end
end

結果:

CC2MatchesToCC1 =

 1
于 2016-06-14T16:57:21.923 に答える