2010-03-17 6 views
2

Je rencontre des problèmes pour comparer les éléments dans différentes matrices de cellules.MATLAB: coordonnées d'angle de l'image et référence aux matrices de cellules

Le contexte de ce problème est que j'utilise la fonction bwboundaries dans MATLAB pour tracer le contour d'une image. L'image est d'une section transversale structurelle et j'essaie de trouver s'il y a continuité dans toute la section (c'est-à-dire qu'il n'y a qu'un seul contour produit par la commande bwboundaries). Après avoir fait cela et trouvé où la section est tracée (c'est-à-dire non continue), j'ai utilisé la commande cornermetric pour trouver les coins de chaque section.

Le code que j'ai est:

%% Define the structural section as a binary matrix (Image is an I-section with the web broken) 
bw(20:40,50:150) = 1; 
bw(160:180,50:150) = 1; 
bw(20:60,95:105) = 1; 
bw(140:180,95:105) = 1; 

Trace = bw; 
[B] = bwboundaries(Trace,'noholes'); %Traces the outer boundary of each section 

L = length(B); % Finds number of boundaries 
if L > 1 
    disp('Multiple boundaries') % States whether more than one boundary found 
end 

%% Obtain perimeter coordinates 
for k=1:length(B) %For all the boundaries 
    perim = B{k}; %Obtains perimeter coordinates (as a 2D matrix) from the cell array 
end 

%% Find the corner positions 
C = cornermetric(bw); 

Areacorners = find(C == max(max(C))) % Finds the corner coordinates of each boundary 

[rowindexcorners,colindexcorners] = ind2sub(size(Newgeometry),Areacorners) 
% Convert corner coordinate indexes into subcripts, to give x & y coordinates (i.e. the same format as B gives) 

%% Put these corner coordinates into a cell array 
Cornerscellarray = cell(length(rowindexcorners),1); % Initialises cell array of zeros 
for i =1:numel(rowindexcorners) 
    Cornerscellarray(i) = {[rowindexcorners(i) colindexcorners(i)]}; 
    %Assigns the corner indicies into the cell array 
    %This is done so the cell arrays can be compared 
end 

for k=1:length(B) %For all the boundaries found 
    perim = B{k}; %Obtains coordinates for each perimeter 
    Z = perim; % Initialise the matrix containing the perimeter corners 

    Sectioncellmatrix = cell(length(rowindexcorners),1); 
    for i =1:length(perim) 
     Sectioncellmatrix(i) = {[perim(i,1) perim(i,2)]}; 
    end 

    for i = 1:length(perim) 
     if Sectioncellmatrix(i) ~= Cornerscellarray 
      Sectioncellmatrix(i) = []; 
      %Gets rid of the elements that are not corners, but keeps them associated with the relevent section 
     end 
    end 
end 

Cela crée une erreur dans la dernière boucle. Est-il possible de vérifier si chaque cellule du tableau (contenant une coordonnée x et y) est égale à une paire de coordonnées dans cornercellarray? Je sais qu'il est possible avec les matrices de comparer si un certain élément correspond à l'un des éléments d'une autre matrice. Je veux être capable de faire la même chose ici, mais pour la paire de coordonnées dans le tableau de cellules.

La raison pour laquelle je n'utilise pas simplement le tableau de cellules cornercellarray lui-même, est que cela liste toutes les coordonnées de coin et ne les associe pas à une limite tracée spécifique.

Répondre

3

Les comparaisons plusieurs-à-plusieurs ne peuvent pas être effectuées avec le signe égal. Vous devez utiliser ismember à la place.

%# catenate all corners in one big corner array 
Cornerscellarray = cat(1,Cornerscellarray{:}); 

%# loop through each section cell and remove all that is not corners 
for i = 1:length(perim) 
    %# check for corners 
    cornerIdx = ismember(Sectioncellmatrix{i},Cornerscellarray,'rows'); 

    %# only keep good entries 
    Sectioncellmatrix{i} = Sectioncellmatrix{i}(cornerIdx,:); 
end 

En outre, ce code semble vraiment être optimisé. Par exemple, vous pouvez utiliser bwlabel pour étiqueter vos tableaux, lire l'étiquette avec les coordonnées de coin pour associer les coins aux entités.

comme ceci:

bw(20:40,50:150) = 1; 
bw(160:180,50:150) = 1; 
bw(20:60,95:105) = 1; 
bw(140:180,95:105) = 1; 

%# get corners 
cornerProbability = cornermetric(bw); 
cornerIdx = find(cornerProbability==max(cornerProbability(:))); 

%# Label the image. bwlabel puts 1 for the first feature, 2 for the second, etc. 
%# Since concave corners are placed just outside the feature, grow the features 
%# a little before labeling 
bw2 = imdilate(bw,ones(3)); 
labeledImage = bwlabel(bw2); 

%# read the feature number associated with the corner 
cornerLabels = labeledImage(cornerIdx); 

%# find all corners that are associated with feature 1 
corners_1 = cornerIdx(cornerLabels==1); 
+0

Merci, thats vraiment utile, je ne connaissais pas la fonction bwlabel avant. – James

+0

@James: C'est l'une des belles choses à propos de Matlab: Grâce aux nombreuses fonctions et boîtes à outils, vous pouvez vous débrouiller avec très peu de frappe, même pour des opérations complexes. – Jonas

Questions connexes