Travaux pratique #4 par Philippe Babin

Réchauffement (main_00_do_homography.m)

Appariement manuel (main_01_manuel_tf.m et main_02_manually_set_pts.m)

Explications

Le programme utilise deux scripts: main_01_manuel_tf.m pour créer un panorama et main_02_manually_set_pts.m pour sélectionner les points utilisés. Les étapes pour réaliser un panorama avec des points manuelles sont les suivantes:

Commentaires sur les résultats

Puisque les images ne sont pas parfaitement aligné, on peut voir du "ghosting" et du flou où les images sont superposées. Les images ne sont pas parfaitement aligné à cause du choix des points, du fait que chaque photo ne partage pas exactement le même point de projection, puisque le photographe a dû légèrement déplacer la caméra.

Pour la première image, le résultat est acceptable, les parties les moins flous de l'image centrale sont ceux où des points ont été placé (garde et batiment au loin). Les objets comme le haut du lampadaire et le sac à dos sont flous à cause qu'il ne comporte aucun point.

Pour la seconde image, le résultat est très flou. Les points choisies sont presque tous en arrière-plan. Cela entraine que les arbres et la neige en premier-plan sont très flou. Les objets en arrière-plan ont été utilisé comme point parce qu'ils avaient des coins clairs et visibles.

Pour la troisième image, le résultat est aussi très flou.

Images avec points appariés manuellement
Cliquez pour agrandir
Résultat
Cliquez pour agrandir

Appariement automatique (main_03_auto_tf.m)

Explications

L'algorithme d'appariement automatique est capable de créer un panorama à partir d'un ensemble d'image non-ordonné, dont certaines images forment un panorama ensemble. Il est suggéré de spécifie qu'elle image est l'image fixe, puisque prendre la mauvaise image fixe entraine un panorama avec une taille gigantesque. Voici les étapes de l'algorithme avec une image fixe sélectionné, une description de l'algorithme lorsque ceci n'est pas le cas est présentée plus bas.

  1. Pour chaque image, on detecte les coins en utilisant Harris. Afin de réduire le temps de calcul, on utilise le Adaptative Non-Maximal Suppression pour avoir des coins ayant une densité plus uniforme. Dans la figure suivante, à gauche nous avons les coins détecté par Harris, au centre les 500 points ayant une valeur maximale et à droite les 500 points des meilleurs points d'après ANMS.

    L'avantage d'ANMS est que les zones ayant peu coin comme le ciel auront presque autant de coins qu'une zone ayant beaucoup de coin comme la barrière. Puisque nous cherchons à relier plusieurs images ensembles et que la zone où les deux images entrelace n'est pas connue à l'avance. Il est primordiale que les coins soient distribué de manière uniforme. L'autre avantage de cet algorithme est quel élimine les coins maximales qui sont trop proche l'un de l'autre. L'algorithme est implémenté en calculant la distance euclidienne entre chaque point, garder uniquement les points ayant valeur plus grande et trouver le point ayant la distance minimum.
  2. Pour chaque image, le descripteur de chacun des coins choisies à l'étape précedente est calculé. Tous d'abord l'image est convertie en gris, redimensionné par un facteur 5 et une région de 8x8 est extrait autour du coin. La matrice 8x8 est convertie en vecteur 1x64. Le vecteur est normalisé pour que sa moyenne soit zéro et que son écart type soit 1. Dans la figure suivante, l'image de gauche est l'image original avec une région 40x40 pixels sélectionné, l'image centrale est la sous-région aprés le redimensionnement et l'image de droite est le descripteur après la normalisation:
  3. Pour le matching, l'algorithme commence par la suposition que chaque image partage une bordure avec l'image fixe. La distance euclidienne entre chaque descripteur des deux images est mesuré. Les descripteurs ayant un ratio inférieur à 0.45 entre la distance du meilleur match et la distance du deuxième meilleur match sont considéré un bon match. Si une image a moins de 35 points appariés avec l'image fixe, cette image n'est pas assez entrelacé avec l'image fixe. Elle sera mis dans la liste des images non-appariés. Si au contraire l'image possède assez de points en commum avec l'image fixe, on passe à la prochaine étape.
    Pas assez de match entre les imagesAssez de match avec l'image fixe
  4. Une fois que deux images ont été apparié, il faut éliminer les outliers et trouver l'homographie. Pour ce faire, RANSAC est utilisé. Après plusieurs tests, une distance de 5 pixels a été déterminé comme meilleur distance pour les outliers et 50 itérations donnent une homographie résonable. Une fois les inliners trouvé, on calcule une meilleur homographie avec ceux-ci. Vous pouvez voir dans la figure suivante les points appariés des deux images en rouge et en vert on peut voir les points de l'image de droite après l'homographie.
  5. Rendu à cette étape nous avons l'homographie entre un ensemble d'image et l'image fixe. Pour ce qui est des images de la liste des images non-appariés, nous répétons les étapes 3-4 en utilisant les images appariés au lieu de l'image fixe. L'homographie de ses images corresponds à H_A->f * H_B->A = H_B->f, où H_A->f est l'homographie entre l'image appariée et H_B->A est l'homographie entre l'image non-appariée et l'image appariée. Ainsi, les images non relié au fixe sont relié aux images relié au fixe. Cette étape répété tant qu'il reste des images non-appariées. Si deux itérations partagent la même liste d'images non-appariées, on détermine que ses images sont relié à aucune image du panorama et ils sont éliminés.
  6. Nous avons une liste d'images et une liste d'homographies entre ses images et une image fixe. Il suffit maintenant pour former les images de répété les étapes de la partie sur l'appariement manuelle pour généré les images morphés et les fusionner. Les images suivantes montrent comment étape par étape les images sont rajoutés au panorama. Les images ont été intentionellement désordonné pour montré que l'algorithme n'est pas préoccuper par l'ordre des images.

Commentaires sur les résultats

Le panorama du Golden-Gate est le meilleur résultat du ce travail pratique. Le subjet est très éloigné, les images sont très entrelacé et le subjet à beaucoup de coins. Cela donne une image très peu flou et majestueuse. On peut observé qu'un bateau à passer en dessous du pont pendant que le photographe prenait ses photos, puisqu'il est en partie transparent.

La deuxième image est un parfait exemple de pourquoi il ne faut pas s'approché de 180 degré de champs de vue avec ce genre de projection. La dernière image de droite est très étiré puisqu'elle a été prise à un fort angle par rapport à l'image à l'autre extrémité.

La troisième image a aussi une forte déformation, mais fans son cas cela est dans le bas de l'image. Comme tous les panoramas de ce travail pratique, il y a la présence de "ghosting" aux points où les images sont superposées.

Images avec points appariés automatiquement Résultat
Cliquez pour agrandir

Photos personnelles

Commentaires sur les résultats

Dans le premier panorama, on peut voir que la dernière photo a été exposé à d'avantage de lumière comparé aux autres. Il serait possible de réglé ce problème avec un peu de white balance. Les images sont à plus faible résolution que les images fournient pour le travail pratique, cela entraine un panorama moins flou que les autres.

Le deuxième panorama est beaucoup plus flou que le précédent. Il y a plus de photos prisent pour ce panorama, ce qui entraine plus de ghosting. On peut voir que entre les images, la voiture et les piétons se sont déplacé. Voilà pourquoi ils sont flous.

Images originales
Cliquez pour agrandir
Panorama
Cliquez pour agrandir

Panorama cylindrique (main_04_cylinder.m)

Explications

Une transformation cyclindrique est définie par les équations suivantes (source):

Où (x,y) est la position d'un pixel sur l'image non-déformé et (x',y') est position en pixel de l'image ayant une projection cylindrique. f est la focal en pixel de l'image et (cx,cy) est le centre de l'image. s est un facteur d'échelle, pour avoir une hauteur d'image égale à la hauteur de l'image d'origine, nous utilisons s=f.

Pour trouver la focale de l'image, on extrait la focal en mm de l'entête de l'image et on trouve la largeur du capteur CCD de la camera sur le site du frabriquant (l'entête donne la mauvaise valeur =>1639 pouces!). La focale en pixel correspond à (focal en pixel) = (width)x(focal en mm)/(largeur du capteur CCD). Dans notre cas, la largeur du capteur CCD de la Canon PowerShot SX50 HS était de 6.16mm.

L'image suivante montre l'effet de la transformation sur l'image:

Pour mettre les images ensemblent, il faut trouver la translation entre ceuxi-ci. Pour ce faire, on fait comme à l'étape 1 à 4 de l'appatriment automatique. Pour trouver les coins avec Harris, il faut d'abord redimensionner la taille de l'image par 4, puisque les images du dataset sont très bruitées. Sans cela tous les pixels de l'image sont détectés comme coin.

Pour l'étape de Ransac 2 points sont utilisé au lieu de 4 pour trouver la transformation. Cette étape est très peu stable, puisque la translation des coins n'est pas linéaire s'ils sont aux bordure de l'image.

Pour fusionner les images ensemble, une moyenne pondérée des pixels aux croissements des images est fait.

Commentaires sur les résultats

Le résultat des deux panoramas est super flou, il y a du ghosting partout. Puisque, la translation des points de l'image n'est pas linéaire des fois les coins en avant plan sont utilisés d'autre fois les coins en arrière plan sont utilisés. Cela créer des zones plus flou que d'autre. Pour ce genre de panorama, il est préférable de ne pas avoir de moyenne pondéré.

Avec le panorama coupé, l'image est nette, mais d'importantes discontinuités sont visibles.

Panorama moyenne pondéré
Cliquez pour agrandir
Panorama coupé
Cliquez pour agrandir

Reconnaissance de panorama automatique

L'algorithme de matching supporte la détection automatique. Pour ce faire, le même algorithme que vu dans la partie de l'appariement automatique est utilisé. La différence est que l'image doit être détecté automatiquement au lieu d'être choisi par l'utilisateur. Pour trouver l'image fixe, on créer une matrice du nombre de points matcher entre chaque images. L'image ayant le plus grand nombre d'images qu'elle entrelace est désignée comme image fixe. Deux images sont considérés entrelacé, s'il y a un minimum de point en commun entre les deux images, par défaut 35 points en commun sont nécessaire.

Toutes les autres étapes restent pareil que dans la partie d'appariement automatique. Je n'ai pas vraiment de résultats à présenter, puisqu'il n'y a pas vraiment de différence en ses résultats et ceux de la partie d'appariement automatique.

Le défaut de cette algorithme est qu'il ne va choisir une image fixe qui est centrale, cela peut entrainer des panoramas très déformé.