TP1: Colorisation de l'Empire Russe

«Draw me like one of your french girls» - Rose, Titanic 1997

En 1907 un photographe russe du nom de Sergei Mikhailovich Prokudin-Gorskii veut dresser un portrait de la Russie à l'époque. Afin de rendre le contenue intéressant, il utilise une technique d'avant-garde pour capturer les couleurs dans ses portraits. À l'aide de filtre de couleurs, il capture en trois photos de chacun des portraits avec l'aide d'une seule caméra. Les filtres utilisés correspondent au "Red-Green-Blue" encore utilisé aujourd'hui pour la représentation des couleurs.

Le travail consiste à réunir les trois photos de chaque portrait en s'assurant du bon alignement des clichés.

Technique

Afin d'aligner les images pour recréer le portrait couleur, on calcule la somme des différences au carré entre deux canaux avec plusieurs alitements possibles. Un fois deux canaux d'alignés, on reprend la même technique pour le troisième canal.

np.sum(np.square(img_a - img_b))

Le résultat de chacun des alignements est stocké temporairement dans une matrice où chaque cellule est un décalage de la 2e image différent. On trouve ensuite la position d'un minimum dans la matrice ce qui nous donnera la bonne translation à appliquer.

Technique itérative

Les images étant de très grande taille il devient très long de calculer un grand nombre de somme des différences au carré. La solution retenue est d'y aller de façons itérative en divisant par 2 l'image tant qu'elle n'ateint pas une petite taille fixe. Par la suite on applique le résultat à l'image présédante de plus grande taille.

Fonctionement

Le code est en python et a été exécuté sur windows avec les versions suivantes:

>>> import cv2
>>> cv2.__version__
'3.2.0'
>>> import numpy as np
>>> np.__version__
'1.12.0'

Dans la fonction main, les fichiers utilisés sont listés. La fonction combine_image('nom_du_fichier.tif', True) permet de combiner les channels d'une image, le 2e paramètre (True or False) permet de déterminé si la méthode itérative sera utilisé.

Les valeurs de plusieurs constantes pourraient être ajustées à la baise pour donner de meilleures performances (traitement plus rapide), mais la technique itérative est drastiquement plus rapide que celle brute force.

La fonction convert_image() a été utilisé pour produire une version noir et blanc des images perso.

Photo perso

Apparement l'internet a déclaré que Angela Merkel est une hipster, alors célébrons cette forme d'art en combinant des images psychédéliques.

source http://hipstermerkel.tumblr.com/

Bonus

Retrait automatique des bordures blanches

Les bordures blanches présentes sur certaines photos nuisaient à l'obtention d'un bon résultat. J'ai donc fait un algorithme très primitif pour les retirer. À l'aide de la moyenne des premières et dernières lignes/colones on retire de l'image originale la partie blanche du contour. Une valeur treshold est donnée en constante pour la tolérance du Blanc. Le code est dans le fichier frameDetection.py.

Se mettre dans la peau de Sergei

Ajouter un filtre devant l'optique d'une caméra revient à contrôler la lumière qui atteint le capteur de cette caméra. J'ai voulu arriver au même résultat, mais ne disposant pas de filtre de couleur je devais trouver un autre moyen. Le plus simple était de contrôler la lumière qui illuminait la scène captée, en utilisant deux moniteurs (un portable et un moniteur Dell). De cette façon chacune des trois couleurs RGB est captée une à la fois par l'appareil photo.

L'utilisation du trépied facilitait grandement les manipulations et avec le zoom optique de mon appareil au maximum, il était indispensable. La principale chose que j'aurai appris de cette technique c'est que les appareils photo numériques bon marché ont une utilisation très limitée. Mon appareil de dispose pas de fonction manuel du focus :-(. Par contre contrôler le ISO (ensitivity of the sensor to light) a grandement aidé au bon résultat, malgré que les deux moniteurs produisaient une quantité moindre de lumière.

Résultat

©Jean-Daniel Pearson