103 lines
3 KiB
Matlab
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
|