TP-probleme-inverse-3D/TP7/exercice_1.m
2023-06-25 16:38:01 +02:00

103 lines
3 KiB
Matlab

clear;
close all;
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
% Choix du jeu de données :
% load Donnees/vase;
% load Donnees/vase_brillant;
% load Donnees/vase_brillant_bis;
load Donnees/visage;
% Les données contiennent :
% * I (n x p) : matrice des niveaux de gris (transpose(I(i,:)) est l'image numéro i vectorisée)
% * N (3 x p) : vérité terrain des normales (si elles sont connues)
% * S (n x 3) : matrice des éclairages (transpose(S(i,:)) est le vecteur d'éclairage numéro i)
% * Z (nb_lignes x nb_colonnes) : vérité terrain de la profondeur (si elle est connue)
% * masque (nb_lignes x nb_colonnes) : masque de l'objet à reconstruire
% * rho (nb_lignes x nb_colonnes) : vérité terrain de l'albédo (s'il est connu)
[nb_lignes,nb_colonnes] = size(masque);
interieur = find(masque>0); % Intérieur du domaine de reconstruction
exterieur = find(masque==0); % Extérieur du domaine de reconstruction
[n,p] = size(I); % n = nombre d'images, p = nombre de pixels
% Affichage des images :
figure('Name','Donnees','Position',[0.8*L,0,0.2*L,H]);
if n==3
n_l = n;
n_c = 1;
else
n_l = 7;
n_c = floor(n/7);
end
for i = 1:n_l*n_c
img = reshape(I(i,:),nb_lignes,nb_colonnes);
subplot(n_l,n_c,i);
imshow(uint8(img));
hold on;
axis image;
axis off;
title(['$I_{' num2str(i,'%2d') '}$'],'Interpreter','Latex','FontSize',20);
end
colormap gray;
drawnow;
% Estimation de M, rho et N :
[rho_estime,N_estime] = estimation(I,S,masque);
% Intégration du champ de normales :
N_estime(3,exterieur) = 1; % Pour éviter les divisions par 0
p_estime = reshape(-N_estime(1,:)./N_estime(3,:),size(masque));
p_estime(exterieur) = 0;
q_estime = reshape(-N_estime(2,:)./N_estime(3,:),size(masque));
q_estime(exterieur) = 0;
z_estime = integration_SCS(q_estime,p_estime);
% Ambiguïté concave/convexe :
if (z_estime(floor(nb_lignes/2),floor(nb_colonnes/2))<z_estime(1,1))
z_estime = -z_estime;
end
z_estime(exterieur) = NaN;
% Affichage de l'albédo et du relief :
figure('Name','Albedo et relief','Position',[0.6*L,0,0.2*L,0.7*H]);
affichage_albedo_relief(rho_estime,z_estime);
% Affichage complémentaire :
figure('Name','Resultat complementaire','Position',[0.4*L,0,0.2*L,0.4*H]);
if exist('N','var')
% Calcul de l'écart angulaire :
EA = rad2deg(acos(sum(N.*N_estime)));
imagesc(reshape(EA,[nb_lignes,nb_colonnes]),[0 10]);
title('Ecart angulaire','FontSize',15);
hc = colorbar;
colormap(hc,jet);
axis image;
axis off;
% Calcul de l'écart angulaire moyen :
EAM = mean(EA(interieur)); % La moyenne doit etre calculee sur l'interieur
disp(['Ecart angulaire moyen sur les normales : ' num2str(EAM,'%.2f') ' degres']);
else
% Affichage du modèle 3D complet :
h = surf(fliplr(z_estime));
title('Modele 3D','FontSize',15);
set(h,'CData',fliplr(rho_estime),'FaceColor','texturemap','EdgeColor','none');
zdir = [1 0 0];
rotate(h,zdir,90);
zdir = [0 1 0];
rotate(h,zdir,180);
zdir = [1 0 0];
rotate(h,zdir,-90);
shading flat;
colormap gray;
axis equal;
axis off;
view(-44,42); % Direction d'observation
rotate3d;
end