TP4: Assemblage de photos

Description du travail

Ce travail consiste à mélanger la forme et la couleur de différents visages.

Partie 0

Pour cette première partie, je me suis fais beaucoup de petites fonctions "helpers" qui vont m'être utiles tout au long de ce travail. Évidamment, la première et la plus importante est "appliqueTransformation(img, H)". Celle-ci applique l'homographie inverse à une image vide de dimension exacte au résultat. Cette technique permet d'éviter les petits trous si on applique l'homographie de façon directe. Pour avoir l'image finale déjà "crop" parfaitement, j'utilise une fonction "dimensionHomographie(img, H)" afin de donner la taille finale en fonction des coins de l'image.

Résultats:


JF de côté

Partie 1

Pour cette partie, 2 fonctions clés entrent en action: "calculerHomographie(p1, p2)" et panorama(img1, img2, pts1, pts2). La première permet de calculer la matrice 3x3 à partir de 2 séries de 4 points correspondant en fonction de leur index. La deuxième permet de calculer l'homographie (image2 -> image1) et de supperposer parfaitement les deux images automatiquement. Comme les points sont acquis manuellement, l'homographique résultante est limitée par la précision des clics de souris. Pour des images avec beaucoup de "features" faciles à localiser et bien dispersés (série 1), les résultats sont plutôt bons. Cependant, avec les séries 2 et 3, il était beaucoup plus difficile d'identifier des bon "features" bien dispersés et le résultat final en souffre. Il est à noter que puisque que chaque homographie trouvée est une approximation, l'erreur s'accumule d'image en image ce que peut créer des discontinuités visibles.

Les points ayant servis au calcul de l'homographique sont marqués par des petits cercles (clic sur les images pour pouvoir les agrandir dans un nouvel onglet).

Résultats:


Panorama de la série 1

Panorama de la série 2

Panorama de la série 3

Partie 2

Cette partie consiste à automatiser le processus de prise de points d'intérêt à l'aide d'un détecteur de coin et de descripteurs. Voici les étapes afin de faire un panorama automatique. Il est à noter que dans tous les cas, j'utilise la photo du centre comme plan de référence.

Étape 1: Détecteur de Harris

Pour détecter les meilleurs points d'intérêt, j'utilise la fonction "cv2.goodFeaturesToTrack" qui est basée entre autre sur le détecteur de Harris mais sur stéroides. Cette fonction possèdes 3 paramètres important. Le premier est la distance minimum entre les points. Le deuxième est le rapport de qualité. Chaque coin détecté se voit attribuer un score. Le rapport de qualité donne le rapport maximal entre le meilleur coin retourné et le moins bon. Le dernier paramètre est le nombre de coins maximum retourné. Selon mes essais, 500 coins, un rapport de 0.00001 et une distance minimale de 10 donne de bons résultats.

Étape 2: Descripteur

Pour chaque coin détecté dans l'étape précédante, on procède au calcul d'un descripteur qui permettera de comparer la ressemblance des points entre les images. Ce descripteur prend une patch de 8 par 8 autour du pixel d'intérêt. Ensuite, une série de calcul permet de créer un vecteur décrivant la relation entre les différents pixels dans la patch. Ce vecteur pourra ensuite être comparé à d'autres afin de trouver un niveau de ressemblance entre deux points.

Étape 3: On trouve des matchs!

Pour chaque coin détecté dans l'étape précédante, on lui cherche un point le plus ressemblant dans l'autre image. Évidamment, il y aura une tonne de faux=positifs puisque les images ne se superposent qu'en partie. Pour enlever la majorité de ces faux positifs, j'élimine les match dont le score est trop bas selon un "threshold". En moyenne, je garde environ de 5 à 15 % des 500 coins originaux.

Étape 4: RANSAC

Et c'est là que la magie commence! On prend 4 index aléatoires et on prend ainsi 4 coins dans chaque image avant d'en calculer l'homographique résultante. Par la suite, j'applique cette homographie à l'ensemble des points et je regarde si les points résultant correspondent aux match que j'avais au départ selon un "threshold" de 4px. Je fais 5000 essais. Si 70% des points sont "d'acoord", j'arrête immédiatement et je garde cette homographie. Généralement, je trouve la meilleur homographie après moins de 100 essais.

Étape 5: On superpose les images

Il suffit alors d'appliquer l'homographie trouvée à l'étape 4 avant de superposer les deux images dans le même plan.

On répète ces étapes pour chaque paire d'images!

Les résultats automatiques sont beaucoup plus fiables que mes piêtres talents à cliquer sur des points. Sur la première série, comme le pont a beaucoup de coins bien espacés, le résultat est très bon et se calcul très rapidement par rapport aux deux autres. Les photos eneigées causent certains problèmes... Les zones de neige offrent difficilement de bon coins ce qui rend difficile le match automatique de points. Plutôt qu'un rapport habituel de 70% de point qui sont "d'accord" avec le RANSAC, j'obtient plutôt 40 à 50% pour les série 2 et 3. Malgré cela, les homographies résultante alignent quand même bien les images entre elles.

Résultats série 1:


Coins dans l'image 1

Coins dans l'image 2

Coins dans l'image 3

Panorama série 1

Résultats série 2:


Coins dans l'image 1

Coins dans l'image 2

Coins dans l'image 3

Panorama série 2

Résultats série 3:


Coins dans l'image 1

Coins dans l'image 2

Coins dans l'image 3

Coins dans l'image 4

Coins dans l'image 5

Coins dans l'image 6

Panorama série 3

Résultats mes photos 1:


Coins dans l'image 1

Coins dans l'image 2

Coins dans l'image 3

Panorama de mes photos!

Résultats mes photos 2:


Coins dans l'image 1

Coins dans l'image 2

Coins dans l'image 3

Panorama de mes photos 2!