TP1: Colorisation de l'Empire Russe

Carl Nadeau 2017

Description du projet

Monsieur Sergei Mikhailovich Prokudin-Gorskii peut dormir en paix maintenant, car la technologie nous permet de combiner les trios de photos qu'il a prises pour former une image en couleur. Et c'est joli en plus!
Chacunes des photographies monochromes qu'il prenait correspondait à un canal de couleur - bleu, vert ou rouge - pour les assembler et les combiner pour produire une image projetée en couleur.

Le but du TP est de faire une fonction qui prend des numérisations de ses plaques de verre photographiques, aligne chacune des trois images et les combine pour produire une image couleur automatiquement.
La première partie du travail s'intéresse au principe d'alignement d'images, tandis que la deuxième s'intéresse davantage à la gestion du pouvoir de calcul de l'ordinateur. On tente d'optimiser le code de la partie 1 avec une procédure en pyramide. On commence par estimer la position d'alignement des différents canaux avec une image réduite et on augmente progressivement la résolution en cherchant un alignement près de la dernière itération.

Approche à une seule échelle

Dans cette section, on présente les résultats à petite échelle afin d'évaluer le découpage et l'alignement des 3 canaux.
On aligne le vert et le rouge sur le bleu.
Dans le code, on retrouve le principe de calcul dans une fenêtre et on produit un cadre invisible autour du canal bleu pour gérer les translations de matrices hors des dimensions de ce canal.

J'utilise la fonction [trans_R,trans_G,imgCouleur] = uneSeuleEchelle(img) dans le fichier main.m pour produire les résultats et les translations suivantes.
Les translations sont présentées sous le format suivant : (A,B)A est le déplacement vertical vers le bas et B le déplacement horizontal vers la droite.

Images demandées
Translation du canal V = (11,-1)
Translation du canal R = (5,1)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (3,3)
Translation du canal R = (7,5)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (7,1)
Translation du canal R = (14,1)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (2,2)
Translation du canal R = (6,3)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (4,0)
Translation du canal R = (8,0)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (2,-1)
Translation du canal R = (15,-1)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (2,1)
Translation du canal R = (6,2)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (6,1)
Translation du canal R = (14,1)
Image avec la balance des blancs ajustées et exposition automatique
Translation du canal V = (7,2)
Translation du canal R = (15,4)
Image avec la balance des blancs ajustées et exposition automatique

Des techniques pour augmenter la qualité de l'image sont présentés dans la dernière section - Restauration automatique.

Toutes les images sont accessible en JPG dans le fichier image sous le même nom que le fichier original avec l'appelation C pour le processus demande et avec un B, pour une restauration supplémentaire.

Approche à échelles multiples

Dans cette section, on utilise plusieurs mise à l'échelle consécutive pour calculer le bon alignement des canaux de couleurs.

J'utilise la fonction [translation_R,translation_G,imgPro] = ProkudinGorskii(imgRAW,window,nb_div) dans le fichier main_multiechelle.m pour produire les résultats et les translations suivantes.
window est la dimension d'une matrice centrée au milieu du canal bleu et qu'on croit être suffisament grande pour calculer l'alignement des deux autres canaux. Davantages d'explications sont dans la dernière section - Idée intéressante : fenêtre de calcul. Ici, j'utilise une fenêtre de [200,200].
nb_div est le nombre de division par deux qu'on estime necessaire au calcul en pyramide. On refait le calcul avec un division par deux de moins que la dernière itéraration. Ici, il est de 3, i.e. une division par 8.
Les translations sont présentées sous le format suivant : (A,B)A est la déplacement vertical vers le bas et B le déplacement horizontal vers la droite.

Images demandées
Translation du canal V = (39,23)
Translation du canal R = (84,55)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (54,45)
Translation du canal R = (117,58)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (37,24)
Translation du canal R = (-177,-142)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (45,7)
Translation du canal R = (90,32)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (17,4)
Translation du canal R = (53,13)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (58,26)
Translation du canal R = (128,34)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (18,3)
Translation du canal R = (63,1)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (-11,11)
Translation du canal R = (17,19)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (26,19)
Translation du canal R = (75,33)
Image avec la balance des blancs ajustees et exposition automatique

Images supplémentaires
Translation du canal V = (70,9)
Translation du canal R = (124,-45)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (130,-129)
Translation du canal R = (81,-99)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (37,3)
Translation du canal R = (102,-126)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (177,195)
Translation du canal R = (172,195)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (45,21)
Translation du canal R = (105,33)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (31,-29)
Translation du canal R = (81,-26)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (54,16)
Translation du canal R = (115,12)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (66,41)
Translation du canal R = (140,64)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (58,24)
Translation du canal R = (131,32)
Image avec la balance des blancs ajustees et exposition automatique
Translation du canal V = (38,34)
Translation du canal R = (91,54)
Image avec la balance des blancs ajustees et exposition automatique

Ce qui cause les instabilités de la fonction est entre autres un feature que j'ai ajouté : la fenêtre de calcul. Si elle ne voit pas assez large, elle n'aura pas assez d'information pour bien aligner les images originales.
De plus, si dans cette fenêtre on retrouve des éléments périodiques ou uniformes, mon algorithme risque de se perdre dès la première itération avec la localisation à petite échelle. De là, il sera très instable.
Il faudrait pouvoir avoir une fenêtre qui s'ajuste automatiquement et qui détecte ses cas critiques ou il ne "voit rien" a petite échelle.

Toutes les images sont accessible en JPG dans le fichier image sous le même nom que le fichier original avec l'appellation C pour le processus demande et avec un B, pour une restauration supplémentaire.

Dans la peau de Prokudin-Gorskii

J'utilise encore la fonction [translation_R,translation_G,imgPro] = ProkudinGorskii(imgRAW,window,nb_div) dans le fichier main_own.m pour produire les résultats et les translations suivantes.
window est la dimension d'une matrice centrée dans le canal bleu et qu'on croit être suffisamment grande pour calculer l'alignement des deux autres canaux. Davantage d'explications sont dans la dernière section - Idée intéressante : fenêtre de calcul. Ici, j'utilise une fenêtre de [200,200].
nb_div est le nombre de divisions par deux qu'on estime nécessaire au calcul en pyramide. On refait le calcul avec une division par deux de moins que la dernière itération. Ici, il est de 1, c.-à-d. une division par 2.

Images demandées
Image originale Translation du canal V = (1,0)
Translation du canal R = (2,0)
Image avec la balance des blancs ajustées et exposition automatique
Image originale Translation du canal V = (0,0)
Translation du canal R = (0,0)
Image avec la balance des blancs ajustées et exposition automatique
Image originale Translation du canal V = (1,0)
Translation du canal R = (2,0)
Image avec la balance des blancs ajustées et exposition automatique

Il est intéressant de noter que deux des trois images subissent des translations, minimes, mais elles sont tout de même là.

Crédits supplémentaires

Restauration automatique

On tente d'améliorer la qualité des images en ajustant la balance des blancs avec le principe GreyWorld.
On tente aussi d'ajuster l'exposition avec un paramètre percentile. Pour un percentile de 100, l'image restera la même. Elle redéfinit le blanc le plus blanc. Pour un percentile de 90, par exemple, 10% de blanc seront saturées et le 90% du reste de l'image sera ajusté pour combler la saturation de ce blanc. Bref, on redéfinit un nouveau blanc. Pour une valeur de 0, toute l'image serait blanche, car les noirs deviendraient blancs.
Les fonctions sont les suivantes et sont utilisées dans les 3 différentes main :[imgBalanced] = greyworld(img) et [imgBoosted] = exposure(img, percentile).

Voici trois exemples :
Différents résultats avec les fonctions de restauration sur une petite image
Différents résultats avec les fonctions de restauration sur une grande image
Différents résultats avec les fonctions de restauration sur une image personnelle

Idée intéressante : fenêtre de calcul

L'idée consiste à produire une fenêtre sur une image. En limitant notre champ de vision à la fenêtre, la quantité de calcul est réduite de beaucoup. J'estime qu'avec la dimension de fenêtre que j'utilise dans ce laboratoire, je demande environ 4 fois moins de calcul que si je considérais l'entièreté de l'image que je veux aligner.
En général, la technique fonctionne bien, mais elle a des défauts. Une trop petite fenêtre pourrait voir du contenu uniforme ou périodique.
Sinon, même quand la scène change un peu pendant la prise des trois photos, l'alignement est souvent très bien.
Il faudrait implanter une fenêtre qui s'adapte en dimension selon les dimensions de l'image étudiée. Aussi, il pourrait y avoir plusieurs petites fenêtres pour éviter d'échantillonner à un seul endroit.
Elle fait partie du code de la fonction [translation_R,translation_G,imgPro] = ProkudinGorskii(imgRAW,window,nb_div).

Conclusion

Si je devais réécrire mon algorithme de Prokudin-Gorskii, je le ferais avec la convolution au lieu de prendre la norme L2.
Aussi, je ferais une gestion automatique de la grandeur de la fenêtre de calcul à choisir et j'utiliserais d'autres outils pour confirmer l'alignement.
Ses outils pourraient être l'information fréquentielle de chacun des canaux.

Bref, Monsieur Sergei Mikhailovich Prokudin-Gorskii serait content de voir ses photos mises en couleur si rapidement.