TP1: Coloration de l'empire Russe

Introduction

Le but de ce TP est de terminer le travail débuté par Sergei Mikhailovich Prokudin-Gorskii. Celui-ci a pris des clichés de toute la Russie avec son appareil photo. Les appareils photographiques couleurs n'existant pas à l'époque, il a pris à pour chaque scène photographie de ce qu'il souhaitait capturé avec différents filtres : rouge, vert et bleu. Il pensait ensuite pouvoir reconstituer une image couleur avec les trois clichés. Ce TP a donc pour but de partir des clichés de Prokudin-Gorskii et d'aligner les canaux rouge, vert et bleu afin de créer une image RGB. Nous avons pour cela essayer d'aligner les canaux rouge et vert sur le canal bleu.

Approche à une seule échelle

Dans cette approche nous nous contentons de passer une unique fois sur l'image que nous soumettons à un décalage entre -15 et 15. Cette approche donne des résultats corrects pour les images au format JPG qui ont une petite résolution mais ne focntionne pas correctement pour les images au format TIF qui ont une grande résolution. Les images ci-dessous ont été obtennues avec cet algorithme

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

Approche Multi-échelle

Afin d'améliorer l'algorithme précédent, j'ai créé un nouvel algorithme récursif basé sur le précédent qui aligne dans un premier temps l'image à une échelle réduite: j'ai choisi de réduire la taille de l'image à 300x300 maximum. Dans un deuxième temps, le décalage est transmis à l'étape suivante qui travaille avec une image de taille quatre fois plus grande, les décalages selons les deux axes sont ainsi doublés pour s'adapter au nombre grandissant de pixels. Le décalage est ensuite recalculé à partir du point précédent dans l'interval [-3;3]. Travailler sur l'intervalle [-15;15] aux échelles supérieures est inutile car le décalage doit se situer en permanence entre [-1;1] sauf erreur à une échelle inférieure. J'ai choisi l'intervalle [-3;3], pour accélérer les calculs et pouvoir compenser une éventuelle erreure à basse échelle.

18 images obligatoires

Les images suivantes sont les résultats de l'alignement des 18 images obligatoires avec l'algorithme multi-échelle. On remarque que pour la plus part des images l'alignement est de très bonne qualité sauf certaines comme celle avec la hutte qui présente un décalage avec le bleu, peut-être lié à un mouvement de l'appareil photo (rotation) ou à une distorsion sur le bleu.

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

10 images au choix dans la collection de Prokudin-Gorskii

Pour les dix images au choix parmis la collection de Prokudin-Gorskii le recadrage fonctionne correctement. On remarque cependant que pour la dernière image des erreurs de décalage, ceci est lié au négatif qui est grandement endommagé et donc qui perturbe l'algorithme d'alignement.

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle
Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

Mes Images

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

Cette première image comporte beaucoup de blanc ce qui a gêné l'algorithme lors du calcul de différence car de grandes zones de l'image ont des valeurs très proches.

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle
Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

On retrouve la même erreur de décalage que sur l'image précédente.

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle
Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

L'algorithme reconstruit très bien l'image pour cette série d'image.

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle
Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

Pour cette dernière série d'image j'ai fait disparaitre un objet (téléphone), on voit clairement apparaître la place manquante de l'appareil en vert.

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

Crédits Bonus

Suppression des bords

J'ai implémenté deux fonction me permettant de couper les bords de l'image. Une qui calcul les bords pour un canal, celle-ci regarde à tour de rôle les bords haut, gauche, bas et droite afin de savoir si la ligne doit être enlevé; le programme continu de tourner tant qu'une ligne a été retiré à la dernière itération. La deuxième fonction prend ensuite les bords les plus larges pour découper l'image avec les trois canaux.
On constate que l'alignement est le même que pour l'approche multi-échelle

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

Ajustement de la couleur

J'ai créé une fonction "CorrectionCouleur" qui prend une image et corrige la couleur de celle-ci avec le modèle "grey world", cet algorithme modifie les moyennes de chaque couleur afin qu'elles soit égales. On peut voir ci dessous à gauche la version reconstitué sans ajustement et à droite avec ajustement. Les autres images sont disponibles dans l'archive /images/ColorCorrection/ .

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle
Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle
Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle

Laplacien (gradient)

J'ai décidé de réalisé aussi une fonction calculant l'alignement des images à l'aide du LoG (Laplacien de Gaussienne), opérateur vu dans le cours de vision numérique avec Denis Laurendeau, afin d'avoir de meilleurs résultats que le gradient. L'algorithme est disponible dans le code python et s'appuie sur l'algorithme multi-échelle précédent.

Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle Cliquez pour voir en taille réelle