TP1: Colorisation de l'Empire Russe

Présentation du projet

Dans ce projet il nous est demandé d'étudier la colorisation des images de Sergei Mikhailovich Prokudin-Gorskii. . Ce photographe russe a parcouru la Russie à partir de 1907 pour réaliser des milliers de clichés avec un appareil doté de 3 chambres avec différents filtres (rouge, vert et bleu). Cet appareil rend donc 3 images différentes pour le même cliché. Chacune des images va correspondre à un des 3 canaux de couleur. Ces 3 images permettent d'obtenir une image en couleur. Si à l'époque de Prokudin-Gorskii il n'existait pas de technique permettant de tirer ces photographies en couleur, il est aujourd'hui simple d'obtenir un résultat comme ci-dessous en quelques heures à l'aide d'un logiciel de retouche d'image.



Le but du projet est d'automatiser ce traitement à l'aide de fonctions de Matlab. A partir d'une plaque de verre numérisée de la collection de Prokudin-Gorskii, il faut retrouver l'image couleur avec le meilleur rendu possible. Ce travail peut se décomposer en deux principales parties. La première est l'alignement des images obtenues avec les trois filtres différents. La seconde est l'obtention de l'image couleur et la correction colorimétrique automatique du résultat.

Alignement

Nous présenterons d'abord ici une méthode simple pour l'alignement d'images de petite taille, puis nous verrons une technique pour aligner des images de grandes tailles. Pour ce TP nous définirons images à faible résolution les images dont l'image des 3 canaux a une hauteur inférieure ou égale à 1024 pixels et les images à haute résolution les images de plus grande dimension.

Alignement d'images à faible résolution

Pour les images à faible résolution, l'idée est d'essayer toute les translations possibles sur une fenêtre de translation donnée. Nous fixerons la taille de fenêtre à 40x40. C'est à dire que chaque translation sera testée pour x allant de -20 à 20 et pour y allant de -20 à 20. L'image est d'abord divisée en trois images correspondant au canal bleu pour la partie haute de l'image, canal vert pour l'image du centre et canal rouge pour l'image du bas. Nous prendrons le canal bleu comme référence, nous appliquerons donc les translations au canal rouge et au canal vert. Pour ces 2 canaux on vérifie sa superposition avec le canal bleu pour chaque translation. Pour vérifier l'alignement on applique une mesure de corrélation croisée normalisée (CNN) entre deux images:

CNN = (canalBleu(:) / norm(canalBleu(:)))'*(canalvert_shift(:) / norm(canalvert_shift(:)))

Pour trouver la meilleure superposition, on cherchera à maximiser la CNN entre deux images. L’intensité des trois images ne donne pas de bonnes informations car elle peut varier d'une image à l'autre. En effet si un objet est vert, il aura des pixels de haute intensité pour l'image du canal vert mais de faible intensité sur les autres images. L'application de la CNN directement sur les images rouges, vertes et bleues n'est donc pas la solution la plus adéquate pour le problème d'alignement. Nous avons choisi de travailler sur les contours des objets présents dans la scène en appliquant un filtre de Sobel sur les trois images. edge(I,'sobel'). Un exemple d'une image de contours est présenté ci-dessous:


Ainsi, l'algorithme va chercher la translation qui maximise la superposition des contours. Les images de la collection de Prokudin-Gorskii présentent des bordures noires ne se trouvant pas toujours aux mêmes endroits des images, ce qui peut créer des erreurs lors de la recherche de la meilleure superposition de contour. Pour pallier à ce problème, nous ne considèrerons pas les bordures des images lors du calcul de la CNN. Une fois les translations trouvées, il suffit de créer une image couleur avec l'image rouge et l'image verte translatées ainsi que l'image bleue. Le tableau ci-dessous montre les résultats obtenus pour 14 images de faible résolution. La translation appliquée à l'image verte est notée Tg et la translation appliquée à l'image rouge est notée Tr .

00106v: Tg = [4,1]; Tr = [9,-2];

00757v: Tg = [2,3]; Tr = [5,5];

00888v: Tg = [6,1]; Tr = [12,0];

00889v: Tg = [2,2]; Tr = [5,3];

00907v: Tg = [-1,-1]; Tr = [5,-1];

00911v: Tg = [1,-1]; Tr = [13,-1];

01031v: Tg = [1,1]; Tr = [4,2];

01657v: Tg = [5,1]; Tr = [12,1];

01880v: Tg = [6,2]; Tr = [14,4];

00033v: Tg = [ 5, 0]; Tr = [11,-1];

00089v: Tg = [4,3]; Tr = [10,5];

00578v: Tg = [ 7, 1]; Tr = [14,0];

01789v: Tg = [7,3]; Tr = [15,3];

01903v: Tg = [7,0]; Tr = [14,-1];


Alignement d'images à haute résolution

Si on veut appliquer le même algorithme que décrit précédemment sur des images à haute résolution, le traitement peut s'avérer très long. En effet, il faudrait agrandir la taille de la fenêtre de recherche pour trouver la bonne translation. Une idée pour simplifier cette recherche est de faire un traitement pyramidal. Pour cela on considère l'image à plusieurs échelles: 1,1/2,1/4, etc. L'image à plus petite échelle, sera l'image dont les dimensions ont étés divisés par une puissance de 2 tel que l'image résultante soit de faible résolution (hauteur inférieure à 1024 pixels). L'idée est de faire une recherche récursive sur les images de chaque échelle en commençant par la plus petite. La recherche de la translation pour la plus petite échelle revient à exécuter l'algorithme décrit dans la section précédente. Lors du passage à l'échelle supérieure, les translations trouvées pour l'échelle précédente sont multipliés par deux. Si les translations trouvées à l'échelle précédente est juste, la translation à cette échelle devrait ne changer que d'un pixel maximum grâce au fait que la taille de l'image a été multipliée par 2. On peut alors réduire la fenêtre de recherche à [-1,1] par rapport aux translations trouvées. Pour plus de sécurité, on considèrera une fenêtre de recherche de [-3,3]. On applique cette procédure jusqu'à l'échelle 1. Le tableau ci-dessous présente les résultats pour 12 images à haute résolution.

00029u: Tg = [41,12]; Tr = [92,30];

00087u: Tg = [51,37]; Tr = [107,57];

00128u: Tg = [33,21]; Tr = [49,36];

00458u: Tg = [44,7]; Tr = [85,28];

00737u: Tg = [17,8]; Tr = [50,15];

00822u: Tg = [57,24]; Tr = [125,33];

00892u: Tg = [16,1]; Tr = [41,3];

01043u: Tg = [-9,13]; Tr = [13,14];

01047u: Tg = [26,24]; Tr = [71,33];

00007u: Tg = [44,18]; Tr = [90,22];

00021u: Tg = [28,36]; Tr = [67,63];

01111u: Tg = [-26,8]; Tr = [25,10];

Crédits supplémentaires: Correction automatique

Un gros défaut que présentent les images générées est les bordures colorées. Elles sont dues au fait que les bordures ne sont pas présente au même endroit dans chacune des trois images. L'idée est donc de recadrer automatiquement les images pour trouver ces bordures de couleur. Pour faire cela, on procède en plusieurs étapes. On calcule d'abord l'image des différences entre chaque canal de l'image couleur avec cette ligne de code:

D = imabsdiff(R,G)+imabsdiff(R,B)+imabsdiff(B,G);

L'image obtenue va avoir de grande valeur au niveau des bordures colorées. On applique un seuil sur l'image obtenue pour avoir une image binaire. Ce masque représente l'emplacement des couleurs saturées de l'image. L'étape suivante consiste à sommer les valeurs des pixels du masque sur les lignes et les colonnes. Cette étape nous donne deux vecteurs contenant le nombre de pixels à haute saturation dans chaque ligne et dans chaque colonne. Ce vecteur va avoir des valeurs importantes au niveau des bordures de l'image. On applique sur ce vecteur un seuil dont la valeur est égale à 3 dixièmes de la hauteur de l'image. Comme on cherche les bordures on ne considère que le premier et dernier dixième du vecteur. Les valeurs retenues seront les indices du vecteur seuillé qui sont vraies. Le recadrage se fera sur les valeurs vraies, les plus proches du centre, dans la limite du dixième de l'image. Pour corriger les couleurs on applique une égalisation d'histogramme sur chaque image. Les résultats obtenus pour ces trois traitements sont présentés ci-dessous.

001114u: Tg = [-23,16]; Tr = [34,21];

01122u: Tg = [48,44]; Tr = [100,96];

01259v: Tg = [17,8]; Tr = [50,15];

01414v: Tg = [16,1]; Tr = [41,3];

01444u: Tg = [26,24]; Tr = [71,33];

01854v: Tg = [28,36]; Tr = [67,63];

Crédits supplémentaires: Test sur d'autres images

Pour faire les tests sur d'autres images des photographies ont été prises avec un Lumix DMC-TZ10 de Panasonic. Afin que l’algorithme cherche des translations, 3 images ont été prises d'affilé sans pied. L'effet crée ainsi n'est pas vraiment une translation et pour corriger l'effet il faudrait chercher l'homothétie permettant de passer d'une image à l'autre. De ce fait on peut remarquer des artefacts sur certaines paries des images reconstruites. Ci-dessous une image construite à partir de 3 canaux issus de 3 photos différentes.





Dans cette image, la piece à été retiré pour générer l'image ayant servi pour le canal vert

3 images d'un ordinateur avec une vidéo

Images extérieur. Une personne se déplace sur la route