diff --git a/TP_maillage.m b/TP_maillage.m index 4b53dcc..71325f8 100644 --- a/TP_maillage.m +++ b/TP_maillage.m @@ -4,50 +4,61 @@ nb_images = 36; % Nombre d'images % chargement des images for i = 1:nb_images - if i<=10 - nom = sprintf('images/viff.00%d.ppm',i-1); + + if i <= 10 + nom = sprintf('images/viff.00%d.ppm', i - 1); else - nom = sprintf('images/viff.0%d.ppm',i-1); + nom = sprintf('images/viff.0%d.ppm', i - 1); end + % L'ensemble des images de taille : nb_lignes x nb_colonnes x nb_canaux % x nb_images - im(:,:,:,i) = imread(nom); + im(:, :, :, i) = imread(nom); end + % chargement des points 2D suivis % pts de taille nb_points x (2 x nb_images) -% sur chaque ligne de pts +% sur chaque ligne de pts % tous les appariements possibles pour un point 3D donne % on affiche les coordonnees (xi,yi) de Pi dans les colonnes 2i-1 et 2i % tout le reste vaut -1 pts = load('viff.xy'); % Chargement des matrices de projection -% Chaque P{i} contient la matrice de projection associee a l'image i +% Chaque P{i} contient la matrice de projection associee a l'image i % RAPPEL : P{i} est de taille 3 x 4 load dino_Ps; % chargement des masques (pour l'elimination des fonds bleus) % de taille nb_lignes x nb_colonnes x nb_images % A COMPLETER quand vous aurez termine la premiere partie permettant de % binariser les images -% ... +% ... % Affichage des images -K = 20; -m = 1; -n = 5; -figure; -subplot(2,2,1); imshow(im(:,:,:,1)); title('Image 1'); +K = 50; +m = 0.1; +n = 3; +q_max = 10; + +figure; +subplot(2, 2, 1); imshow(im(:, :, :, 1)); title('Image 1'); hold on; -germes = super_pixel(im(:,:,:,1), K, m, 0); -scatter(germes(:,2), germes(:,1),'g'); -germes = super_pixel(im(:,:,:,1), K, m, 10); -scatter(germes(:,2), germes(:,1),'r'); +germes = super_pixel(im(:, :, :, 1), K, m, n, q_max); -subplot(2,2,2); imshow(im(:,:,:,9)); title('Image 9'); -subplot(2,2,3); imshow(im(:,:,:,17)); title('Image 17'); -subplot(2,2,4); imshow(im(:,:,:,25)); title('Image 25'); +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); % Affichage des masques associes % figure; @@ -60,36 +71,41 @@ subplot(2,2,4); imshow(im(:,:,:,25)); title('Image 25'); X = []; % Contient les coordonnees des points en 3D color = []; % Contient la couleur associee % Pour chaque coupple de points apparies -for i = 1:size(pts,1) +for i = 1:size(pts, 1) % Recuperation des ensembles de points apparies - l = find(pts(i,1:2:end)~=-1); + l = find(pts(i, 1:2:end) ~= -1); % Verification qu'il existe bien des points apparies dans cette image - if size(l,2) > 1 & max(l)-min(l) > 1 & max(l)-min(l) < 36 + if size(l, 2) > 1 & max(l) - min(l) > 1 & max(l) - min(l) < 36 A = []; R = 0; G = 0; B = 0; % Pour chaque point recupere, calcul des coordonnees en 3D for j = l - A = [A;P{j}(1,:)-pts(i,(j-1)*2+1)*P{j}(3,:); - P{j}(2,:)-pts(i,(j-1)*2+2)*P{j}(3,:)]; - R = R + double(im(int16(pts(i,(j-1)*2+1)),int16(pts(i,(j-1)*2+2)),1,j)); - G = G + double(im(int16(pts(i,(j-1)*2+1)),int16(pts(i,(j-1)*2+2)),2,j)); - B = B + double(im(int16(pts(i,(j-1)*2+1)),int16(pts(i,(j-1)*2+2)),3,j)); + A = [A; P{j}(1, :) - pts(i, (j - 1) * 2 + 1) * P{j}(3, :); + P{j}(2, :) - pts(i, (j - 1) * 2 + 2) * P{j}(3, :)]; + R = R + double(im(int16(pts(i, (j - 1) * 2 + 1)), int16(pts(i, (j - 1) * 2 + 2)), 1, j)); + G = G + double(im(int16(pts(i, (j - 1) * 2 + 1)), int16(pts(i, (j - 1) * 2 + 2)), 2, j)); + B = B + double(im(int16(pts(i, (j - 1) * 2 + 1)), int16(pts(i, (j - 1) * 2 + 2)), 3, j)); end; - [U,S,V] = svd(A); - X = [X V(:,end)/V(end,end)]; - color = [color [R/size(l,2);G/size(l,2);B/size(l,2)]]; + + [U, S, V] = svd(A); + X = [X V(:, end) / V(end, end)]; + color = [color [R / size(l, 2); G / size(l, 2); B / size(l, 2)]]; end; + end; -fprintf('Calcul des points 3D termine : %d points trouves. \n',size(X,2)); + +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); + +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 @@ -105,14 +121,14 @@ axis equal; % A DECOMMENTER ET A COMPLETER % Calcul des barycentres de chacun des tetraedres -% poids = ... -% nb_barycentres = ... +% poids = ... +% nb_barycentres = ... % for i = 1:size(T,1) - % Calcul des barycentres differents en fonction des poids differents - % En commencant par le barycentre avec poids uniformes +% Calcul des barycentres differents en fonction des poids differents +% En commencant par le barycentre avec poids uniformes % C_g(:,i,1)=[ ... -% A DECOMMENTER POUR VERIFICATION +% A DECOMMENTER POUR VERIFICATION % A RE-COMMENTER UNE FOIS LA VERIFICATION FAITE % Visualisation pour vérifier le bon calcul des barycentres % for i = 1:nb_images @@ -127,11 +143,10 @@ axis equal; % end %end - % A DECOMMENTER ET A COMPLETER % Copie de la triangulation pour pouvoir supprimer des tetraedres % tri=T.Triangulation; -% Retrait des tetraedres dont au moins un des barycentres +% Retrait des tetraedres dont au moins un des barycentres % ne se trouvent pas dans au moins un des masques des images de travail % Pour chaque barycentre % for k=1:nb_barycentres diff --git a/super_pixel.asv b/super_pixel.asv new file mode 100644 index 0000000..9f6c354 --- /dev/null +++ b/super_pixel.asv @@ -0,0 +1,124 @@ +function germes = super_pixel(img, K, m, n, q_max) + img = im2double(img); + img = img(1:10, 1:10, :); + + width = size(img, 1); + height = size(img, 2); + N = width * height; + + S = sqrt(N / K); + X = S / 2:S:width; + Y = S / 2:S:height; + germes = zeros(length(X) * length(Y), 5); + c = 1; + + for x = X + + for y = Y + germes(c, :) = [x y 0 0 0]; + c = c + 1; + end + + end + + scatter(germes(:, 2), germes(:, 1), 'g.'); + + c = 1; + + for germe = germes' + + x = germe(1); + y = germe(2); + + xmin = floor(max(x - n, 1)); + interval_x = xmin:min(x + n, width); + + 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); + + x = xmin + nr - 1; + y = ymin + nc - 1; + + germes(c, :) = [x y img(x, y, 1) img(x, y, 2) img(x, y, 3)]; + + c = c + 1; + end + + scatter(germes(:, 2), germes(:, 1), 'r.'); + + germe_per_pixel = zeros(width, height); + + for q = 1:q_max + + for x = 1:width + + for y = 1:height + + % initialisation des minimums + min_Ds = +inf; + + index_germe = 0; + + for germe = germes' + index_germe = index_germe + 1; + + % on récupère les coordonnées du germe + xg = germe(1); + yg = germe(2); + + % on calcule la distance spatiale entre le germe et le pixel + Dxy = norm([x - xg y - yg], 2); + + % si le germe est trop loin on skip + if Dxy > S + continue; + end + + % on récupère les couleurs du germe + rg = germe(3); + gg = germe(4); + bg = germe(5); + + % on récupère les couleurs du pixel + r = img(x, y, 1); + g = img(x, y, 2); + b = img(x, y, 3); + + % on calcule la distance chromatique entre le germe et le pixel + Dlab = norm([r - rg g - gg b - bg], 2); + + % on calcule Ds + Ds = Dlab + m / S * Dxy; + + % Si Ds est meilleur on le prend + if Ds < min_Ds + germe_per_pixel(x, y) = index_germe; + min_DS = Ds; + end + + end + + end + + end + + for index_germe = 1:length(germes) + + truc = germe_per_pixel == index_germe; + truc_rgb = reshape(img(repmat(truc,[1 1 3])), [], 3); + mean(truc_rgb); + mx = 0; + my = 0; + + + end + + scatter(germes(:, 2), germes(:, 1), 'b.'); + + end + +end diff --git a/super_pixel.m b/super_pixel.m index 53ad67d..306b0d9 100644 --- a/super_pixel.m +++ b/super_pixel.m @@ -1,32 +1,130 @@ -function germes = super_pixel(img, K, m, n) - N = size(img, 1) * size(img, 2); +function germes = super_pixel(img, K, m, n, q_max) + img = im2double(img); +% img = img(1:10, 1:10, :); + + width = size(img, 1); + height = size(img, 2); + N = width * height; + S = sqrt(N / K); - X = S/2:S:size(img, 1); - Y = S/2:S:size(img, 2); - germes = zeros(length(X) * length(Y), 2); + X = S / 2:S:width; + Y = S / 2:S:height; + germes = zeros(length(X) * length(Y), 5); c = 1; + for x = X + for y = Y - germes(c,:) = [x y]; + germes(c, :) = [x y 0 0 0]; c = c + 1; end + end - + + scatter(germes(:, 2), germes(:, 1), 'g.'); + c = 1; + for germe = germes' + x = germe(1); y = germe(2); - xmin = max(x - n, 1); - interval_x = xmin:min(x + n, size(img, 1)); - ymin = max(y - n, 1); - interval_y = ymin:min(y + n, size(img, 2)); + + xmin = floor(max(x - n, 1)); + interval_x = xmin:min(x + n, width); + + ymin = floor(max(y - n, 1)); + interval_y = ymin:min(y + n, height); + Gmag = imgradient(img(interval_x, interval_y)); - [~,ind_min] = min(Gmag(:)); + [~, ind_min] = min(Gmag(:)); [nr, nc] = ind2sub(size(Gmag), ind_min); + x = xmin + nr - 1; y = ymin + nc - 1; - germes(c,:) = [x y]; + + germes(c, :) = [x y img(x, y, 1) img(x, y, 2) img(x, y, 3)]; + c = c + 1; end -end + scatter(germes(:, 2), germes(:, 1), 'r.'); + + germe_per_pixel = zeros(width, height); + + for q = 1:q_max + + for x = 1:width + + for y = 1:height + + % initialisation des minimums + min_Ds = 1e5; + + for index_germe = 1:length(germes) + germe = germes(index_germe,:); + + % on récupère les coordonnées du germe + xg = germe(1); + yg = germe(2); + + % on calcule la distance spatiale entre le germe et le pixel + Dxy = norm([x - xg y - yg]); + + % si le germe est trop loin on skip + if Dxy > S + continue; + end + + % on récupère les couleurs du germe + rg = germe(3); + gg = germe(4); + bg = germe(5); + + % on récupère les couleurs du pixel + r = img(x, y, 1); + g = img(x, y, 2); + b = img(x, y, 3); + + % on calcule la distance chromatique entre le germe et le pixel + Dlab = norm([r - rg g - gg b - bg]); + + % on calcule Ds + Ds = Dlab + m / S * Dxy; + + % Si Ds est meilleur on le prend + if Ds < min_Ds + germe_per_pixel(x, y) = index_germe; + min_Ds = Ds; + end + + end + + end + + end + + image(germe_per_pixel); + colormap lines; + + for index_germe = 1:length(germes) + truc = germe_per_pixel == 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]; + end + + scatter(germes(:, 2), germes(:, 1), 'b.'); + + end + +end