TP1: Coloration de l'Empire Russe

Le but de ce TP est de former une image couleur à partir de 3 images qui contiennent uniquement le channel bleu, vert ou rouge.

Explications additionnelles

Je n'ai pas mit les titres à côté des images, mais elles sont toutes des hyperliens vers l'originale. Je n'ai gardé que les images avec leurs bordures coupées. Pour évaluer l'alignement des frames j'ai utilisé numpy.linalg.norm(I1 - I2). Je ne compare que le centre de l'image (j'exclue 25% de chaque bord) car sinon les bordures faussaient le résultat.

Approche à une échelle

Voici la reconstitution des images jpg avec l'algorithme à une seule échelle avec les bordures coupées.




Approche à échelle multiple

Pour l'approche multi-échelle j'ai utilisé la récursion. La fonction est appelée 4 fois en tout, la dernière fois est sur l'image à pleine résolution et donc il y a 3 réductions sur l'image. J'ai utilisé un facteur 2 pour la réduction. Je me suis rendu compte que la majorité de l'ajustement se faisait sur la plus petite image et ensuite l'alignement changeait seulement de 0 à 2 pixel (pour compenser le changement d'échelle) J'ai donc laissé le range de +/-15 pixels seulement sur la plus petite résolution et j'ai mit un range de +/- 5 pixels par la suite. J'ai passer de presque 4 minutes par images à 30 secondes par images.




10 images supplémentaire





L'image de l'aigle est intéressante car il n'y a presque aucun ghosting sur l'image sauf sur l'aile droite. De toute évidence l'aigle n'est pas resté immobile pour la photo !

Images personnelles

Pour ce qui est des images personnelles j'ai décidé de tester les limites de mon algorithme. Mon premier test était plus conservateur. J'ai utiliser la webcam de mon laptop pour voir comment l'algorithme allait réagir face à une photo de basse qualité. J'ai tourner légèrement mon laptop entre chaque photo. Au final l'alignement est bon même si la qualité est médiocre. J'ai aussi garder la version avec les bordures car on peut voir à droite que l'alignement à dû compenser pour la rotation de l'ordinateur.


Pour le deuxième test j'ai voulu voir comment l'alignement allait réagir en déplaçant un object sur chaque image. Dans ce cas-ci il s'agit de la bouilloire. On voit que l'alignement à converger malgré le déplacement de l'objet et on peut voir du ghosting intéressant. À postériori, mettre la bouilloire blanche vis à vis du four blanc dans le frame vert n'était pas la meilleure idée, mais on obtient un ghosting rose ce qui est intéressant.


Pour le dernier test je voulais pousser l'algorithme à l'extrème en mettant une bande rouge, vert et bleu dans l'image pour voir si celà allait fausser l'algorithme. Mon premier essaie s'est quand même bien aligner. Celà est probablement dû au fait que dans notre algorithme on utilise le bleu comme frame de référence et que le bleu n'est pas dans le milieu.


Pour tester cette théorie j'ai changer le code pour utiliser le frame vert comme référence à la place et effectivement les bandes de couleurs fausse maintenant l'alignement. Il est intéressant de voir une bande jaune apparaitre


J'ai réessayer avec un zoom beaucoup plus important sur les bandes et avec le bleu dans le milieu. Cette fois si l'alignement est effectivement faussé. À gauche est la photo originale, au milieu le résultat avec le range standard de recherche (+/-15 pixels) et à droite j'ai retirer la restriction pour qu'il converge. Pour cette photo je regrette de ne pas avoir fait une version du roll qui ne réinsert pas les valeurs comme numpy.roll().
Il est a noter que ma caméra à essayer de compenser lors de la photo et le bleu est apparu mauve. Si on regarder le channel R seulement on voit clairement que la zone bleu n'est pas noir.


Crédits supplémentaires

Les seuls crédits supplémentaires que j'ai essayer d'aller chercher sont la détection et le retrait des bordures. J'ai fait deux versions de la fonctionnnalité. La première est celle que j'ai gardé et qui est utilisé pour les images du rapport. Elle consiste simplement à retirer 5% à gauche et à droite ainsi que 10% en haut et en bas de chaque image. J'ai retirer plus sur le haut/bas car c'était les bordures les plus problématique. J'ai également fait une version plus intelligente qui regardait la photo une colonne de pixel à la fois et ci la colonne était blanche ou noir, il s'agissait d'une bordure et je la retirait. J'ai essayer cette fonction uniquement pour les bordures de côté car dans le haut il y avait trop d'imperfection et de bruit dans les 'négatifs'. En générale j'ai obtenu des bons résultats avec cette méthode mais elle est très instable. Dès que la bordure à une légère rotation, l'algorithme arrête à la frontière entre la bordure blanche et la bordure noir. La raison est que la colonne de pixel contient une moitié blanc et une moitié noir et mon algorithme vérifie la moyenne. Dans ce cas la moyenne est grise et l'algo pense qu'il ne s'agit plus d'une bordure. Un des meilleures exemple est la photo 01880v.jpg.

Bordure à coupure fixe

Bordure identifiée avec mon algorithme

Un des meilleures exemple est la photo 01880v.jpg. On peut voir que mon algorithme a finit trop tôt sur la bordure de gauche. En zoomant sur la bordure, on peut voir que les pixels du bas sont noir alors que les pixels du haut sont blancs. Toutefois on peut voir que pour la bordure de droite, mon algorithme a été plus performant que simplement coupé 5%.