TP4: Panoramas automatiques, par Louis Bourdages

Introduction et fonctionnement

Le but du TP3 est d'implémenter un algorithme qui permet de générer automatiquement des panoramas à l'aide d'un ensemble d'images.


Implémentation

Il est à noter que la partie 1 n'a été implémentée que partiellement (pour deux images seulement). Entrer les points à la main est laborieux et somme toute imprécis; il était plus pertinent de se concentrer sur la partie 2.

La première portion du script consiste en l'importation des images et du fichier de transformations. Ce fichier (utilisé pour simplifier le projet, qui était assez lourd) spécifie quelles images sont déformées vers quelles autres images. Il ne contient pas de matrices de transformation ou autre information du genre.

Puis, les points "intéressants" des images sont détectés avec la fonction Harris modifiée pour utiliser le Adaptive Non-Maximal Suppression. Il s'agit simplement d'un filtre qui se déplace sur l'image et trouve le pixel le plus "fort" dans chaque bloc. La taille du filtre est augmentée jusqu'à ce que le nombre de points jugés valides soit inférieure au seuil spécifié (ici, 500).

On calcule ensuite les descripteurs pour chacun des ensembles de points. Un voisinage de 40 x 40 pixels (dont le point d'intérêt est au milieu) est sélectionné, puis redimensionné d'un facteur 0.2 pour avoir un descripteur de taille 8x8. Enfin, les descripteurs sont normalisés (avec une moyenne nulle et un écart type de 1) et enregistrés sous la forme d'un vecteur colonne 64 x 1.

Ensuite, les descripteurs sont appariés entre eux à l'aide de la fonction dist2. Ceux dont l'écart est en dessous d'un certain seuil (ici, 5) sont considérés comme une paire valide. Il est à noter que rien n'empêche qu'un point soit apparié avec plus d'un point.

Les homographies sont ensuite calculées à l'aide de RANSAC. Il s'agit d'une implémentation tout à fait classique; 4 points sont tirés au hasard, et utilisés pour calculer une homographie. Les points de l'image source sont transformés à l'aide de la matrice, puis comparés avec les points de l'image de destination. L'écart (distance euclidienne) entre le point calculé et le point théorique est calculé et ceux en dessous d'un certain seuil (ici, 5) sont considérés comme valides. Ces étapes sont répétées 100 000 fois et la matrice dont le taux de points valide est le plus élevé est conservée. Une homographie plus précise est calculée avec les points valides.

Avant la transformation, on doit chaîner les matrices d'homographie. La fonction lit le fichier de transformations, détermine quelles homographies doivent être utilisées et les multiplie ensemble. La matrice qui est retournée est utilisée par la fonction warpImage. Celle-ci fonctionne de manière semblable à la fonction morph du TP3: la taille de l'image de destination est calculée en utilisant les quatre coins de l'image source et la matrice d'homographie. Puis, on génère une grille de coordonnées avec la fonction meshgrid et on transforme ces coordonnées avec la matrice inverse, afin d'obtenir la source pour chaque pixel de l'image résultante. Finalement, les valeurs des pixels sont calculées avec la fonction interp3.

Finalement, les images sont collées ensemble pour en former une nouvelle. La fonction warpImage retourne les coordonnées "virtuelles" des quatre coins de l'image transformée. Ces coordonnées sont utilisées pour calculer des offsets spécifiant où l'on doit placer le coin (1,1) de chacune des images dans la nouvelle image, de même que la taille de la nouvelle image. Finalement, les images sont moyennées avec la fonction nanmean, ce qui permet d'ignorer les parties des images ne comportant pas d'information (en dehors du domaine de l'image à proprement parler).



Résultat

L'algorithme fonctionne partiellement. On note plusieurs choses dans cette image. La première, que je n'ai pas utilisé le panorama au complet. Si j'essayais avec une projection planaire, les images des extrémités devenaient gigantesques (plus de 20 000 pixels de large) et mon ordinateur n'a que 4 Go de mémoire vive, ce qui rend les calculs impossibles. J'ai dû redémarrer mon ordinateur de nombreuses fois durant le débogage.

Deuxièmement, même en ignorant les images des extrémités, le panorama ne s'est pas effectué correctement. Pour une raison obscure, l'appariement entre les images 6 et 1 se fait mal et l'homographie calculée, même avec RANSAC, est mauvaise. Si vous regardez attentivement dans le coin supérieur gauche, vous pourrez voir les images, qui sont minuscules et retournées à 45 degrés.

Dernière chose, on remarque que les estrades sont mieux alignés que la clôture. Cela est dû au fait que l'algorithme a choisi très peu de points dans la clôture. Étonamment, parfois, des points dans le ciel ou dans la neige sont reconnus à travers plusieurs images, même si on ne voit pas grand chose. J'imagine que cela est dû au fait que les ordinateurs et les appareils photos ne voient pas la lumière de façon logarithmique comme nous, et que pour l'algo, il y a bel et bien une variation importante à cet endroit.