From 678874bd75c0d624238f93dfa0da8b2b9867c186 Mon Sep 17 00:00:00 2001 From: Damien Guillotin Date: Tue, 22 Mar 2022 09:53:17 +0100 Subject: [PATCH] feat: binarisation pas degueu mais quand meme un peu ^^' --- TP_maillage.m | 80 +++++++++++++++++++++++++++++++++++++-------------- super_pixel.m | 51 ++++++++++++++++++++++++-------- 2 files changed, 98 insertions(+), 33 deletions(-) diff --git a/TP_maillage.m b/TP_maillage.m index 71325f8..8f92512 100644 --- a/TP_maillage.m +++ b/TP_maillage.m @@ -35,30 +35,68 @@ load dino_Ps; % Affichage des images - +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% A COMPLETER % +% Calculs des superpixels % +% Conseil : afficher les germes + les régions % +% à chaque étape / à chaque itération % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% K = 50; m = 0.1; n = 3; -q_max = 10; +seuil_E = 10; +q_max = 20; figure; -subplot(2, 2, 1); imshow(im(:, :, :, 1)); title('Image 1'); +% subplot(2, 2, 1); +imshow(im(:, :, :, 9)); title('Image 1'); + +figure; +imshow(im(:, :, :, 9)); title('Image 1'); hold on; +[germes, image_labelise, E] = super_pixel(im(:, :, :, 9), K, m, n, seuil_E, q_max); -germes = super_pixel(im(:, :, :, 1), K, m, n, 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); -subplot(2, 2, 2); imshow(im(:, :, :, 9)); title('Image 9'); -hold on; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% A COMPLETER % +% Binarisation de l'image à partir des superpixels % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -germes = super_pixel(im(:, :, :, 9), K, m, n, q_max); -subplot(2, 2, 3); imshow(im(:, :, :, 17)); title('Image 17'); -hold on; +figure; +R = germes(:,3); +B = germes(:,5); +scatter(R, B); -germes = super_pixel(im(:, :, :, 17), K, m, n, q_max); -subplot(2, 2, 4); imshow(im(:, :, :, 25)); title('Image 25'); -hold on; +W = germes(:,3) > 0.5; +germes = [germes W]; -germes = super_pixel(im(:, :, :, 25), K, m, n, q_max); +figure; +imagesc(reshape(germes(image_labelise, 6), size(im,1), [])); + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% A FAIRE SI VOUS UTILISEZ LES MASQUES BINAIRES FOURNIS % +% Chargement des masques binaires % +% de taille nb_lignes x nb_colonnes x nb_images % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ... + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% A DECOMMENTER ET COMPLETER % +% quand vous aurez les images segmentées % +% Affichage des masques associes % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Affichage des masques associes % figure; @@ -99,14 +137,14 @@ 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; +% 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 diff --git a/super_pixel.m b/super_pixel.m index 306b0d9..6736d52 100644 --- a/super_pixel.m +++ b/super_pixel.m @@ -1,11 +1,11 @@ -function germes = super_pixel(img, K, m, n, q_max) +function [germes, img_labelise, E] = super_pixel(img, K, m, n, seuil_E, q_max) img = im2double(img); -% img = img(1:10, 1:10, :); width = size(img, 1); height = size(img, 2); N = width * height; + % création des germes S = sqrt(N / K); X = S / 2:S:width; Y = S / 2:S:height; @@ -21,10 +21,13 @@ function germes = super_pixel(img, K, m, n, q_max) end + % affichage des germes scatter(germes(:, 2), germes(:, 1), 'g.'); + drawnow nocallbacks c = 1; + % intialisation des germes (petit déplacement, pour ne pas se trouver sur un contour) for germe = germes' x = germe(1); @@ -35,7 +38,7 @@ function germes = super_pixel(img, K, m, n, q_max) ymin = floor(max(y - n, 1)); interval_y = ymin:min(y + n, height); - + Gmag = imgradient(img(interval_x, interval_y)); [~, ind_min] = min(Gmag(:)); [nr, nc] = ind2sub(size(Gmag), ind_min); @@ -48,10 +51,17 @@ function germes = super_pixel(img, K, m, n, q_max) c = c + 1; end + % affichage des germes scatter(germes(:, 2), germes(:, 1), 'r.'); + drawnow nocallbacks - germe_per_pixel = zeros(width, height); + % création de l'image labelisée par les germes + img_labelise = zeros(width, height); + % mélange mélange mélange + germes = germes(randperm(length(germes)),:); + + % boucle princiaple for q = 1:q_max for x = 1:width @@ -62,7 +72,7 @@ function germes = super_pixel(img, K, m, n, q_max) min_Ds = 1e5; for index_germe = 1:length(germes) - germe = germes(index_germe,:); + germe = germes(index_germe, :); % on récupère les coordonnées du germe xg = germe(1); @@ -94,7 +104,7 @@ function germes = super_pixel(img, K, m, n, q_max) % Si Ds est meilleur on le prend if Ds < min_Ds - germe_per_pixel(x, y) = index_germe; + img_labelise(x, y) = index_germe; min_Ds = Ds; end @@ -103,27 +113,44 @@ function germes = super_pixel(img, K, m, n, q_max) end end - - image(germe_per_pixel); - colormap lines; + % affichage des labels + image(img_labelise * 255 / length(germes)); + colormap hsv; + drawnow nocallbacks + + old_germes = germes; + + % kmeans, déplacement des germes par rapport à leurs pixels associés for index_germe = 1:length(germes) - truc = germe_per_pixel == index_germe; - truc_rgb = reshape(img(repmat(truc,[1 1 3])), [], 3); + truc = img_labelise == index_germe; + truc_rgb = reshape(img(repmat(truc, [1 1 3])), [], 3); m_rgb = mean(truc_rgb); mx = 0; my = 0; + for i = find(truc == 1)' [x, y] = ind2sub(size(img), i); mx = mx + x; my = my + y; end + mx = mx / sum(truc, 'all'); my = my / sum(truc, 'all'); - germes(index_germe,:) = [mx my m_rgb]; + germes(index_germe, :) = [mx my m_rgb]; end + % affichage des germes scatter(germes(:, 2), germes(:, 1), 'b.'); + drawnow nocallbacks + + % calcul de l'erreur résiduel + E = norm(old_germes(:, 1:2) - germes(:, 1:2)); + + % si notre erreur est inférieur au seuil, on stop l'algo + if E < seuil_E + break + end end