Interstices


  De la recherche

Colorisation automatique d'images

Comment coloriser une image noir et blanc automatiquement, sans que l'utilisateur n'ait à intervenir ?

Transformer une photographie en couleurs en un cliché noir et blanc ? Rien de plus facile aujourd'hui ! Mais qu'en est-il du chemin inverse ? Convertir une image noir et blanc en une image en couleurs est un problème complexe, car il n'existe évidemment pas de correspondance unique entre un niveau de gris et une teinte RVB (rouge, vert, bleu). On ne peut donc pas deviner quelles couleurs choisir sans connaissances a priori. De nombreux objets peuvent avoir différentes couleurs, les objets artificiels en plastique par exemple, mais aussi certains objets naturels comme les feuilles des arbres, vertes l'été et marron l'automne.

Différentes méthodes interactives permettent de surmonter cette difficulté. Elles nécessitent qu'un utilisateur choisisse la couleur de certains points ou de certaines zones de l'image, la colorisation étant ensuite complétée automatiquement. La méthode présentée ici part d'un principe radicalement différent.

Texture pour la colorisation

zèbre de référencezèbre noir et blanczèbre colorisé
À gauche : image de référence, au centre : image noir et blanc, à droite : image colorisée.

Pour contourner le problème de correspondance avec les niveaux de gris, nous nous sommes intéressés non pas à la couleur, mais à la texture. En se basant sur un certain nombre d'images en couleurs données en exemple, on cherche des correspondances de textures entre l'image noir et blanc qu'on souhaite coloriser et des images en couleurs similaires, puis on en déduit des possibilités de colorisation.

Comme nous cherchons à comparer la texture d'une image noir et blanc avec celle d'images en couleurs, nous avons choisi d'exprimer les couleurs non pas par leurs valeurs RVB mais par leur équivalent dans l'espace colorimétrique Lab, où L désigne la luminance, qui correspond aux valeurs de gris d'une image noir et blanc.

Dans un premier temps, nous avons dû quantifier la notion de « texture ». Pour définir la texture en un point d'une image, on se base sur le voisinage de ce point à plusieurs échelles, c'est-à-dire que l'on considère plusieurs petites fenêtres carrées, de tailles différentes, centrées en ce point, et on évalue les variations de l'intensité de l'image dans chacune de ces fenêtres, à l'aide de fonctions qu'on nommera ici « descripteurs ». La texture en ce point de l'image est alors décrite par la liste de ces descripteurs, qui peut être vue comme un long vecteur d'une centaine de coordonnées. Deux textures seront similaires si leurs coordonnées sont proches, et réciproquement, elles seront différentes si leurs descripteurs sont différents.

Notons que les bords de l'image ne peuvent pas être décrits de cette façon et qu'un recadrage s'avère donc nécessaire.

Pour chaque pixel de l'image à coloriser, il est ainsi possible de trouver dans les images en couleurs les pixels dont la texture environnante est similaire. On pourrait alors tout simplement coloriser ce pixel avec la couleur qui revient le plus souvent parmi les pixels de texture similaire. Mais ce ne serait certainement pas probant, d'une part parce que les descriptions de texture ne sont pas toujours très fiables, et d'autre part parce qu'il y a de nombreux cas ambigus où plusieurs couleurs sont possibles.

paysage de référencepaysage noir et blancpaysage colorisé
À gauche : image de référence, au centre : image noir et blanc, à droite : image colorisée.

Par exemple, les textures du ciel et de la peau sont très proches, ce qui conduit à une colorisation relativement aléatoire des pixels d'un ciel ou d'un visage en bleu et en rose. Cependant, les yeux sont typiques des visages et non du ciel, ce qui fait que la peau autour des yeux sera correctement colorisée. Pour obtenir une meilleure colorisation, l'idée est d'exiger une certaine cohérence dans l'image, qui ferait que, puisque tous les pixels du reste du visage semblent pouvoir être soit roses soit bleus, à l'exception de ceux autour des yeux qui ne peuvent être que roses, tout le visage soit coloré en rose. Au lieu de se contenter de choisir la couleur la plus probable pour chaque pixel indépendamment, on estime donc la probabilité de chacune des couleurs pour chacun des pixels, on ajoute les contraintes de cohérence dans l'image, c'est-à-dire que l'on prend en compte la probabilité que ce pixel ait telle couleur connaissant la couleur du pixel voisin, et l'on cherche ainsi la colorisation globale la plus probable.

Cohérence de la colorisation

Attardons-nous un peu sur la notion de cohérence de la colorisation : il s'agit d'exprimer à quel point les couleurs de pixels voisins sont censées être similaires ou différentes. Lorsque l'on traverse le bord du visage, les couleurs changent brutalement, alors qu'une joue, ou un front, sont relativement homogènes. Comment estimer la probabilité que la couleur varie en un point quelconque d'une image noir et blanc ? Comme précédemment, en cherchant dans la base d'images en couleurs des exemples de texture similaire et en déterminant si la couleur varie ou non dans ces exemples. Ainsi, de même que l'on peut estimer la probabilité des couleurs associée à une texture, on peut également estimer la probabilité que la couleur varie à cet endroit, ce qui définit un critère de cohérence spatiale pour la colorisation.

Connaissant les probabilités de toutes les couleurs pour tous les pixels ainsi que les probabilités de variations de couleurs entre les pixels voisins, il ne reste plus qu'à trouver la colorisation optimale. À cette fin, nous utilisons un outil, nommé « graph-cut », ou algorithme de maximisation de flot, issu de la théorie des graphes, qui permet de trouver la solution de notre problème. Il s'agit d'un outil d'optimisation très répandu, notamment en vision par ordinateur, car il donne de très bonnes solutions (voire la meilleure) très rapidement (comparé à toutes les méthodes d'optimisation plus anciennes, qui prenaient beaucoup de temps et donnaient de moins bons résultats).

image noir et blancimage coloriséeimage originale témoin
Exemple de colorisation.
Ce résultat a été obtenu à partir d'un corpus d'images similaires, la base de données de Caltech rassemblant des photos de maisons de Pasadena © Photos : California Institute of Technology.
À gauche : image noir et blanc, au centre : image colorisée, à droite : image originale témoin.
couleurs au niveau du pixelprobabilités de variationcouleurs avant luminance
Résultats intermédiaires.
À gauche : couleurs les plus probables obtenues au niveau de chaque pixel, au centre : probabilité de variation de couleur (en noir, variation très probable, en blanc, variation impossible), à droite : couleurs retenues pour l'image, avant application de la luminance.

L'approche expliquée ici ne requiert aucune intervention d'un utilisateur, excepté la sélection d'un certain nombre d'images en couleurs similaires à l'image à coloriser. Même lorsque les images ne sont pas aussi simples à traiter que la photo d'un zèbre dans la savane, elle peut rivaliser avec les méthodes interactives classiques.

Il pourrait être envisagé d'appliquer cette approche à la colorisation de films. Les textures d'une image à la suivante étant quasi-identiques, en combinant cette méthode avec des techniques de tracking qui permettent de suivre la position des objets, on pourrait obtenir de beaux résultats, mais cela reste encore à tester...

Vous pouvez consulter d'autres exemples de colorisation obtenus avec cette méthode et en suivre l'évolution sur une page Web dédiée à ce sujet.

Pour plus d'informations, nous vous proposons une courte bibliographie d'articles scientifiques (en anglais).

Tags