From f7acb5a0b758602637644e539e247c23a454160d Mon Sep 17 00:00:00 2001 From: Damien Guillotin Date: Tue, 5 Apr 2022 20:15:48 +0200 Subject: [PATCH] feat: 3D --- TP_maillage.m | 88 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/TP_maillage.m b/TP_maillage.m index 75ff37d..0be8fb5 100644 --- a/TP_maillage.m +++ b/TP_maillage.m @@ -1,6 +1,14 @@ clear; close all; load("mask.mat"); + +im_mask = im_mask(:,:,:) == 0; + +im_mask(1:8,:,:) = 0; +im_mask(end-5:end,:,:) = 0; +im_mask(:,1:5,:) = 0; +im_mask(:,end-30:end,:) = 0; + nb_images = 36; % Nombre d'images % chargement des images @@ -48,7 +56,7 @@ m = 0.1; n = 3; seuil_E = 10; q_max = 5; -ind_img = 25; +ind_img = 5; figure; % subplot(2, 2, 1); @@ -95,14 +103,8 @@ germes = [germes W]; bw_img = reshape(germes(image_labelise, 6), size(im, 1), []); - figure(3); -% bw_img = im_mask(:,:,ind_img) == 0; -% -% bw_img(1:8,:) = 0; -% bw_img(end-5:end,:) = 0; -% bw_img(:,1:5) = 0; -% bw_img(:,end-30:end) = 0; +bw_img = im_mask(:,:,ind_img); subplot(2,2,1); imshow(bw_img); @@ -253,18 +255,18 @@ end; fprintf('Calcul des points 3D termine : %d points trouves. \n', size(X, 2)); %affichage du nuage de points 3D -% figure; -% hold on; -% -% for i = 1:size(X, 2) -% plot3(X(1, i), X(2, i), X(3, i), '.', 'col', color(:, i) / 255); -% end; -% -% axis equal; +figure; +hold on; + +for i = 1:size(X, 2) + plot3(X(1, i), X(2, i), X(3, i), '.', 'col', color(:, i) / 255); +end; + +axis equal; % A COMPLETER % Tetraedrisation de Delaunay -% T = ... +T = delaunayTriangulation(X(1,:)', X(2,:)', X(3,:)'); % A DECOMMENTER POUR AFFICHER LE MAILLAGE % fprintf('Tetraedrisation terminee : %d tetraedres trouves. \n',size(T,1)); @@ -272,22 +274,25 @@ fprintf('Calcul des points 3D termine : %d points trouves. \n', size(X, 2)); % figure; % tetramesh(T); + % A DECOMMENTER ET A COMPLETER % Calcul des barycentres de chacun des tetraedres -% poids = ... -% nb_barycentres = ... -% for i = 1:size(T,1) -% Calcul des barycentres differents en fonction des poids differents -% En commencant par le barycentre avec poids uniformes -% C_g(:,i,1)=[ ... +poids = [1 1 1 1] / 4; +nb_barycentres = size(T.ConnectivityList, 1); +for i = 1:size(T,1) + % Calcul des barycentres differents en fonction des poids differents + % En commencant par le barycentre avec poids uniformes + C_g(1:3, i) = poids * T.Points(T.ConnectivityList(i, :), :); + C_g(4, i) = 1; +end % A DECOMMENTER POUR VERIFICATION % A RE-COMMENTER UNE FOIS LA VERIFICATION FAITE % Visualisation pour vérifier le bon calcul des barycentres % for i = 1:nb_images % for k = 1:nb_barycentres -% o = P{i}*C_g(:,:,k); +% o = P{i}*C_g(:,k); % o = o./repmat(o(3,:),3,1); % imshow(im_mask(:,:,i)); % hold on; @@ -295,22 +300,43 @@ fprintf('Calcul des points 3D termine : %d points trouves. \n', size(X, 2)); % pause; % close; % end -%end +% end % A DECOMMENTER ET A COMPLETER % Copie de la triangulation pour pouvoir supprimer des tetraedres -% tri=T.Triangulation; +tri = T.ConnectivityList; % Retrait des tetraedres dont au moins un des barycentres % ne se trouvent pas dans au moins un des masques des images de travail % Pour chaque barycentre -% for k=1:nb_barycentres -% ... +to_save = []; +for k = 1:nb_barycentres + valide = 0; + for i = 1:nb_images + o = P{i}*C_g(:,k); + o = o / o(3); + x = floor(o(1)); + y = floor(o(2)); + + if im_mask(x,y,i) == 0 + valide = 1; + break + end + end + + if valide + continue + end + + to_save = [to_save k]; +end + +triBis = tri(to_save,:); % A DECOMMENTER POUR AFFICHER LE MAILLAGE RESULTAT % Affichage des tetraedres restants -% fprintf('Retrait des tetraedres exterieurs a la forme 3D termine : %d tetraedres restants. \n',size(Tbis,1)); -% figure; -% trisurf(tri,X(1,:),X(2,:),X(3,:)); +fprintf('Retrait des tetraedres exterieurs a la forme 3D termine : %d tetraedres restants. \n',size(T,1)); +figure; +tetramesh(triBis, T.Points); % Sauvegarde des donnees % save donnees;