feat: ce qui a changé
This commit is contained in:
parent
c10b304631
commit
4e149ed045
|
@ -4,15 +4,18 @@ nb_images = 36; % Nombre d'images
|
||||||
|
|
||||||
% chargement des images
|
% chargement des images
|
||||||
for i = 1:nb_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
|
else
|
||||||
nom = sprintf('images/viff.0%d.ppm',i-1);
|
nom = sprintf('images/viff.0%d.ppm', i - 1);
|
||||||
end
|
end
|
||||||
|
|
||||||
% L'ensemble des images de taille : nb_lignes x nb_colonnes x nb_canaux
|
% L'ensemble des images de taille : nb_lignes x nb_colonnes x nb_canaux
|
||||||
% x nb_images
|
% x nb_images
|
||||||
im(:,:,:,i) = imread(nom);
|
im(:, :, :, i) = imread(nom);
|
||||||
end
|
end
|
||||||
|
|
||||||
% chargement des points 2D suivis
|
% chargement des points 2D suivis
|
||||||
% pts de taille nb_points x (2 x nb_images)
|
% pts de taille nb_points x (2 x nb_images)
|
||||||
% sur chaque ligne de pts
|
% sur chaque ligne de pts
|
||||||
|
@ -32,22 +35,30 @@ load dino_Ps;
|
||||||
|
|
||||||
% Affichage des images
|
% Affichage des images
|
||||||
|
|
||||||
K = 20;
|
|
||||||
m = 1;
|
K = 50;
|
||||||
n = 5;
|
m = 0.1;
|
||||||
|
n = 3;
|
||||||
|
q_max = 10;
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
subplot(2,2,1); imshow(im(:,:,:,1)); title('Image 1');
|
subplot(2, 2, 1); imshow(im(:, :, :, 1)); title('Image 1');
|
||||||
hold on;
|
hold on;
|
||||||
|
|
||||||
germes = super_pixel(im(:,:,:,1), K, m, 0);
|
germes = super_pixel(im(:, :, :, 1), K, m, n, q_max);
|
||||||
scatter(germes(:,2), germes(:,1),'g');
|
|
||||||
germes = super_pixel(im(:,:,:,1), K, m, 10);
|
|
||||||
scatter(germes(:,2), germes(:,1),'r');
|
|
||||||
|
|
||||||
subplot(2,2,2); imshow(im(:,:,:,9)); title('Image 9');
|
subplot(2, 2, 2); imshow(im(:, :, :, 9)); title('Image 9');
|
||||||
subplot(2,2,3); imshow(im(:,:,:,17)); title('Image 17');
|
hold on;
|
||||||
subplot(2,2,4); imshow(im(:,:,:,25)); title('Image 25');
|
|
||||||
|
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
|
% Affichage des masques associes
|
||||||
% figure;
|
% figure;
|
||||||
|
@ -60,36 +71,41 @@ subplot(2,2,4); imshow(im(:,:,:,25)); title('Image 25');
|
||||||
X = []; % Contient les coordonnees des points en 3D
|
X = []; % Contient les coordonnees des points en 3D
|
||||||
color = []; % Contient la couleur associee
|
color = []; % Contient la couleur associee
|
||||||
% Pour chaque coupple de points apparies
|
% Pour chaque coupple de points apparies
|
||||||
for i = 1:size(pts,1)
|
for i = 1:size(pts, 1)
|
||||||
% Recuperation des ensembles de points apparies
|
% 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
|
% 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 = [];
|
A = [];
|
||||||
R = 0;
|
R = 0;
|
||||||
G = 0;
|
G = 0;
|
||||||
B = 0;
|
B = 0;
|
||||||
% Pour chaque point recupere, calcul des coordonnees en 3D
|
% Pour chaque point recupere, calcul des coordonnees en 3D
|
||||||
for j = l
|
for j = l
|
||||||
A = [A;P{j}(1,:)-pts(i,(j-1)*2+1)*P{j}(3,:);
|
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,:)];
|
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));
|
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));
|
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));
|
B = B + double(im(int16(pts(i, (j - 1) * 2 + 1)), int16(pts(i, (j - 1) * 2 + 2)), 3, j));
|
||||||
end;
|
end;
|
||||||
[U,S,V] = svd(A);
|
|
||||||
X = [X V(:,end)/V(end,end)];
|
[U, S, V] = svd(A);
|
||||||
color = [color [R/size(l,2);G/size(l,2);B/size(l,2)]];
|
X = [X V(:, end) / V(end, end)];
|
||||||
|
color = [color [R / size(l, 2); G / size(l, 2); B / size(l, 2)]];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
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
|
%affichage du nuage de points 3D
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
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;
|
end;
|
||||||
|
|
||||||
axis equal;
|
axis equal;
|
||||||
|
|
||||||
% A COMPLETER
|
% A COMPLETER
|
||||||
|
@ -108,8 +124,8 @@ axis equal;
|
||||||
% poids = ...
|
% poids = ...
|
||||||
% nb_barycentres = ...
|
% nb_barycentres = ...
|
||||||
% for i = 1:size(T,1)
|
% for i = 1:size(T,1)
|
||||||
% Calcul des barycentres differents en fonction des poids differents
|
% Calcul des barycentres differents en fonction des poids differents
|
||||||
% En commencant par le barycentre avec poids uniformes
|
% En commencant par le barycentre avec poids uniformes
|
||||||
% C_g(:,i,1)=[ ...
|
% C_g(:,i,1)=[ ...
|
||||||
|
|
||||||
% A DECOMMENTER POUR VERIFICATION
|
% A DECOMMENTER POUR VERIFICATION
|
||||||
|
@ -127,7 +143,6 @@ axis equal;
|
||||||
% end
|
% end
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
|
||||||
% A DECOMMENTER ET A COMPLETER
|
% A DECOMMENTER ET A COMPLETER
|
||||||
% Copie de la triangulation pour pouvoir supprimer des tetraedres
|
% Copie de la triangulation pour pouvoir supprimer des tetraedres
|
||||||
% tri=T.Triangulation;
|
% tri=T.Triangulation;
|
||||||
|
|
124
super_pixel.asv
Normal file
124
super_pixel.asv
Normal file
|
@ -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
|
124
super_pixel.m
124
super_pixel.m
|
@ -1,32 +1,130 @@
|
||||||
function germes = super_pixel(img, K, m, n)
|
function germes = super_pixel(img, K, m, n, q_max)
|
||||||
N = size(img, 1) * size(img, 2);
|
img = im2double(img);
|
||||||
|
% img = img(1:10, 1:10, :);
|
||||||
|
|
||||||
|
width = size(img, 1);
|
||||||
|
height = size(img, 2);
|
||||||
|
N = width * height;
|
||||||
|
|
||||||
S = sqrt(N / K);
|
S = sqrt(N / K);
|
||||||
X = S/2:S:size(img, 1);
|
X = S / 2:S:width;
|
||||||
Y = S/2:S:size(img, 2);
|
Y = S / 2:S:height;
|
||||||
germes = zeros(length(X) * length(Y), 2);
|
germes = zeros(length(X) * length(Y), 5);
|
||||||
c = 1;
|
c = 1;
|
||||||
|
|
||||||
for x = X
|
for x = X
|
||||||
|
|
||||||
for y = Y
|
for y = Y
|
||||||
germes(c,:) = [x y];
|
germes(c, :) = [x y 0 0 0];
|
||||||
c = c + 1;
|
c = c + 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scatter(germes(:, 2), germes(:, 1), 'g.');
|
||||||
|
|
||||||
c = 1;
|
c = 1;
|
||||||
|
|
||||||
for germe = germes'
|
for germe = germes'
|
||||||
|
|
||||||
x = germe(1);
|
x = germe(1);
|
||||||
y = germe(2);
|
y = germe(2);
|
||||||
xmin = max(x - n, 1);
|
|
||||||
interval_x = xmin:min(x + n, size(img, 1));
|
xmin = floor(max(x - n, 1));
|
||||||
ymin = max(y - n, 1);
|
interval_x = xmin:min(x + n, width);
|
||||||
interval_y = ymin:min(y + n, size(img, 2));
|
|
||||||
|
ymin = floor(max(y - n, 1));
|
||||||
|
interval_y = ymin:min(y + n, height);
|
||||||
|
|
||||||
Gmag = imgradient(img(interval_x, interval_y));
|
Gmag = imgradient(img(interval_x, interval_y));
|
||||||
[~,ind_min] = min(Gmag(:));
|
[~, ind_min] = min(Gmag(:));
|
||||||
[nr, nc] = ind2sub(size(Gmag), ind_min);
|
[nr, nc] = ind2sub(size(Gmag), ind_min);
|
||||||
|
|
||||||
x = xmin + nr - 1;
|
x = xmin + nr - 1;
|
||||||
y = ymin + nc - 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;
|
c = c + 1;
|
||||||
end
|
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
|
||||||
|
|
Loading…
Reference in a new issue