diff --git a/TP_maillage.asv b/TP_maillage.asv deleted file mode 100644 index b928bb8..0000000 --- a/TP_maillage.asv +++ /dev/null @@ -1,278 +0,0 @@ -clear; -close all; -load("mask.mat"); -nb_images = 36; % Nombre d'images - -% chargement des images -for i = 1:nb_images - - if i <= 10 - nom = sprintf('images/viff.00%d.ppm', i - 1); - else - nom = sprintf('images/viff.0%d.ppm', i - 1); - end - - % L'ensemble des images de taille : nb_lignes x nb_colonnes x nb_canaux - % x nb_images - im(:, :, :, i) = imread(nom); -end - -% chargement des points 2D suivis -% pts de taille nb_points x (2 x nb_images) -% sur chaque ligne de pts -% tous les appariements possibles pour un point 3D donne -% on affiche les coordonnees (xi,yi) de Pi dans les colonnes 2i-1 et 2i -% tout le reste vaut -1 -pts = load('viff.xy'); -% Chargement des matrices de projection -% Chaque P{i} contient la matrice de projection associee a l'image i -% RAPPEL : P{i} est de taille 3 x 4 -load dino_Ps; -% chargement des masques (pour l'elimination des fonds bleus) -% de taille nb_lignes x nb_colonnes x nb_images -% A COMPLETER quand vous aurez termine la premiere partie permettant de -% binariser les images -% ... - -% Affichage des images - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% A COMPLETER % -% Calculs des superpixels % -% Conseil : afficher les germes + les régions % -% à chaque étape / à chaque itération % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -K = 100; -m = 0.1; -n = 3; -seuil_E = 10; -q_max = 20; - -figure; -% subplot(2, 2, 1); -imshow(im(:, :, :, 1)); title('Image 1'); - -figure; -imshow(im(:, :, :, 1)); title('Image 1'); -hold on; -[germes, image_labelise, E] = super_pixel(im(:, :, :, 1), K, m, n, seuil_E, q_max); - -% subplot(2, 2, 2); imshow(im(:, :, :, 9)); title('Image 9'); -% hold on; -% germes = super_pixel(im(:, :, :, 9), K, m, n, q_max); -% -% subplot(2, 2, 3); imshow(im(:, :, :, 17)); title('Image 17'); -% hold on; -% germes = super_pixel(im(:, :, :, 17), K, m, n, q_max); -% -% subplot(2, 2, 4); imshow(im(:, :, :, 25)); title('Image 25'); -% hold on; -% germes = super_pixel(im(:, :, :, 25), K, m, n, q_max); - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% A COMPLETER % -% Binarisation de l'image à partir des superpixels % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -figure; -R = germes(:, 3); -B = germes(:, 5); -scatter(R, B); -hold on - -a = (0.7 - 0.1) / (0.6 - 0.2); -b = 0.1 - a * 0.2; - -plot([0 1], [b a + b]); - -W = a * R + b - B > 0; -germes = [germes W]; - -%% - -bw_img = reshape(germes(image_labelise, 6), size(im, 1), []); - - - -figure; -bw_img = im_mask(:,:,1) == 0; - -bw_img(8:end-1,1:end) = 0; -bw_img(1:end-5,1:end) = 0; -bw_img(1:end,5:end) = 0; -bw_img(1:end,1:end-30) = 0; - -imshow(bw_img); -%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% A FAIRE SI VOUS UTILISEZ LES MASQUES BINAIRES FOURNIS % -% Chargement des masques binaires % -% de taille nb_lignes x nb_colonnes x nb_images % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -pixel_b = find(bw_img == 1); -[r, c] = ind2sub(size(bw_img), pixel_b(1)); -contour = bwtraceboundary(bw_img, [r c], 'W', 8); -hold on -% plot(contour(:,2), contour(:,1),'g','LineWidth',5); - - -% r = delaunay(contour); -% barycentres = (contour(r(:,1),:) + contour(r(:,2),:) + contour(r(:,3),:)) / 3; -% scatter(barycentres(:,2), barycentres(:,1)); -% % triplot(r, contour(:,2), contour(:,1)); - -[vx, vy] = voronoi(contour(:,1), contour(:,2)); - -% plot(vx, vy); - -ok = vx(1,:) > 0 & vx(1,:) < size(bw_img, 1) & ... - vx(2,:) > 0 & vx(2,:) < size(bw_img, 1) & ... - vy(1,:) > 0 & vy(1,:) < size(bw_img, 2) & ... - vy(2,:) > 0 & vy(2,:) < size(bw_img, 2); -vx = floor(vx(:,ok)); -vy = floor(vy(:,ok)); - -% plot(vx, vy, 'b'); - -ind1 = sub2ind(size(bw_img), vx(1,:), vy(1,:)); -ok1 = bw_img(ind1) > 0; - -ind2 = sub2ind(size(bw_img), vx(2,:), vy(2,:)); -ok2 = bw_img(ind2) > 0; - -ok = ok1 & ok2; -vx = vx(:,ok); -vy = vy(:,ok); - -plot(vy, vx, 'r'); - -%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% A DECOMMENTER ET COMPLETER % -% quand vous aurez les images segmentées % -% Affichage des masques associes % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Affichage des masques associes -% figure; -% subplot(2,2,1); ... ; title('Masque image 1'); -% subplot(2,2,2); ... ; title('Masque image 9'); -% subplot(2,2,3); ... ; title('Masque image 17'); -% subplot(2,2,4); ... ; title('Masque image 25'); - -% Reconstruction des points 3D -X = []; % Contient les coordonnees des points en 3D -color = []; % Contient la couleur associee -% Pour chaque coupple de points apparies -for i = 1:size(pts, 1) - % Recuperation des ensembles de points apparies - l = find(pts(i, 1:2:end) ~= -1); - % Verification qu'il existe bien des points apparies dans cette image - if size(l, 2) > 1 & max(l) - min(l) > 1 & max(l) - min(l) < 36 - A = []; - R = 0; - G = 0; - B = 0; - % Pour chaque point recupere, calcul des coordonnees en 3D - for j = l - A = [A; P{j}(1, :) - pts(i, (j - 1) * 2 + 1) * P{j}(3, :); - P{j}(2, :) - pts(i, (j - 1) * 2 + 2) * P{j}(3, :)]; - R = R + double(im(int16(pts(i, (j - 1) * 2 + 1)), int16(pts(i, (j - 1) * 2 + 2)), 1, j)); - G = G + double(im(int16(pts(i, (j - 1) * 2 + 1)), int16(pts(i, (j - 1) * 2 + 2)), 2, j)); - B = B + double(im(int16(pts(i, (j - 1) * 2 + 1)), int16(pts(i, (j - 1) * 2 + 2)), 3, j)); - end; - - [U, S, V] = svd(A); - X = [X V(:, end) / V(end, end)]; - color = [color [R / size(l, 2); G / size(l, 2); B / size(l, 2)]]; - end; - -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; - -% A COMPLETER -% Tetraedrisation de Delaunay -% T = ... - -% A DECOMMENTER POUR AFFICHER LE MAILLAGE -% fprintf('Tetraedrisation terminee : %d tetraedres trouves. \n',size(T,1)); -% Affichage de la tetraedrisation de Delaunay -% 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)=[ ... - -% 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 = o./repmat(o(3,:),3,1); -% imshow(im_mask(:,:,i)); -% hold on; -% plot(o(2,:),o(1,:),'rx'); -% pause; -% close; -% end -%end - -% A DECOMMENTER ET A COMPLETER -% Copie de la triangulation pour pouvoir supprimer des tetraedres -% tri=T.Triangulation; -% 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 -% ... - -% 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,:)); - -% Sauvegarde des donnees -% save donnees; - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% CONSEIL : A METTRE DANS UN AUTRE SCRIPT % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% load donnees; -% Calcul des faces du maillage à garder -% FACES = ...; -% ... - -% fprintf('Calcul du maillage final termine : %d faces. \n',size(FACES,1)); - -% Affichage du maillage final -% figure; -% hold on -% for i = 1:size(FACES,1) -% plot3([X(1,FACES(i,1)) X(1,FACES(i,2))],[X(2,FACES(i,1)) X(2,FACES(i,2))],[X(3,FACES(i,1)) X(3,FACES(i,2))],'r'); -% plot3([X(1,FACES(i,1)) X(1,FACES(i,3))],[X(2,FACES(i,1)) X(2,FACES(i,3))],[X(3,FACES(i,1)) X(3,FACES(i,3))],'r'); -% plot3([X(1,FACES(i,3)) X(1,FACES(i,2))],[X(2,FACES(i,3)) X(2,FACES(i,2))],[X(3,FACES(i,3)) X(3,FACES(i,2))],'r'); -% end; diff --git a/TP_maillage.m b/TP_maillage.m index 8d24f06..da5ed2b 100644 --- a/TP_maillage.m +++ b/TP_maillage.m @@ -42,19 +42,20 @@ load dino_Ps; % Conseil : afficher les germes + les régions % % à chaque étape / à chaque itération % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + K = 100; m = 0.1; n = 3; seuil_E = 10; -q_max = 20; +q_max = 5; ind_img = 25; figure; % subplot(2, 2, 1); -imshow(im(:, :, :, ind_img)); title('Image 1'); +imshow(im(:, :, :, ind_img)); title("Image " + num2str(ind_img)); figure; -imshow(im(:, :, :, ind_img)); title('Image 1'); +imshow(im(:, :, :, ind_img)); title("Image " + num2str(ind_img)); hold on; [germes, image_labelise, E] = super_pixel(im(:, :, :, ind_img), K, m, n, seuil_E, q_max); @@ -95,7 +96,7 @@ bw_img = reshape(germes(image_labelise, 6), size(im, 1), []); -figure; +figure(3); % bw_img = im_mask(:,:,ind_img) == 0; % % bw_img(1:8,:) = 0; @@ -118,7 +119,7 @@ pixel_b = find(bw_img == 1); [r, c] = ind2sub(size(bw_img), pixel_b(1)); contour = bwtraceboundary(bw_img, [r c], 'W', 8); hold on -% plot(contour(:,2), contour(:,1),'g','LineWidth',5); +plot(contour(:,2), contour(:,1),'g','LineWidth',5); % r = delaunay(contour); @@ -149,7 +150,63 @@ ok = ok1 & ok2; vx = vx(:,ok); vy = vy(:,ok); -plot(vy, vx, 'r'); +% plot(vy, vx, 'r'); + +vx_ = vx'; +vx_ = [vx_(:,1) ; vx_(:,2)]; + +vy_ = vy'; +vy_ = [vy_(:,1) ; vy_(:,2)]; + +V_ = [vx_ vy_]; + +% V_u = unique(V_, 'rows'); +% +% adja = sparse(zeros(length(V_u))); +% for k = 1:length(V_) / 2 +% i = find(V_(k, 1) == V_u(:, 1) & V_(k, 2) == V_u(:, 2)); +% j = find(V_(2 * k, 1) == V_u(:, 1) & V_(2* k, 2) == V_u(:, 2)); +% if i ~= j +% adja(i, j) = 1; +% adja(j, i) = 1; +% end +% plot([V_u(i,1) V_u(j,1)],[V_u(i,2) V_u(j,2)]) +% end + + + +% adja = zeros(size(bw_img, 1), size(bw_img, 2)); +% adja(vx_, vy_) = 1; +% adja = sparse(adja); +% adja = sparse(vx_, vy_, 1, size(bw_img, 1), size(bw_img, 2)) > 0; +% gplot(adja, V_u); + + +% Calcule des rayons +contour_ = contour'; +R = complex(V_(:,1), V_(:,2)) - complex(contour_(1,:), contour_(2,:)); +R = abs(R); +R = min(R, [], 2); +R = R'; + +% viscircles([V_(:,2) V_(:,1)], R); + +% Filtrage naif +% truc = find(R < 20); +% truc = mod(truc - 1, length(vx)) + 1; +% +% vx(:,truc) = []; +% vy(:,truc) = []; + +%% + +R_scaled = 1.34 * R; +dist = abs(complex(V_(:,1), V_(:,2)) - transpose(complex(V_(:,1), V_(:,2)))); + + + +plot(vy, vx, 'b'); + %%