TP1: Colorisation de l'Empire Russe

Par Mathieu Garon

Introduction

Le projet consiste à restaurer les travaux de Sergei Mikhailovich Prokudin-Gorskii. Le photographe avait entrepris de photographier la Russie en 1907 d'une manière méconnue à cette époque, en couleur. Les images ont été achetées par la Librairie du Congrès aux États-Unis, et la démarche suivante propose un moyen de les afficher en couleur.

Approche

Les étapes pour obtenir les résultats présentés dans les sections suivantes sont relativement simple. Les images suivantes ont été obtenues avec les librairies (gratuits!) numpy et openCV dans le langage Python. L'étape de la colorisation consiste à charger l'image noir et blanc et de séparer les trois canaux. Les images ont été divisées simplement en trois. Pour éviter de perdre des données, un algorithme pourrait détecter les trois « carrés » pour faire un découpage plus judicieux. Ensuite, les canaux de couleurs doivent être alignés avec un algorithme tel que la somme des différences au carré. Puisque l'intensité des canaux n’est pas égale, il est plus efficace d'utiliser d'autres informations que l'intensité des pixels. Une solution efficace est d'utiliser les transitions d'intensité (les détails de l'image). Pour ce faire, il suffit d'appliquer un filtre passe-bas sur l'image et de lui soustraire l'image originale. De cette manière, les zones avec un contraste plus élevé sont mises en évidence. Finalement, la corrélation entre les deux images peuvent être fait sur une fenêtre de déplacement prédéfinie (dans le cas présent 30 pixels en x et 30 en y) et le meilleur résultat en x et en y est gardé. Par contre, cette méthode n'est pas efficace pour les photographies ayant une résolution élevée. Parfois, un déplacement de plus de 100 pixels est nécessaire et la méthode itérative peut être particulièrement longue à exécuter. Pour contrer cela, une méthode populaire est la pyramide d'images. La méthode consiste à réduire la résolution de l'image originale par un facteur prédéterminer pour appliquer l'algorithme gourmand en temps de calcul, par récursion, il est possible de calculer le déplacement de l'image sur une image deux fois moins large et d'ajouter le déplacement calculer avec le facteur (deux, dans le cas présent) de la pyramide. Ainsi, le nombre d'itérations pour chacune des images peut être grandement diminué. L'étape suivante est le traitement de l'image pour rehausser la qualité, les algorithmes utilisés seront présentés dans la prochaine section.



crédit : Documentation OpenCV

Basse résolution

00106v 00757v 00888v
R = (0, -9) R = (-5, -5) R = (0, -12)
G = (2, -5) G = (-2, -3) G = (0, -6)

00889v 00907v 00911v
R = (-3, -4) R = (2, -4) R = (0, -13)
G = (-1, -3) G = (1, -3) G = (1, -12)

01031v 01657v 01880v
R = (-2, -4) R = (0, -12) R = (-4, -12)
G = (0, -3) G = (0, -6) G = (-1, -7)

00083v 01018v 01219v
R = (-1, -7) R = (-3, -8) R = (-1, 0)
G = (0, -4) G = (-1, -5) G = (-1, -1)

01572v 01851v
R = (3, -15) R = (1, -15)
G = (2, -8) G = (0, -9)

Haute résolution

00029u 00087u
R = (-46, -88) R = (-57, -109)
G = (-19, -52) G = (-16, -60)

00128u 00458u
R = (-37, -52) R = (-35, -85)
G = (-13, -17) G = (-27, -43)

00737u 00822u
R = (-15, -49) R = (-32, -133)
G = (-9, -35) G = (-6, -67)

00892u 01043u
R = (-5, -42) R = (-16, -9)
G = (-1, -27) G = (-10, -26)

01047u 01453u
R = (-35, -73) R = (-21, -114)
G = (-14, -46) G = (-5, -63)
01457u 01459u
R = (13, -158) R = (35, -133)
G = (12, -82) G = (16, -73)

01460u 01462u
R = (-20, -101) R = (53, -182)
G = (-6, -58) G = (31, -97)

Capture d'images

Dans le but de tester les limites de l'algorithme présenté, trois images avec des caractéristiques particulières sont prisent (sans l'algorithme d'optimisation des couleurs, du contraste et des bordures).




Le cas suivant présente une image avec beaucoup de saturation dans les trois cannaux, non seulement il est plus difficile d'aligner les trois images, mais les erreurs d'alignement sont plus sévères visuellement à cause du blanc.



Le quadriller rouge dans l'image ci-dessus fausse les résultats des corrélations. Pour le démontrer il suffit de comparer les couleurs de la nappe et celle des autres objets. Par exemple, la pièce noir (vert et rose sur l'image) sur la table montre que l'image est fortement décalée, alors que la partie uniforme de la nappe contient les couleurs originale.



Finalement, dans le cas d'un déplacement sévère de la scène, le résultat de la corrélation est faussé. Dans le cas ou trois cémentines sont à la même position, l'image est parfaitement aligné, alors que si une des clémentines est déplacé, l'image est beaucoup plus bruitée.

Crédit supplémentaires

La deuxième partie de l'algorithme sert simplement à améliorer l'apparence des images.

Augmenter les détails

Puisque certaines images sont floues ou ne sont pas alignées à la perfection, une version filtrer avec un filtre passe-bas est retiré de l'image pour augmenter les détails de l'image.

Contraste

Lorsque les images sont alignées et représentées en RGB, en général deux défauts sont perçus. Les trois couleurs sont mal balancées et le contraste n'est pas optimal. En premier lieu, le défi était d'augmenter le contraste des canaux. Le premier essai était simplement d'utiliser la fonction "equalise" sur les histogrammes des trois canaux indépendamment. Étonnement, non seulement le contraste se retrouve optimisé, mais la balance des couleurs en était grandement amélioré. Pour avoir un résultat encore plus convaincant, l'algorithme Contrast Limited Adaptive Histogram Equalization est utilisé.

crédit : Documentation OpenCV

Bordures

Finalement, pour enlever les bordures non désirées automatiquement tout en conservant au maximum l'image originale, un filtre passe-bas est appliqué suivi de la fonction Canny pour mettre les contours en évidence sur quatre parties de l'image. (L'image est coupée à 5 % de chaque côté pour traiter seulement la partie qui comporte la bordure) Ensuite, l'algorithme HoughLine est appliqué pour estimer des lignes dans l'image. La meilleure droite est sélectionnée et l'image est coupée en conséquence.

Problèmes rencontrés

Pour aligner les images, l'intensité des pixels des deux canaux était utilisée. Le défaut de cette méthode provient de l'imprécision due au fait que les canaux n'ont pas les mêmes intensités en fonction des couleurs de la scène. Pour contrer ça, une autre information est utilisée pour l'alignement et il s'agit des hautes fréquences de l'image. Pour ce faire, un filtre passe-bas doit être appliqué sur les photographies et celui-ci doit être soustrait par l'image originale. La comparaison de ces nouvelles données donne des résultats plus précis dans la majorité des cas.

Pour la détection des bordures, l'algorithme a été testé en premier lieu avec les images basse résolution. Le même algorithme a été utilisé pour les hautes résolutions, mais le résultat n'était pas concluant. En effet, la haute résolution des photographies induisait un bruit perçu par l'algorithme de détection des bordures, de ce fait, trop de droites étaient calculées et certaines étaient fausses. Pour remédier à la situation sans changer l'ancien algorithme, il est possible de paramétrer la fonction pour réduire la résolution des images lors de l'application des différents filtres pour la détection des bordures.