TP1: Colorisation de l'Empire Russe

Description du travail

Ce travail consiste à recréer une image couleur à partir des 3 canaux séparés de cette image. Pour ce faire, il faut d'abord cadrer les images des 3 canaux puis trouver un alignement optimal afin de ne pas avoir d'effet de "ghosting" dans le résultat final. Afin de garder le tout le plus simple possible, la seule transformation géométrique effectuée sera la translation, même si celle-ci est insuffisante afin d'avoir un alignement parfait entre les 3 canaux. L'algorithme utilisé afin de trouver cette translation optimale est le point d'intérêt de ce travail. Différentes tactiques sont testées et les résultats sont présentées dans chaque cas.

Algorithme à échelle unique

SDC force brute

L'image en entrée est d'abord séparée en 3 images égales de haut en bas. L'image du haut (bleu) sert de référence spatiale. Chaque image est ensuite "crop" de façon à éliminer les bordures. Pour les canaux rouge et vert, une série de translation entre +15 et -15 pixels en X et en Y sont calculées par force brute (15^2 translations calculées). Chaque résultat de translation est ensuite comparé par SDC au canal de référence. La translation pour chaque canal avec le meilleur score est conservée. Les images originales des canaux se font ensuite appliquer les translations gagnantes avant d'être rassemblées dans une même image couleur. Comme on peut le constater dans les résultats suivants, cette méthode ne s'est pas avérée très efficace dans mes tests. Je crois que l'une des raison est qu'il n'y a pas vraiment de lien entre l'intensité d'un certain pixel dans un canal et l'intensité de ce même pixel dans un autre canal. Par exemple, si on fait la SDC entre le canal bleu d'une image quelconque et une image complètement grise (à 128/256), on risque d'avoir un score similaire voir meilleur qui si on fait la SDC avec le canal vert de la première image. Ainsi, j'ai décidé de faire l'ajout d'un prétraitement des canaux des images avant de faire la SDC dans la section suivante.

Résultats:


00106v
(0, 1)
(-1, 0)

00757v
(0, 0)
(0, 5)

00888v
(0, 1)
(0, 0)

00889v
(0, 0)
(0, 0)

00907v
(-1, 1)
(0, 7)

00911v
(1, 1)
(0, 4)

01031v
(0, 0)
(-1, 12)

01657v
(1, 5)
(2, 12)

01880v
(0, 1)
(-1, 0)

SDC force brute avec images binaires (crédits supplémentaire)

Cette fois-ci, avant d'évaluer les paires d'images avec la SDC, les images sont filtrées binairement avec l'algorithme suivant:

Calcule la carte des gradient en X et en Y pour l'image
Pour chaque pixel:
 Calcule la somme des gradients autour du pixel dans la carte des gradient
 Si la somme des gradients en X ou en Y > valeur arbitraire :
  pixel = blanc
 Sinon:
  pixel = noir

Le résultat est une image binaire qui est insensible au niveau global de luminosité et qui représente les zones de changement d'intensité (gradient), ce qui va rendre le score de la SDC plus représentatif des différences réelles entre les images. D'un canal à l'autre, les gradients sont sensiblement les mêmes et aux même endroits. Les résultats montrent un alignement presque parfait dans tous les cas testés.

*La partie crédit supplémentaire est l'utilisation de mon algorithme décrit ci-haut en prétraitement à la SDC


Exemple d'image binaire formée par l'algorithme décrit ci-haut.

Résultats:


00106v
(1, 4)
(-1, 10)

00757v
(3, 2)
(5, 5)

00888v
(1, 6)
(0, 13)

00889v
(2, 2)
(3, 5)

00907v
(0, 2)
(0, 5)

00911v
(0, 1)
(-1, 13)

01031v
(2, 1)
(2, 4)

01657v
(0, 6)
(1, 12)

01880v
(2, 6)
(4, 14)

Algorithme à échelles multiples

SDC avec images binaires (Canny)

Pour le traitement d'images haute résolution, la méthode utilisée précédament est beaucoup trop lente car la plage de valeur à essayer par force brute augmente en n^2. C'est pourquoi ici la recherche de la translation idéale est divisée en plusieurs échelles (1, 1/2, 1/4...). Pour chaque échelle, on recherche la translation idéale en tenant compte de la translation idéale de l'échelle précédante. Au final, il suffit de faire la somme de toutes les translations multipliées par leur échelle respective. Pour le prétraitement binaire, j'utilise ici un détecteur d'arrête (Canny) déjà implémenté dans OpenCV qui est beaucoup plus rapide que mon algorithme de la section précédante (échelle unique). Le détecteur Canny détecte les gradiants dans l'images, ce qui va permettre de comparer par force brute seulement les arêtes des images avec la SDC. Les résultats montrent un alignement presque parfait dans tous les cas testés.


Exemple d'image binaire formée par l'algorithme Canny

Résultats:


00029u
(38, 85)
(19, 34)

00087u
(57, 110)
(40, 46)

00128u
(31, 51)
(24, 34)

00458u
(33, 82)
(8, 39)

00737u
(16, 48)
(6, 15)

00822u
(34, 122)
(25, 55)

00892u
(4, 40)
(3, 15)

01043u
(20, 9)
(9, -17)

01047u
(33, 69)
(18, 23)

Autres résultats:


00500u
(-18, 132)
(-1, 59)

00501u
(-24, 102)
(0, 32)

00502u
(4, 131)
(10, 57)

00503u
(-29, 110)
(-15, 43)

00504u
(-6, 100)
(10, 44)

00505u
(-29, 122)
(-16, 50)

00506u
(-4, 135)
(10, 60)

00507u
(20, 141)
(23, 60)

00508u
(-17, 106)
(-2, 47)

00509u
(10, 129)
(13, 53)

Mettez-vous dans la peau de Prokudin-Gorskii!

J'ai pris mes propres photos avec mon téléphones en faisant de mon mieux pour ne pas bouger entre chaque photo. Les résultats sont tout aussi bons, voir meilleurs que les photos de Prokudin-Gorskii, propablement en raison que le temps entre les photos est beaucoup plus court et que les photos sont déjà cadrée parfaitement. Fait cocasse, noter l'aiguille des secondes dans la photo de ma montre! Évidamment, cette technique n'est bonne que pour les éléments statiques. On remarque des légères bordures où les canaux ne sont pas superposés aux extrémités des photos en raison des translations effectuées. L'algorithme utilisé est l'algorithme à échelles multiples.

Mes photos avec canaux séparées


beer

watch

smile

Mes photos recombinées


beer

watch

smile