Ce nouvel article a pour but de donner une brève introduction à l’analyse d’images numériques en bioinformatique. Je préfère prévenir tout de suite, je ne suis pas expert en la matière mais c’est un domaine que je trouve très intéressant et dont il est toujours utile d’avoir quelques notions, pour retoucher vos magnifiques photos de vacances mais surtout pour aider votre collègue biologiste en détresse devant son microscope.
Qu’est ce qu’une image ?
Dans cet article je me limiterai à l’utilisation d’images matricielles en deux dimensions (le plus courant). Le terme « image numérique » regroupe toute image stockée sous forme binaire. En biologie, les images 2D sont principalement issues de photographies, scanners, microscopie optique ou électronique. Ces images sont caractérisées par :
- Le nombre de pixels
- Etendue de teinte de gris ou de couleurs (dynamique)
Les pixels sont l’unité élémentaire d’une image. Ceux d’entre vous qui se sont bien éclatés les yeux sur Gameboy pendant leur jeunesse le savent bien : le nombre de pixels qui composent l’image en hauteur et en largeur (définition) ainsi que le nombre de pixels par unité de longueur (résolution, généralement en Point par Pouce ou ppp ) sont deux caractéristiques importantes d’une image 2D.
Les pixels composant une image possèdent une valeur correspondant à une teinte. Il existe différents types d’images, les plus courants étant :
- Les images binaires. Les plus simples, seulement deux couleurs sont possibles, noir ou blanc (valeur 0 ou 1).
- Les images en teinte de gris. Ce type d’image peut contenir un maximum de 256 ‘gris’ différents (valeur de pixel allant de 0 a 255).
- Les images couleurs. Ce sont les plus complexes, il existe différents espaces de couleurs (HSV, YUV, RGB, CMYK) et chaque espace de couleurs a ses propres caractéristiques.
Je ne vais pas m’étendre davantage sur les caractéristiques des images numériques, il y a d’excellents supports disponibles pour compléter ces informations, cette entrée Wikipédia est un très bon point de départ pour en savoir un peu plus. Passons plutôt à la pratique.
Les outils :
Tout d’abord, quels outils utiliser ? Il existe un grand nombre de logiciels permettant d’éditer vos images numériques. Ces outils sont souvent payants et assez onéreux. Heureusement, il existe également des alternatives gratuites. C'est le cas par exemple de ImageJ, développé au National Institute of Health, qui est un outil fiable, offrant de nombreux avantages :
- Open source
- Multiplateforme (Java)
- Possibilité d’implémenter ses propres plugins (Java)
- Possibilité de créer de macros
- Pleins de plugins disponibles (avec certains incontournables ;-)…)
- Supporte les piles d’images (stacks)
- Supporte une grande quantité de formats
- De nombreuses fonctions d’analyses (calcul d’angles, distances, histogrammes, profiles, etc.)
- Relativement facile d’utilisation et bonne documentation
Il existe également des variantes comme par exemple Fiji ou encore IJ_ed. Personnellement, j'ai pris l'habitude d'utiliser ImageJ, pour les raisons citées plus haut et sa facilité de prise main. L'exemple ci-dessous est donc réalisé avec cet outil.
Exemple d’utilisation :
Dans cet exemple, nous allons voir comment il est possible d’analyser un réseau (de neurones, de capillaires ou ce que vous voulez !). Par analyser, j’entends identifier le nombre de nœuds, le nombre de feuilles et de branches de votre réseau.
Voici donc mon image originale, cette image a été prise en microscopie optique, il s’agit d’un réseau de capillaire sanguin du globe oculaire d’une souris atteinte de diabète (true story…). Je préfère préciser juste au cas ou vous ne l’auriez pas reconnu tout de suite 😉
Après avoir ouvert le fichier dans ImageJ, la première étape va consister à transformer cette image en teinte de gris (beaucoup plus facile à traiter).
1 |
<strong>Image -> ; Type -> ; 8 bits  ;</strong> |
et voici ce que ça donne.
Ensuite, l’idée et d’isoler les réseaux du fond (background), pour cela on a joué sur la luminosité et contraste de l’image.
1 |
<strong>Image -> ; Adjust -> ; Brightness/Luminosity</strong> |
L’image est ensuite convertie en binaire (noir et blanc). Pour cela, nous allons sélectionner un seuil, c’est à dire une valeur de pixel qui va définir une limite. Tous les pixels dont la valeur est inférieure à cette limite vont prendre une valeur (1 ou 0), les autres prendront la seconde valeur (0 ou 1). Nous obtenons ainsi une image avec uniquement 2 valeurs de pixel 0 et 1. Le choix du seuil et très important car il est possible de perdre un grand nombre d’informations intéressantes durant cette étape.
1 |
<strong>Image -> ; Adjust -> ; Threshold</strong> |
Etape optionnelle pour les puristes :
Il est possible d'utiliser les images binaires pour réaliser des opérations arithmétiques sur les images (addition, soustraction, multiplication, etc.). Pour supprimer les restes de "fond" apparaissant sur cette image binaire, il est possible de combiner 2 méthodes : isoler les petites particules (pixels noirs qui ne font pas partie du réseau), et la soustraction d'image. Commençons par identifier le bruit de fond :
1 |
<strong>Analyse -> ; Analyse particules</strong> |
En choisissant une taille de particule relativement faible (size : 0–500 | show : masks) nous obtenons, dans une nouvelle fenêtre, une image contenant uniquement ces petites particules isolées. Nous utilisons ensuite :
1 |
<strong>Image -> ; Image Calculator </strong> |
pour combiner nos deux images (image 1 : notre image binaire | opération : substract | image 2 : bruit de fond). Le résultat est une image débarrassée de tout (ou presque) ce qui ne fait pas partie du réseau de capillaire.
Le prochaine étape consiste a transformer notre image binaire en squelette qu’il sera ensuite possible d’analyser. Pour cela, nous allons utiliser un petit plugin « AnalyseSkeleton » disponible ici. Je passe sur les détails de l’installation d’un plugin ImageJ, la documentation est là pour vous guider.
Dans un premier temps, nous utiliserons ce plugin pour transformer notre image en squelette.
1 |
<strong>Plugins -> ; Skeleton -> ; Skeletonize</strong> |
Toujours en utilisant le même plugin, il est possible d’analyser le squelette obtenu précédemment :
1 |
<strong>Plugin -> ; Analyse -> ; Analyse Skeleton</strong> |
Le plugin fournit tout un tas d'informations intéressantes sur votre squelette (nombre d’embranchements, taille de la plus longue branche, etc.). Le détail de ces informations est disponible dans la documentation.
La qualité et la précision du résultat obtenu dépendent biensur de votre image originale mais surtout du traitement que vous aurez fait subir à celle-ci. Il est important de garder à l'esprit que toute modification apportée à l'image implique souvent des pertes d'informations, le choix des options (valeur de seuil, ajustement du contraste, etc.) joue donc un rôle important sur le résultat final.
Si vous souhaitez vous entrainer un peu, je vous recommande ces quelques exemples du site officiel d'ImageJ. Vous pouvez également jeter un oeil à ces deux articles qui donnent des exemples d'analyse de gels : Western Blot, et un tutorial plus généraliste sur les gels. Un enseignant de l'université de Bordeaux I (que j'ai eu la chance d'avoir comme professeur il y a quelques années 😉 ) , a mis en ligne un blog qui rassemble plein d'informations et d'exemples permettant de se faire la main sur ImageJ de manière ludique. Enfin, quand vous serez passés expert en manipulation d'images, vous pourrez aller tester vos capacités sur une série de mini-jeux développée par ce même enseignant (merci pour ce joli travail Mr Taveau !). Voila de quoi bien vous occuper 😉
J’espère que cette courte introduction vous donnera envie de vous pencher un peu plus sur les différentes techniques d'analyse d'image et vous permettra de vous débrouiller en cas de besoin.
Laisser un commentaire