feat: Steve was shot by Skeleton

This commit is contained in:
Damien Guillotin 2022-03-25 11:31:23 +01:00
parent 678874bd75
commit 3d4fe8d58c
4 changed files with 331 additions and 12 deletions

268
TP_maillage.asv Normal file
View file

@ -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;

View file

@ -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 %

BIN
mask.mat Normal file

Binary file not shown.

View file

@ -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