feat: ce qui a changé

This commit is contained in:
gdamms 2022-03-22 08:13:49 +01:00
parent c10b304631
commit 4e149ed045
3 changed files with 291 additions and 54 deletions

View file

@ -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
View 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

View file

@ -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