TP-probabilites/TP3/exercice_1.m
2023-06-10 21:01:20 +02:00

94 lines
3.2 KiB
Matlab

clear;
close all;
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
% Parametres :
set(0,'RecursionLimit',1000); % Pour eviter les erreurs a l'execution
alpha = pi/8; % Seuil sur l'orientation du gradient (en radians)
cos_alpha = cos(alpha);
seuil_norme = 2/sin(alpha); % Seuil sur la norme du gradient (decoule d'une etude theorique)
% Lecture de l'image :
I = imread('Images/Piree.png');
% I = imread('Images/chaises.png');
% I = imread('Images/Morlaix.png');
if size(I,3)==3
I = rgb2gray(I);
end
I = imresize(I,0.8); % Permet de limiter l'effet de crenelage
[nb_lignes,nb_colonnes] = size(I);
% Parametres :
diagonale = floor(sqrt(nb_lignes^2+nb_colonnes^2));
card_max = floor(diagonale/2); % Cardinal max d'un ensemble E
card_min = floor(card_max/20); % Cardinal min d'un ensemble E
% Affichage de l'image :
figure('Name','Ensembles candidats','Position',[0,0,L,0.67*H]);
subplot(1,2,1);
imagesc(I);
axis equal;
axis off;
colormap gray;
hold on;
% Gradient du niveau de gris (x vers la droite, y vers le bas) :
I = double(I);
[G_x,G_y] = gradient(I);
G_norme = sqrt(G_x.^2+G_y.^2);
% Selection des pixels de contour :
contour = G_norme>seuil_norme;
% Pas de pixel de contour sur le bord de l'image (traitement simplifie !) :
contour([1,nb_lignes],:) = 0;
contour(:,[1,nb_colonnes]) = 0;
% Affichage d'une petite fleche sur les pixels de contour :
[i,j] = find(contour); % i, j vecteurs d'indices ou les valeurs de contour sont non nulles
quiver(j,i,G_x(contour),G_y(contour),'r'); % Attention : x = j et y = i
axis equal;
title('Pixels de contour','FontSize',30);
drawnow;
% Boucle de traitement des pixels de contour :
voisins = [ -1 -1 ; -1 0 ; -1 1 ; 0 1 ;...
1 1 ; 1 0 ; 1 -1 ; 0 -1 ]; % Positions relatives des 8 plus proches voisins
liste_E = [];
while any(contour(:))
% Pixel de contour dont la norme du gradient est la plus elevee = "germe" :
indices_contour = find(contour); % indices linéaires des valeurs non nulles de contour
[~,indice_max] = max(G_norme(indices_contour)); % on choppe l'indice de la valeur maximale de la norme du gradient des contours
indice_germe = indices_contour(indice_max); % on se sert de cette indice comme de notre germe
[i_germe,j_germe] = ind2sub(size(I),indice_germe); % on converti notre indice linéaire en coordonnées
E = [i_germe,j_germe]; % on rempli E avec cette première germe
G_somme = [G_x(i_germe,j_germe),G_y(i_germe,j_germe)];
% Construction recursive de l'ensemble E :
[E,contour] = recursion(E,contour,G_somme,i_germe,j_germe,voisins,G_x,G_y,card_max,cos_alpha);
% Ajout de l'ensemble E a la liste d'ensembles E, si son cardinal est superieur a card_min :
if size(E,1)>=card_min
liste_E = [liste_E,{E}]; % Concatenation d'une cellule {E} a liste_E
end
end
% Affichage des ensembles E (la fonction label2rgb donne a chaque ensemble E une couleur differente) :
etiquette = zeros(size(I));
for k = 1:length(liste_E)
E = liste_E{k};
indices_E = sub2ind(size(I),E(:,1),E(:,2));
etiquette(ind2sub(size(I),indices_E)) = k;
end
I_resultat = label2rgb(etiquette,'parula',[0.5,0.5,0.5]);
subplot(1,2,2);
imagesc(I_resultat);
axis equal;
axis off;
title('Ensembles candidats','FontSize',30);
save exercice_1;