feat: ce qui a changé
This commit is contained in:
parent
c10b304631
commit
4e149ed045
|
@ -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
|
||||
|
|
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
|
126
super_pixel.m
126
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
|
||||
|
|
Loading…
Reference in a new issue