TP1: Coloration de l'Empire Russe, Sébastien de Blois (111 098 332)

Dans ce TP, il faudra utiliser, pour reconstituer une image en couleur, 3 images ayant été prisent avec un filtre bleu, rouge et vert. Il ne suffira pas simplement de les superposer comme certains pourrait penser, il faudra aussi les aligner, car entre les poses avec les différents filtre il y aura eu un mouvement, du ghosting sera présent si aucun ajustement n'est fait.

Approche à une seule échelle (1-echelle.py)

Ici l'approche à une seule échelle sera utilisé sur de petite image. Une plage de déplacement de 15 sera utilisé, donc tous les déplacement de -15 à 15 seront testé en ligne et colonne (donc 31 à la 2 possibilités) pour l'image avec filtre rouge et vert versus l'image bleu. Le déplacement minimisant la somme des différences au carré pour chaque filtre (vert et rouge) sera appliqué et ensuite les images seront réunies en RGB.

Nom du fichier Translation Image
00106v.jpg G => [4, 2]
R => [9, -1]
00757v.jpg G => [2, 2]
R => [5, 5]
00888v.jpg G => [6, 6]
R => [12, 0]
00889v.jpg G => [1, 1]
R => [4, 3]
00907v.jpg G => [2, 2]
R => [6, 0]
00911v.jpg G => [1, 1]
R => [13, -1]
01031v.jpg G => [1, 1]
R => [4, 2]
01657v.jpg G => [5, 5]
R => [11, 1]
01880v.jpg G => [6, 6]
R => [14, 4]

Approche à échelles multiples (Multi-echelles.py)

Cette approche utilise la pyramide d'image: on obtient une pyramide en réduisant la taille de l'image et de la plage d'un facteur de 2 à chaque étape, ici la taille de départ sera 1/8 ensuite 1/4, 1/2 et 1. L'alignement de l'images se fait ici de manière séquentielle en partant de l'échelle la plus petite (1/8 dans notre cas) jusqu'à la plus grande (1) en mettant à jour l'estimation de translation au fur et à mesure. La plage de départ est -25 à 25. Aucune image n'a causée de réel problème, seulement 00087u avait un peu de flou, mais ce problème fut réglé avec l'opérateur de Sobel (crédit supplémentaire).

Nom du fichier Translation Aperçu
cliquez pour visionner
00087u.tif G => [48, 39]
R => [108, 56]
00128u.tif G => [34, 25]
R => [52, 38]
00458u.tif G => [42, 6]
R => [87, 32]
00737u.tif G => [12, 7]
R => [0, 0]
00822u.tif G => [56 25]
R => [124, 33]
00892u.tif G => [16, 3]
R => [42, 4]
01043u.tif G => [11,18]
R => [15, 10]
00029u.tif G => [38, 18]
R => [90, 36]
01047u.tif G => [24, 19]
R => [71, 33]
00019u.tif G => [52, 15]
R => [105, 15]
00045u.tif G => [27, 36]
R => [74, 54]
00050u.tif G => [66, 28]
R => [132,57]
00130u.tif G => [24, -13]
R => [71, -21]
00680u.tif G => [44, 12]
R => [97, 3]
01265u.tif G => [55, 10]
R => [155, 17]
01348u.tif G => [73, 1]
R => [148, -16]
01821u.tif G => [48, 0]
R => [105, -7]
01903u.tif G => [64, 2]
R => [137, -12]
00158u.tif G => [100, 26]
R => [44, 15]

Mettez-vous dans la peau de Prokudin-Gorskii (imageperso.py)

Voici quatre imaghes personnelles aligné (cliquez pour visionner en plus gros). Les deux première ont été prise en restant relativement stable, alors que les deux dernières fut prises en bougeant plus. Le résultat est en accord avec le mouvement les deux images du haut ayant moins d'artefactes que celles du bas. Pour reconstituer l'image couleur, il suffit de prendre trois photos l'une après l'autre, et d'extraire ensuite le canal «R» de la première, «G» de la deuxième, et «B» de la troisième, de faire rouler l'algorithme à échelles multiples sur cela et de sourire!

Crédits supplémentaires

Détection automatique des bordures (mettre auto_crop_actif à 1)

Pour détecter les bordures, un détecteur de discontinuités dans les ditrections verticales et horizontales fut programmé. La sommes des intensité des trois canaux de couleurs fut faites pour chaque colonne et chaque ligne. Ensuite on regarde quelle sont les colonnes et les lignes dans le premier 10% et le dernier 90% de l'image (donc sur les bordures) passent le test suivant (même principe pour les lignes): sum(col_i) < median(all_col)-1.5*sqrt(variance(al_col)). On choisi comme bordure dans les 10% la dernière colonne/ligne passant le test et dans les 90% la première colonne/ligne passant le test.

Avant crop Après crop

Calcul de SDC avec les arêtes au lieu des pixels directement (mettre sobel_actif à 1)

L'opérateur de sobel est utilisé pour obtenir une image représentant les arêtes des images, donc la comparaison pour le calcul des SDC ne se basent pas directement sur la valeur de pixels en RGB, mais sur les pixels des arêtes, ainsi pour les images dont les couleurs (peu de bleu dans l'image par exemple) rendaient parfois le tout difficile pour l'approche conventionnelle, dans ces cas Sobel est fort meilleur, comme le prouve les deux première image (00153u et 00087u). Cependant dans la majorité des cas Sobel ne procure pas vraiment d'avantage, voir la troisième image.

Sobel (arête) Pixel directement

Amélioration de l'image

Amélioration de l'image avec égalisation de l'histogramme en utilisant la fonction skimage.exposure.equalize_adapthist et avec le principe du grey world vue en classe. Les résultats montrent l'amélioration assez importante des images avec ces deux techniques, la première augmentant drastiquement le contraste et par le fait même les détails des images sont améliorés, la deuxième technique permet d'obtenir des images plus neutre, moins chaude et donc possiblement plus près de la réalité.

Égalisation de l'histogramme (mettre auto_contraste_actif à 1)

L'égalisation de l'histogramme en utilsiant equalize_adapthist permet de faire une amélioration locale du contraste dans l'image, en gros des histogrammes sont calculés sur différentes région de l'image, cela permet d'augmenter le détail dans des régions qui sont plus sombres ou plus clairs que le reste de l'image. Les résultats démontrent les bonnes capacités de cette technique pour augmenter le contraste dans l'image et faire sortir les détails.

Avant égalisation Après égalisation

Correction de la balance des gris avec grey-world+égalisation histogramme (mettre grey_world à 1)

L'image du centre montre comment le principe du grey-world permet d'obtenir des couleurs plus neutres dans l'image, l'image de droite montre l'effet combiné de l'égalisation de l'histogramme et de la correction de la balance des gris avec grey-world. L'amélioration de l'image est assez impressionnante selon moi.

Avant grey-world et égalisation Après grey-world Après grey-world et égalisation

Coloration des images à l'aide de l'apprentissage profond (crédit supplémentaire pour vos propres idées à essayer, approuvé par JF par courriel)

Pour faire la coloration des images à partir d'une image grise, il faut convertir l'image RGB créé dans ce travail et ensuite la transformer en greysacle (avec la fonction color.rgb2gray(img_RGB)). L'algorithme de DL qui sera utilisé pour colorer ces images en noir et blanc est celui publié dans Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic Image Colorization with Simultaneous Classification en 2016 par Iizuka et al. Les résultats ne sont pas aussi bien qu'en utilisant les 3 filtres de couleur, cependant ils sont assez intéressant et démontre le potentiel de cette technique, la dame rousse a effectivement les cheveux brun-roux avec le DL, assez fou je trouves! D'autres algorithmes pouvant offrir des performances meilleures sont ceux utilisant les réseaux antagonistes génératifs (GAN en anglais).

Noir et blanc Deep learning Couleurs (avec filtres)