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.
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.
Pour les images JPEG, des bonnes résultats sont :
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 :
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 :
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 :
Pour les autres, elles ne sont pas bien alignées :
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.
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 :
Donc le résutat est obtenu suivant : (en comparant avec l'image sans alignement)
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......