2016-06-14 4 views
0

J'ai une image binaire (attachée) avec des composants connectés isolés avec bwconncomps. J'essaie d'identifier le contour de chacun de ces composants mais d'une manière où je peux toujours me référer à l'objet rempli - (J'utilise le contour comme un masque sur une image en niveaux de gris pour tirer de la valeur et en fonction de cela valeur effectuant une opération sur la région d'origine remplie remplie)MATLAB: isoler des périmètres de régions d'intérêt dans une image binaire: problèmes bwmorph

Lorsque j'exécute bwconncomps sur l'image jointe, 814 objets sont identifiés. Je peux lancer bwmorph (D, 'enlever'); et j'obtiens les contours/les périmètres des objets mais quand j'exécute bwconncomps sur ceci j'obtiens 827 objets - (je ne suis pas sûr d'où viennent ces objets supplémentaires et cela résout ma capacité de me référer à l'objet rempli basé sur la valeur que je tirer de son «contour»). Fondamentalement, j'ai besoin d'une version de bwmorph (D, 'remove') qui laissera le même nombre de composants connectés comme vu dans bwconncomps de l'image binaire originale .. de sorte que je peux comparer le composant # 30 dans le binaire d'origine au contour de la même # 30 dans bwconncomps.

Espérons que c'était clair, des suggestions?

Merci

enter image description here

Répondre

1

Vous pouvez utiliser bwboundaries pour trouver les limites de pixels des composants connectés blancs, de sorte que chaque composant connecté a un ensemble correspondant de limites.

%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); 

Résultat: CC et CC2 contiennent le même nombre de composants connectés

CC = 

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

CC2 = 

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

En outre, chaque composant connecté CC2 {ii} correspond à sa CC {ii} comme on peut le voir par le test suivant résultats:

%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 

résultat:

CC2MatchesToCC1 = 

1