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.
Merci, thats vraiment utile, je ne connaissais pas la fonction bwlabel avant. – James
@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