dimanche 11 novembre 2012

Pseudocouleurs avec OpenCV

La Lune en niveaux de gris (photo)

Les fausses couleurs, ou pseudo-couleurs, sont utilisées pour rajouter une gamme de couleurs à une image en niveaux de gris.
La Lune en pseudo-couleurs, colorisée avec OpenCV

Le processus est différent d'une recolorisation, où vous essayez de retrouver les couleurs les plus plausibles sur une vieille pellicule cinéma ou un cliché, pris lorsque seuls les systèmes noirs et blancs étaient disponibles facilement. La recolorisation est une étape mathématique complexe, alors que la pseudocolorisation est très simple : vous mettez en correspondance chaque intensité spécifique de chaque pixel de l'image d'origine avec un triplet de valeurs RGB provenant d'une échelle de couleurs fournie au préalable.

La technique est largement utilisée en photographie aérienne, en imagerie thermique et dans d'autres domaines. L'adjonction d'un nouveau canal d'information par l'utilisation de la couleur peut apporter une nouvelle lecture de l'information.

Différentes techniques sont possibles pour le choix du triplet des valeurs RGB.

Dans la suite de l'article, les exemples de code sont plus spécifiquement liés à l'utilisation d'OpenCV.
Ici, l'auteur utilise 3 sinusoides pour récupérer trois valeurs d'intensité différentes, une pour chaque canal. C'est rapide, mais ce n'est pas toujours facile de savoir à quelle couleur correspond telle ou telle intensité de blanc.

Je propose ici une mise en correspondance directe de la valeur d'intensité du pixel en niveau de gris à une couleur spécifique, choisie dans une table des couleurs. Cette table de couleurs est fournie en tant qu'image additionnelle.
L'intensité de blanc est dans l'espace [0..255] (image 8 bits), et la couleur est représentée comme un triplet classique R([0..255]),G([0..255]),B([0..255]).




Explication du processus de recolorisation

Vous pouvez également utiliser les fonctions LUT d'OpenCV pour construire une table de lookup, mais je voulais essayer quelque chose de plus "manuel".

L'idée est très simple : vous tracez un gradient de couleur sur une image de 255 pixels de haut, et d'un pixel de large, qui sera notre colormap.


Sur l'image en niveaux de gris, vous prenez la valeur de chaque pixel, et vous regardez dans la colormap à la coordonnée (0,valeur_d_intensité). (En fait, vous devez faire l'opération trois fois, une pour chaque canal R,G et B).
Les 3 valeurs stockées à ces coordonnées sont celles du pixel nouvellement coloré !



J'ai élargi un peu l'image de la colormap en largeur, c'est ainsi plus facile de contrôler les couleurs. Seule la première colonne de pixels de l'image est utilisée par le code.




(Dans l'archive fournie comme exemple, la colormap est un fichier JPEG. Pour obtenir les meilleurs résultats, utilisez un format de fichier non-destructif, comme le PNG ou le BMP).

Avec OpenCV, vous pouvez utiliser cvSplit() pour obtenir trois images différentes, une par canal de couleur de l'image originale.




Vous pouvez trouver ici un exemple Visual Studio assez rapide, qui utilise OpenCV, pour coloriser une image en niveaux de gris passée en paramètre sur la ligne de commande, à l'aide d'une colormap. Vous devez également fournir le nom de la colormap. Le programme écrit l'image couleur résultant dans une image bitmap.

Sur l'exemple du babouin, vous pouvez vous rendre compte que les gris de l'image originale sont concentrés autour d'une couleur moyenne (proche de 128). Il n'y a pas beaucoup de gris très foncés ou très clairs dans l'image, l'image finale est donc principalement jaune, la couleur moyenne de la colormap. Pour obtenir de meilleurs résultats, vous pouvez effectuer quelques manipulation sur l'image d'origine (comme une équalisation de l'histogramme, pour couvrir de manière plus uniforme les couleurs du noir vers le blanc).


Voici un lien vers l'archive contenant le code, vous pouvez également parcourir le code sur GitHub.

J'ai utilisé la syntaxe C d'OpenCV. L'exemple se compile avec Visual Studio 2005 et plus récent (normalement).

(A propos, l'image de la Lune est dans le domain public, l'image du babouin provient du répertoire d'OpenCV).

Aucun commentaire:

Enregistrer un commentaire