89 lines
2.2 KiB
Matlab
Executable file
89 lines
2.2 KiB
Matlab
Executable file
clear;
|
|
close all;
|
|
|
|
couleurs_classes = [0 0.1250 1.0 ; 0.1750 1.0 0.2250 ; 1.0 1.0 0 ; 1.0 0.3750 0 ; 0.85 0 0 ; 0.5 0 0.3 ; 0.5 0.5 0.1];
|
|
|
|
delete("saves/recuit_exo3.gif");
|
|
|
|
% Paramètres de la méthode de segmentation :
|
|
T_0 = 1.0;
|
|
alpha = 0.99;
|
|
q_max = 50;
|
|
beta = 50.0;
|
|
|
|
% Lecture et affichage de l'image RVB a segmenter :
|
|
nb_pixels_max = 200^2;
|
|
I = imread('cellules.jpg');
|
|
[nb_lignes,nb_colonnes,nb_canaux] = size(I);
|
|
if nb_lignes*nb_colonnes>nb_pixels_max
|
|
I = imresize(I,0.5);
|
|
[nb_lignes,nb_colonnes,nb_canaux] = size(I);
|
|
end
|
|
I = double(I);
|
|
I = I/max(I(:));
|
|
fig = figure('Name',['Segmentation par classification']);
|
|
% subplot(1,2,1);
|
|
imagesc(I);
|
|
% title('Image a segmenter');
|
|
axis equal;
|
|
axis off;
|
|
|
|
% Estimation des paramètres des N classes :
|
|
N = 3;
|
|
[moyennes,variances_covariances] = estimation_RVB(I,N,couleurs_classes, fig);
|
|
|
|
% Calcul de l'attache aux données (vraisemblance) :
|
|
AD = attache_donnees_RVB(I,moyennes,variances_covariances);
|
|
|
|
export_fig(gcf, "saves/exo3expert.png", '-png', '-painters', '-m2');
|
|
|
|
% Initialisation des classes :
|
|
couleurs_pixels = zeros(nb_lignes,nb_colonnes,3);
|
|
[U,k] = min(AD,[],3);
|
|
for i = 1:nb_lignes
|
|
for j = 1:nb_colonnes
|
|
couleurs_pixels(i,j,:) = couleurs_classes(k(i,j),:);
|
|
end
|
|
end
|
|
% subplot(1,2,2);
|
|
figure;
|
|
imagesc(couleurs_pixels);
|
|
axis equal;
|
|
axis off;
|
|
% title('Maximum de vraisemblance');
|
|
fprintf('Tapez un caractere pour lancer le recuit simule\n');
|
|
[fimage, map] = rgb2ind(couleurs_pixels, 256);
|
|
imwrite(fimage, map, "saves/exo3mv.png");
|
|
|
|
% Calcul de l'énergie initiale :
|
|
for i = 1:nb_lignes
|
|
for j = 1:nb_colonnes
|
|
U(i,j) = U(i,j)+beta*regularisation(i,j,k,k(i,j));
|
|
end
|
|
end
|
|
|
|
% Minimisation de l'énergie par recuit simulé :
|
|
temps_affichage = 0.05;
|
|
T = T_0;
|
|
for q = 1:q_max
|
|
|
|
% Boucle du recuit simulé :
|
|
[U,k] = recuit_simule(U,k,AD,T,beta);
|
|
|
|
% Mise à jour de l'affichage :
|
|
for i = 1:nb_lignes
|
|
for j = 1:nb_colonnes
|
|
couleurs_pixels(i,j,:) = couleurs_classes(k(i,j),:);
|
|
end
|
|
end
|
|
imagesc(couleurs_pixels);
|
|
axis equal;
|
|
axis off;
|
|
% title(['Recuit simule : iteration ' num2str(q) '/' num2str(q_max)]);
|
|
pause(temps_affichage);
|
|
|
|
export_fig(gcf, "saves/recuit_exo3.gif", '-png', '-painters', '-m2', '-append');
|
|
% Mise à jour de la température :
|
|
T = alpha*T;
|
|
end
|