H
qui permette de déformer une image pour qu'elle se superpose avec une autre. Pour cela, on travaille avec deux jeux de coordonnées de n points correspondants P1
et P2
. Il est important de souligner qu'il faut que P1 et P2 soient exprimées en coordonnées homogènes, ce sont donc des matrices nx3 dont la première colonne représente les coordonnées x, la deuxième ligne les coordonnées y et la troisième ligne n'est composé que de 1. On cherche donc H
telle que P1H = P2
. La matrice H
a 8 inconnues (9 éléments dont un facteur d'échelle). On pose le problème sous la forme Ah = b
avec h
un vecteur contenant les 8 inconnues. Pour trouver A et b il suffit de poser les équations qui sont donné par les points de correspondances. On trouve que les matrices seront de la forme:
|
h = |
|
Q = ||b - A*h||^2
. On a :Q = (b-A*h)'*(b-A*h) = b'*b -b'*A*h-h'*A'*b+h'*A'*A*h
.H
qui minimise Q
, on cherche à résoudre dQ/dh=0
:
dQ/dh=0 <=> 2A'*A*h-2A'b = 0 <=> A'*A*h = A'*b <=> h = inv(A'*A)*A'*b
.
H
. La matrices H
seront calculées ainsi pour toutes les paires de points correspondants. Les points obtenus en multipliant un ensemble de points par H auront besoin d'être normalisés, c'est à dire qu'il faut que la troisième colonne des coordonnées homogènes de l'ensemble de points ne soit constituée que de 1. Pour cela on divise chaque colonne par la troisième colonne (il ne faut pas considérer les éventuels points dont la troisième coordonnée est nulle) H
sont calculées, nous pouvons déformer une image pour la superposer à une autre image. Pour cela, nous avons créé une fonction warpImage
qui, à partir d'une image et une homographie, renvoie l'image transformée par l'homographie. La première chose à connaître pour déformer une image est la taille de l'image déformée. Pour cela il suffit de calculer la projection des coins de l'image et de calculer la différence entre le minimum et le maximum des coordonnées. Nous avons choisi d'effectuer la transformation inverse, c'est à dire que pour chaque pixel de l'image de sortie, on va regarder la valeur correspondante dans l'image d'entrée. Pour cella on crée un vecteurs contenant toutes les coordonnées de l'image de sortie et on calcule sa transformation par H-1
. On ne considèrera que les points dont la transformation est à l'intérieur de l'image de départ. Les coordonnées ne seront presque jamais des nombres entiers, il faudra alors calculer une interpolation linéaire sur l'image pour estimer les valeurs des canaux R, G et B pour des valeurs subpixelique. Ci-dessous nous présentons deux déformations de Lenna. La première est obtenue avec une homographie qui correspond à une rotation de 45° et la seconde est une homographie faisant intervenir plusieurs paramètres.
Hi->i+2 = Hi->i+1*Hi+1->i+2
et l'homographie de l'image i+2 à l'image i est donné par l'inverse de cette matrice. Nous avons choisi de projeter toutes les images vers l'image centrale. Cependant pour projeter toutes les images sur un même plan il est nécessaire que le champ de vue du panorama soit inférieur à 180°. Les panorama du TP ont tous un champ de vue suppérieur à 180°. Nous les avons donc séparées en deux pour les deux premiers panoramas et nous avons pris 1/3 des images du panorama 3. De plus pour que le traitement soit plus rapide et pour éviter les complications dues à des mauvaises estimations d'homographies, nous projetons, l'image finale vers une image dont la dimension maximum est 2048 pixels. Nous n'avons effectué ce traitement que sur le panorama 2 et les panoramas des crédits supplémentaires. Voici les résultats obtenus pour les panoramas du TP.
fHM(X) = det M(X) / tr M(X)
avec M qui est le produit dyadique des gradients de X lissé par une Gaussienne. Enfin, les maximums locaux de fHM
sont gardés en tant que points d'intérêts. Ce traitement permet d'obtenir beaucoup de points d'intérêts. Cependant il sera préférable de diminuer ce nombre de points d'intérêt pour réduire les temps de calculs d'appariement. La première idée est de garder les points d'intérêts ayant obtenus les meilleurs score pour fHM
. L'inconvénient de cette technique est que l'on risque de garder des points très proches et donc difficilement différenciables lors de la recherche d'appariements. Nous avons donc programmé la répression maximale non adaptative (ANMS) proposé dans l'article "Multi-Image Matching using Multi-Scale Oriented Patches" de Brown et al. Cette méthode permet de garder des points d'intérêts bien espacés dans l'image. La première étape de de cette méthode est de garder le point maximisant le poids fHM
, ensuite pour chaque points d'intérêts, on calcule r
, la distance minimum aux autres points en ne considérant que ceux qui ont un poids 1.1 fois supérieur a celui du pixel considéré. On ne garde ensuite les pixels qui ont obtenus les plus grandes distances r
.
500 points maximisant fHM |
---|
SSD(p',Hp) < eps
avec SSD
la somme des différences au carré et eps
un seuil que nous avons choisi à 1 pour ne garder que les appariements qui sont justes à un pixel près. Lorsqu’on applique ce traitement aux points appareillés obtenus dans l'exemple précédent, on supprime 5 appariements (voir image ci-dessous).