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.