TP1: Alignement d'images

«Le but de ce travail est de générer automatiquement une image couleur à partir des plaques de verre numérisées de la collection Prokudin-Gorskii, et ce, avec le minimum d'artefacts visuels possible. Pour ce faire, il vous faudra extraire les trois canaux de couleurs, les chevaucher l'un "par-dessus" l'autre, et les aligner pour que leur combinaison forme une image couleur RGB. Dans ce TP, nous ferons l'hypothèse qu'un simple modèle de translation (en x,y) est suffisant pour aligner les images correctement. Par contre, puisque les plaques de verre sont de très grande taille, votre procédure d'alignement devra être rapide et efficace.»

1. Approche à une seule échelle

Fichier pincipale: main_single.m

Afin d'aligner les différents canaux, la fonction fitch.m est utilisée. Celle-ci selectionne 60% du centre de l'image et calcul la somme des erreurs au carré sur une grille de recherche carré de côté 2N+1. Cela permet d'accelèrer les calculs en diminuant N ou le cadrage. Si le centre de l'image ne contient aucun élément significatif (lac, neige, sol, etc.), la fonction peut avoir de la difficulté à trouver un vecteur de translation fiable. Ainsi, il faut augmenter le cadrage ou le centrer sur un élément avec plus de haute-fréquence. Les images sont déplacées l'une sur l'autre avec un déplacement circulaire afin de simplifier la procédure. Cela cause peu de problèmes puisque l'image est assez grande par rapport au déplacement effectué (environ 15px sur une image d'environ 400px).

Source: 00106v.jpg
Translation = R:( 9,-1) G:( 4, 1)

Source: 00757v.jpg
Translation = R:( 5, 5) G:( 2, 3)

Source: 00888v.jpg
Translation = R:(12, 0) G:( 6, 1)

Source: 00889v.jpg
Translation = R:( 4, 3) G:( 1, 2)

Source: 00907v.jpg
Translation = R:( 6, 0) G:( 2, 0)

Source: 00911v.jpg
Translation = R:(13,-1) G:( 1,-1)

Source: 01031v.jpg
Translation = R:( 4, 2) G:( 1, 1)

Source: 01657v.jpg
Translation = R:(11, 1) G:( 5, 1)

Source: 01880v.jpg
Translation = R:(14, 4) G:( 6, 2)

2. Approche à échelle multiple

Fichier pincipale: main_multiple.m

Afin de réaliser l'approche multi-échelle, on repéte la procedure à une échelle sur des versions de plus en plus grande de l'image originale. La première itération utilise une image avec un ratio de 1/16, puis de 1/8, 1/4, 1/2 et finalement l'image originale. La zone de recherche diminue également avec l'augmentation du ratio mise à l'échelle. Ainsi lorsque le ratio est de 1/16, la zone de recherche est de 65*65px, pour 1/8 de 33*33px, pour 1/4 de 17*17px, pour 1/2 de 9*9px puis finalement pour 1 de 5*5px. En effet, plus l'image est grande, plus la recherche peut être fine. Ceci accelère grandement la recherche du vecteur de déplacement.

Lorsque le vecteur de déplacement est trouvé pour une certaine échelle, celui-ci est multiplié par 2 (le ratio de l'image suivante), puisque le déplacement doit être équivalent dans l'image de taille supérieure.

Cliquer sur une image afin d'obtenir la version haute-résolution. Les fichiers .tif ont été convertis en .jpg afin de sauver de l'espace.

Source = 00029u.jpg
Translation = R:( 90, 36) G:( 38, 20)

Source = 00087u.jpg
Translation = R:(108, 56) G:( 48, 39)

Source = 00128u.jpg
Translation = R:( 51, 38) G:( 34, 25)

Source = 00458u.jpg
Translation = R:( 87, 32) G:( 42, 6)

Source = 00460u.jpg
Translation = R:(103, 27) G:( 41, 22)

Source = 00580u.jpg
Translation = R:(113, 2) G:( 52, 10)

Source = 00685u.jpg
Translation = R:(153, 9) G:( 71, 8)

Source = 00737u.jpg
Translation = R:( 49, 14) G:( 14, 6)

Source = 00785u.jpg
Translation = R:(126,-37) G:( 52,-13)

Source = 00818u.jpg
Translation = R:(130, 32) G:( 60, 23)

Source = 00822u.jpg
Translation = R:(124, 34) G:( 56, 25)

Source = 00884u.jpg
Translation = R:( 76, -6) G:( 33, 2)

Source = 00880u.jpg
Translation = R:( 49, 41) G:( 18, 28)

Source = 00892u.jpg
Translation = R:( 42, 4) G:( 16, 3)

Source = 00919u.jpg
Translation = R:( 80, 25) G:(-19, 13)

Source = 00937u.jpg
Translation = R:(130, 18) G:( 58, 13)

Source = 00940u.jpg
Translation = R:( 48, 34) G:( 24, 26)

Source = 01043u.jpg
Translation = R:( 11, 18) G:(-16, 10)

Source = 01047u.jpg
Translation = R:( 71, 33) G:( 24, 20)

3. Mettez-vous dans la peau de Prokudin-Gorskii!

Fichier pincipale: main_multiple_my_img.m

Les photos ayant servies à générer les plaques simulées sont disponibles dans le repertoire "image/my_images_raw". Les plaques ont été générées avec la fonction generateimg.m. Les résultats sont dans le repertoire "images/my_images".

Sur l'image myimg0.jpg, on peut constater que la tête du passager a bougé lors de la prise de photo. Ceci cause un effet de halo dans la photo pour le canal bleu.
Pour l'image myimg1.jpg, la caméra tremblait lors de la prise de photos. Cela donne un effet de flou qui augmente de plus en plus vers l'extérieure de l'image. On constate que les coins de l'images ne sont pas parfaitement alignés.
Dans l'image myimg2.jpg, la caméra à subit une legère rotation de gauche à droite entre la prise des 3 photos. Ceci rend l'ajustement de l'image quasi-impossible avec un simple vecteur de translation. Ainsi, un des blocs jaunes semble bien aligné, tandis que le second ne l'est pas du tout. Ceci montre donc le problème de seulement calculer les déplacements en translation.

Cliquer sur une image afin d'obtenir la version haute-résolution.

Source = my_images/myimg0.jpg

Source = my_images/myimg1.jpg

Source = my_images/myimg2.jpg

Source = my_images/myimg4.jpg

Source = my_images/myimg5.jpg

Source = my_images/myimg6.jpg

4. Crédits supplémentaires