diff --git a/TP_maillage.asv b/TP_maillage.asv new file mode 100644 index 0000000..4ebde7a --- /dev/null +++ b/TP_maillage.asv @@ -0,0 +1,268 @@ +clear; +close all; +load(i) +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 = imread("mask.mat") +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 8f92512..300d957 100644 --- a/TP_maillage.m +++ b/TP_maillage.m @@ -1,5 +1,6 @@ clear; close all; +load("mask.mat"); nb_images = 36; % Nombre d'images % chargement des images @@ -41,7 +42,7 @@ load dino_Ps; % Conseil : afficher les germes + les régions % % à chaque étape / à chaque itération % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -K = 50; +K = 100; m = 0.1; n = 3; seuil_E = 10; @@ -49,12 +50,12 @@ q_max = 20; figure; % subplot(2, 2, 1); -imshow(im(:, :, :, 9)); title('Image 1'); +imshow(im(:, :, :, 1)); title('Image 1'); figure; -imshow(im(:, :, :, 9)); title('Image 1'); +imshow(im(:, :, :, 1)); title('Image 1'); hold on; -[germes, image_labelise, E] = super_pixel(im(:, :, :, 9), K, m, n, seuil_E, q_max); +[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; @@ -74,23 +75,73 @@ hold on; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure; -R = germes(:,3); -B = germes(:,5); +R = germes(:, 3); +B = germes(:, 5); scatter(R, B); +hold on -W = germes(:,3) > 0.5; +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]; -figure; -imagesc(reshape(germes(image_labelise, 6), size(im,1), [])); +%% +bw_img = reshape(germes(image_labelise, 6), size(im, 1), []); + + + +figure; +% bw_img = im_mask(:,:,1) == 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 % diff --git a/mask.mat b/mask.mat new file mode 100644 index 0000000..102c3ac Binary files /dev/null and b/mask.mat differ diff --git a/super_pixel.m b/super_pixel.m index 6736d52..a2adac0 100644 --- a/super_pixel.m +++ b/super_pixel.m @@ -59,7 +59,7 @@ function [germes, img_labelise, E] = super_pixel(img, K, m, n, seuil_E, q_max) img_labelise = zeros(width, height); % mélange mélange mélange - germes = germes(randperm(length(germes)),:); + germes = germes(randperm(length(germes)), :); % boucle princiaple for q = 1:q_max @@ -141,7 +141,7 @@ function [germes, img_labelise, E] = super_pixel(img, K, m, n, seuil_E, q_max) end % affichage des germes - scatter(germes(:, 2), germes(:, 1), 'b.'); + scatter(germes(:, 2), germes(:, 1), 'w.'); drawnow nocallbacks % calcul de l'erreur résiduel