feat: séance 3
This commit is contained in:
parent
bba783bcdc
commit
6fc48a2f22
278
TP_maillage.asv
278
TP_maillage.asv
|
@ -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;
|
|
|
@ -42,19 +42,20 @@ load dino_Ps;
|
||||||
% Conseil : afficher les germes + les régions %
|
% Conseil : afficher les germes + les régions %
|
||||||
% à chaque étape / à chaque itération %
|
% à chaque étape / à chaque itération %
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
K = 100;
|
K = 100;
|
||||||
m = 0.1;
|
m = 0.1;
|
||||||
n = 3;
|
n = 3;
|
||||||
seuil_E = 10;
|
seuil_E = 10;
|
||||||
q_max = 20;
|
q_max = 5;
|
||||||
ind_img = 25;
|
ind_img = 25;
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
% subplot(2, 2, 1);
|
% subplot(2, 2, 1);
|
||||||
imshow(im(:, :, :, ind_img)); title('Image 1');
|
imshow(im(:, :, :, ind_img)); title("Image " + num2str(ind_img));
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
imshow(im(:, :, :, ind_img)); title('Image 1');
|
imshow(im(:, :, :, ind_img)); title("Image " + num2str(ind_img));
|
||||||
hold on;
|
hold on;
|
||||||
[germes, image_labelise, E] = super_pixel(im(:, :, :, ind_img), K, m, n, seuil_E, q_max);
|
[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 = im_mask(:,:,ind_img) == 0;
|
||||||
%
|
%
|
||||||
% bw_img(1:8,:) = 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));
|
[r, c] = ind2sub(size(bw_img), pixel_b(1));
|
||||||
contour = bwtraceboundary(bw_img, [r c], 'W', 8);
|
contour = bwtraceboundary(bw_img, [r c], 'W', 8);
|
||||||
hold on
|
hold on
|
||||||
% plot(contour(:,2), contour(:,1),'g','LineWidth',5);
|
plot(contour(:,2), contour(:,1),'g','LineWidth',5);
|
||||||
|
|
||||||
|
|
||||||
% r = delaunay(contour);
|
% r = delaunay(contour);
|
||||||
|
@ -149,7 +150,63 @@ ok = ok1 & ok2;
|
||||||
vx = vx(:,ok);
|
vx = vx(:,ok);
|
||||||
vy = vy(:,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');
|
||||||
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue