TP1: Colorisation de l'Empire Russe

Réalisé par Lei Lei

Description du projet

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 faut extraire les trois canaux de couleurs, les agencer un par-dessus l'autre,
et les aligner pour que leur combinaison forme une image couleur RGB. En considérant qu'un simple
modèle de translation (en x, y) est suffisant pour un aligner les images correctement comme mentionné
dans TP1, on a juste essayé d'aligner tous les images avec un simple déplacement [x y], ce qui seront
affichés dans un table.

Description d'approche

Les images proposées sont avec trois canaux de couleurs par l'ordre des filtres de haut en bas BGR.
Donc tout d'abord, la division de l'image originale en trois images de même dimension est à effectuer.
Cette parti est déjà bien faite dans l'ébauche de code.

Ensuite, la discrimination de format de l'image est propée car on a basse résolution (format JPEG) et
aussi haute résolution (format TIFF). Pour le format TIFF, une procédure de recherche basée sur
une pyramide d'images est établie.

La plus importante chose est ce que l'alignement des trois images. Et le façon d'aligner les images ici,
c'est d'effectuer une recherche exhausive sur une fenêtre de dépalcement----de [-15 -15] jusqu'à
[15 15]. On fait deux boucles--une dedans l'autre--pour aligner les deuxième et troisième images (G
et D) à la première(B) avec le pas d'un pixel selon une dimension. Notant que la fonction 'circshift'
sous Matlab est de replacer la matrice de façon selon [y x], les variables 'Delta_BG'(déplacement entre
B et G, même définition ci-dessous, trouvés dans le code) et 'Delt_BR' sont modifiés "correctement"
et enregestrés à la fin du code.

Pour chaque pas de déplacment,[-15 -15], [-15 -14]...[15 15], on calcul la somme des différences au
carré et l'enregiste dans une matrice 'sum_BG' et 'sum_BR' respectivement. À cause que les images
n'ont pas réellement les même valeurs de luminosité, une fois les deux images sont "bien" alignées, leur
norme 'sum_BG'(ou 'sum_BR') aura la valeur minimume dans la matrice. Alors la position de la valeur
minimume coresponde le déplacement effectif.

Résultats et Commentaires

Pour les images JPEG, des bonnes résultats sont :

result-00106v result-00757v result-00888v result-00889v result-00907v result-01037v result-01657v result-01880v

Les images ceux-dessus sont bien alignées, comme on a vu, et leurs déplacements sont obtenus suivants :

Image Déplacement entre B et G (pixels) Valeur min de SSD entre B et G Déplacement entre B et R (pixels) Valeur min de SSD entre B et R
00106v.jpg [0 4] 11131.373010 [-1 9] 12665.434525
00757v.jpg [0 0] 7429.404121 [1 5] 19386.563183
00888v.jpg [0 6] 4745.191080 [-1 10] 5965.300408
00889v.jpg [-1 1] 5991.598939 [-1 5] 9681.374641
00907v.jpg [-1 0] 7498.983468 [-1 5] 8559.205029
01031v.jpg [1 1] 4645.555679 [1 4] 7779.982422
01657v.jpg [-1 6] 4817.996678 [-2 12] 5282.400784
01880v.jpg [2 6] 6842.216778 [3 13] 7141.875925

Malheureusement, il y a des mauvais résultats avec le même code. Mais cela est assez bizzare :

result-00911v

Et son déplacement et les valeurs minimumes sont :

Image Déplacement entre B et G (pixels) Valeur min de SSD entre B et G Déplacement entre B et R (pixels) Valeur min de SSD entre B et R
00911v.jpg [-1 2] 6259.261699 [-3 7] 7160.974733

On a vu ici que les valeurs minimumes ne sont pas trop grandes, en comparant avec ceux-dessus, cependant le résultat final n'est pas bien.
On a aussi essayé de grandir la fenêtre de déplacement, [-30 -30] jusqu'à [30 30], malheureusement encore, on a le même mauvais résultat. Ce-ci pourrait être que les trois images aient été prises avec la scèce qui bougait, il y aurait alors des différences assez grandes entre ces trois images.

Les résultats sur quelques exemples de choix :

result-00001v result-00002v result-00003v result-00005v result-00008v

et les déplacement obtenus sont :

Image Déplacement entre B et G (pixels) Valeur min de SSD entre B et G Déplacement entre B et R (pixels) Valeur min de SSD entre B et R
00001v.jpg [1 4] 5322.538070 [0 8] 8745.882461
00002v.jpg [2 3] 6418.001415 [1 9] 6736.655010
00003v.jpg [1 2] 3621.698316 [3 7] 5880.026267
00005v.jpg [0 4] 5072.519047 [-1 9] 8471.157339
00008v.jpg [0 4] 3374.667082 [-1 9] 7922.078185

Pour les images TIFF, le code ne fonctionne pas bien, et le meilleur résultat obtenu est :

result-01047u

Pour les autres, elles ne sont pas bien alignées :

result-00128u result-00458u result-00737u result-01043u

Les déplacement correspondants sont :

Image Déplacement entre B et G (pixels) Valeur min de SSD entre B et G Déplacement entre B et R (pixels) Valeur min de SSD entre B et R
00128u.tif [0 40] 165836.804765 [0 88] 226269.284126
00458u.tif [-8 112] 139163.426553 [0 96] 155551.412540
00737u.tif [0 40] 136876.584551 [0 48] 170679.717608
00822u.tif [0 64] 151805.440943 [0 104 ] 277564.628993
00892u.tif [-8 -16] 144810.471426 [-16 56] 267294.663655
01043u.tif [0 -16] 104901.092525 [-8 48] 200517.567343
01047u.tif [0 24] 88425.855205 [8 56] 129638.616058

Les images TIFF sont souvant trop large, qui permet d'alourdir le traitement de déplacement. Avec une série d'images, l'alignement d'iamge se fait de manière séquentielle de l'échelle la plus petite jusqu'à la plus grande en mettant à jour l'estimé de translation au fur et à mesure. C'est-à-dire que quand on a trouvé "le meilleur" déplacement sur une petite échelle, il faut multiplier par le facteur de l'échelle pour obtenir le déplacement dans la grande échelle correspondant. Mais sur les résultats ceux-dessus, les déplacement sont de l'orde 10, qui sont trop petit devant la taille de l'image originale. Cela pourrait être la raison qu'on n'a trouvé pas de bon résultats. Une grande fenêtre de déplacement pourra être à essayer.

Crédits supplémentaires

Pour tester encore le code, on a pris trois séquence d'image et il y a biensur des petits déplacement entre ces trois images. On a retiré le canal de "R" de la premième image, le canal de "G" de la deuxième image, le canal de "B" de la troisième image, comme montrés suivantes :

DSC_0056 R-DSC_0056 DSC_0057 G-DSC_0057 DSC_0058 B-DSC_0058

Donc le résutat est obtenu suivant : (en comparant avec l'image sans alignement)

result-DSC_0056 origin-DSC_0056

Conclusions

Ce projet nous permet de bien comprendre les couleur d'image. Les résutlat sur les images basse-résolution sont bien obtenus, mais sur les iamges haut-résolution, l'amelioration du code reste à effectuer. D'autre, le façon SSD pour aligner les image est démontré comme une bonne méthode. Alors la corrélation croisée normalisée (CCN) pourrait être aussi à essayer.
Merci de ce projet, on s'est bien amusé !

PS: Sur mon "mauvais" frainçais, je vous remercie bien d'avance pour votre compréhension......