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,15 +4,18 @@ 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);
else
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);
end
% chargement des points 2D suivis
% pts de taille nb_points x (2 x nb_images)
% sur chaque ligne de pts
@ -32,22 +35,30 @@ load dino_Ps;
% Affichage des images
K = 20;
m = 1;
n = 5;
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');
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;
@ -77,19 +88,24 @@ for i = 1:size(pts,1)
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)]];
end;
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;
% A COMPLETER
@ -127,7 +143,6 @@ axis equal;
% end
%end
% A DECOMMENTER ET A COMPLETER
% Copie de la triangulation pour pouvoir supprimer des tetraedres
% tri=T.Triangulation;

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(:));
[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
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