100 lines
3.4 KiB
Mathematica
100 lines
3.4 KiB
Mathematica
|
% Calcul d'une mosaique d'image à partir de 2 images : I1 et I2
|
||
|
% connaissant l'homographie H entre les 2.
|
||
|
% L'image resultat est stockee dans Res.
|
||
|
% On choisit de projeter I2 dans I1 pour construire la mosaique.
|
||
|
% Attention !!!
|
||
|
% On suppose un axe de rotation parallèle aux colonnes.
|
||
|
% C'est la raison pour laquelle on inverse les lignes et les colonnes
|
||
|
% dans la reconstruction de la mosaique.
|
||
|
|
||
|
function [Imos] = mosaique(I1, I2, H)
|
||
|
|
||
|
% On recupere la taille des deux images.
|
||
|
[nblI1 nbcI1] = size(I1);
|
||
|
[nblI2 nbcI2] = size(I2);
|
||
|
|
||
|
% On calcule l'homographie inverse, normalisee,
|
||
|
% pour nous permettre d'effectuer la transformation de I2 vers I1.
|
||
|
Hinv = inv(H);
|
||
|
Hinv = Hinv ./ Hinv(3, 3);
|
||
|
|
||
|
% Calcul des dimensions de la mosaique.
|
||
|
% Calcul des quatre coins dans l'image 2.
|
||
|
% les coins de l'image 2 sont ranges en ligne selon :
|
||
|
% haut_gauche, haut_droit, bas_droit, bas gauche.
|
||
|
% Lignes et colonnes sont inversees.
|
||
|
xy_coinsI2_R2 = [1 1; nbcI2 1; nbcI2 nblI2; 1 nblI2];
|
||
|
|
||
|
% Application de l'homographie Hinv sur ces coins.
|
||
|
% Calcul des images des coins dans I1.
|
||
|
xy_coinsI2_R1 = appliquerHomographie(Hinv, xy_coinsI2_R2);
|
||
|
|
||
|
% Determination des dimensions de l'image mosaique,
|
||
|
% les xmin ymin xmax ymax, ou :
|
||
|
% - xmin represente la plus petite abscisse parmi les abscisses des images
|
||
|
% des coins de I2 projetes dans I1 et les coins dans I1,
|
||
|
% - etc
|
||
|
% Lignes et colonnes sont inversees.
|
||
|
|
||
|
xmin = min([xy_coinsI2_R1(:, 1)' 1]);
|
||
|
ymin = min([xy_coinsI2_R1(:, 2)' 1]);
|
||
|
xmax = max([xy_coinsI2_R1(:, 1)' nbcI1]);
|
||
|
ymax = max([xy_coinsI2_R1(:, 2)' nblI1]);
|
||
|
|
||
|
% On arrondit de maniere a etre certain d'avoir les coordonnees initiales
|
||
|
% bien comprises dans l'image.
|
||
|
xmin = floor(xmin);
|
||
|
ymin = floor(ymin);
|
||
|
xmax = ceil(xmax);
|
||
|
ymax = ceil(ymax);
|
||
|
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
% CONTRUCTION DE LA MOSAIQUE %
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
|
||
|
% Calcul de la taille de la mosaique.
|
||
|
% Lignes et colonnes sont inversees.
|
||
|
nblImos = ymax - ymin + 1;
|
||
|
nbcImos = xmax - xmin + 1;
|
||
|
|
||
|
Imos = zeros(nblImos, nbcImos);
|
||
|
|
||
|
% Calcul de l'origine de l'image I1 dans le repere de la mosaique Imos.
|
||
|
O1x_Rmos = 1 - (xmin - 1);
|
||
|
O1y_Rmos = 1 - (ymin - 1);
|
||
|
|
||
|
% Copie de l'image I1.
|
||
|
% Lignes et colonnes sont inversees.
|
||
|
Imos(O1y_Rmos:O1y_Rmos + nblI1 - 1, O1x_Rmos:O1x_Rmos + nbcI1 - 1) = I1;
|
||
|
|
||
|
% Copie de l'image I2 transformee par l'homographie H.
|
||
|
for x = 1:nbcImos,
|
||
|
|
||
|
for y = 1:nblImos,
|
||
|
% Calcul des coordonnees dans I1 connaissant les coordonnees du point origine de I1 dans Imos.
|
||
|
y_R1 = y - O1y_Rmos;
|
||
|
x_R1 = x - O1x_Rmos;
|
||
|
% Dans le repere attache a l'image I1,
|
||
|
% nous estimons les coordonnees du point image de (y_R1,x_R1)
|
||
|
% par l'homographie H : (xy_R2).
|
||
|
xy_R2 = appliquerHomographie(H, [x_R1 y_R1]);
|
||
|
|
||
|
% Il existe plusieurs strategies, mais, ici,
|
||
|
% pour estimer les coordonnees (entieres) ,
|
||
|
% on choisit : sans interpolation, le plus proche voisin.
|
||
|
x_R2 = round(xy_R2(1));
|
||
|
y_R2 = round(xy_R2(2));
|
||
|
|
||
|
% On verifie que xy_R2 appartient bien a l'image I2
|
||
|
% avant d'affecter cette valeur a Imos
|
||
|
% Lignes et colonnes sont inversees.
|
||
|
if (x_R2 >= 1 & x_R2 <= nbcI2 & y_R2 >= 1 & y_R2 <= nblI2)
|
||
|
Imos(y, x) = I2(y_R2, x_R2);
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
end
|