Introduction à l'analyse d'images

Ce nou­vel article a pour but de don­ner une brève intro­duc­tion à l’analyse d’images numé­riques en bio­in­for­ma­tique. Je pré­fère pré­ve­nir tout de suite, je ne suis pas expert en la matière mais c’est un domaine que je trouve très inté­res­sant et dont il est tou­jours utile d’avoir quelques notions, pour retou­cher vos magni­fiques pho­tos de vacances mais sur­tout pour aider votre col­lègue bio­lo­giste en détresse devant son micro­scope.

QR-code
Les code qr uti­lisent l'analyse d'image pour coder et déco­der des infor­ma­tions.

Qu’est ce qu’une image ?

Dans cet article je me limi­te­rai à l’utilisation d’images matri­cielles en deux dimen­sions (le plus cou­rant). Le terme « image numé­rique » regroupe toute image sto­ckée sous forme binaire.  En bio­lo­gie, les images 2D sont prin­ci­pa­le­ment issues de pho­to­gra­phies, scan­ners, micro­sco­pie optique ou élec­tro­nique. Ces images sont carac­té­ri­sées par :

  • Le nombre de pixels
  • Eten­due de teinte de gris ou de cou­leurs (dyna­mique)

Les pixels sont l’unité élé­men­taire d’une image. Ceux d’entre vous qui se sont bien écla­tés les yeux sur Game­boy pen­dant leur jeu­nesse le savent bien : le nombre de pixels qui com­posent l’image en hau­teur et en lar­geur (défi­ni­tion) ain­si que le nombre de pixels par uni­té de lon­gueur (réso­lu­tion, géné­ra­le­ment en Point par Pouce ou ppp ) sont deux carac­té­ris­tiques impor­tantes d’une image 2D.

Les pixels com­po­sant une image pos­sèdent une valeur cor­res­pon­dant à une teinte. Il existe dif­fé­rents types d’images, les plus cou­rants étant :

  • Les images binaires. Les plus simples, seule­ment deux cou­leurs sont pos­sibles, noir ou blanc (valeur 0 ou 1).
  • Les images en teinte de gris. Ce type d’image peut conte­nir un maxi­mum de 256 ‘gris’ dif­fé­rents (valeur de pixel allant de 0 a 255).
  • Les images cou­leurs. Ce sont les plus com­plexes, il existe dif­fé­rents espaces de cou­leurs (HSV, YUV, RGB, CMYK) et chaque espace de cou­leurs a ses propres carac­té­ris­tiques.

Je ne vais pas m’étendre davan­tage sur les carac­té­ris­tiques des images numé­riques, il y a d’excellents sup­ports dis­po­nibles pour com­plé­ter ces infor­ma­tions, cette entrée Wiki­pé­dia est un très bon point de départ pour en savoir un peu plus. Pas­sons plu­tôt à la pra­tique.

 

Les outils :

Tout d’abord, quels outils uti­li­ser ? Il existe un grand nombre de logi­ciels per­met­tant d’éditer vos images numé­riques. Ces outils sont sou­vent payants et assez oné­reux. Heu­reu­se­ment, il existe éga­le­ment des alter­na­tives gra­tuites. C'est le cas par exemple de Ima­geJ, déve­lop­pé  au Natio­nal Ins­ti­tute of Health, qui est un outil fiable, offrant de nom­breux avan­tages :

  • Open source
  • Mul­ti­pla­te­forme (Java)
  • Pos­si­bi­li­té d’implémenter ses propres plu­gins (Java)
  • Pos­si­bi­li­té de créer de macros
  • Pleins de plu­gins dis­po­nibles (avec cer­tains incon­tour­nables ;-)…)
  • Sup­porte les piles d’images (stacks)
  • Sup­porte une grande quan­ti­té de for­mats
  • De nom­breuses fonc­tions d’analyses (cal­cul d’angles, dis­tances, his­to­grammes, pro­files, etc.)
  • Rela­ti­ve­ment facile d’utilisation et bonne docu­men­ta­tion

Il existe éga­le­ment des variantes comme par exemple Fiji  ou encore IJ_​ed. Per­son­nel­le­ment, j'ai pris l'habitude d'utiliser Ima­geJ, pour les rai­sons citées plus haut et sa faci­li­té de prise main. L'exemple ci-des­sous est donc réa­li­sé avec cet outil.

Exemple d’utilisation :

Dans cet exemple, nous allons voir com­ment il est pos­sible d’analyser un réseau (de neu­rones, de capil­laires ou ce que vous vou­lez !). Par ana­ly­ser, j’entends iden­ti­fier le nombre de nœuds, le nombre de feuilles et de branches de votre réseau.

Voi­ci donc mon image ori­gi­nale, cette image a été prise en micro­sco­pie optique, il s’agit d’un réseau de capil­laire san­guin du globe ocu­laire d’une sou­ris atteinte de dia­bète (true sto­ry…). Je pré­fère pré­ci­ser juste au cas ou vous ne l’auriez pas recon­nu tout de suite 😉

Exemple de réseau capil­laire. (Image prise au micro­scope optique. Valeur d'agrandissement non dis­po­nible *cough*).

Après avoir ouvert le fichier dans Ima­geJ, la pre­mière étape va consis­ter à trans­for­mer cette image en teinte de gris (beau­coup plus facile à trai­ter).

et voi­ci ce que ça donne.

Conver­sion en teinte de gris

Ensuite, l’idée et d’isoler les réseaux du fond (back­ground), pour cela on a joué sur la lumi­no­si­té et contraste de l’image.

Après ajus­te­ment de lumi­no­si­té et du contraste

L’image est ensuite conver­tie en binaire (noir et blanc). Pour cela, nous allons sélec­tion­ner un seuil, c’est à dire une valeur de pixel qui va défi­nir une limite. Tous les pixels dont la valeur est infé­rieure à cette limite vont prendre une valeur (1 ou 0), les autres pren­dront la seconde valeur (0 ou 1). Nous obte­nons ain­si une image avec uni­que­ment 2 valeurs de pixel 0 et 1. Le choix du seuil et très impor­tant car il est pos­sible de perdre un grand nombre d’informations inté­res­santes durant cette étape.

 

Conver­sion en image binaire

 

Etape option­nelle pour les puristes :

Il est pos­sible d'utiliser les images binaires pour réa­li­ser des opé­ra­tions arith­mé­tiques sur les images (addi­tion, sous­trac­tion, mul­ti­pli­ca­tion, etc.). Pour sup­pri­mer les restes de "fond" appa­rais­sant sur cette image binaire, il est pos­sible de com­bi­ner 2 méthodes : iso­ler les petites par­ti­cules (pixels noirs qui ne font pas par­tie du réseau), et la sous­trac­tion d'image. Com­men­çons par iden­ti­fier le bruit de fond :

En choi­sis­sant une taille de par­ti­cule rela­ti­ve­ment faible (size : 0–500 | show : masks) nous obte­nons, dans une nou­velle fenêtre, une image conte­nant uni­que­ment ces petites par­ti­cules iso­lées. Nous uti­li­sons ensuite :

pour com­bi­ner nos deux images (image 1 : notre image binaire | opé­ra­tion : sub­stract | image 2 : bruit de fond). Le résul­tat est une image débar­ras­sée de tout (ou presque) ce qui ne fait pas par­tie du réseau de capil­laire.

 

Le pro­chaine étape consiste a trans­for­mer notre image binaire en sque­lette qu’il sera ensuite pos­sible d’analyser. Pour cela, nous allons uti­li­ser un petit plu­gin « Ana­ly­seS­ke­le­ton » dis­po­nible ici. Je passe sur les détails de l’installation d’un plu­gin Ima­geJ, la docu­men­ta­tion est là pour vous gui­der.

Dans un pre­mier temps, nous uti­li­se­rons ce plu­gin pour trans­for­mer notre image en sque­lette.

 

Image conver­tie en sque­lette binaire

Tou­jours en uti­li­sant le même plu­gin, il est pos­sible d’analyser le sque­lette obte­nu pré­cé­dem­ment :

 

Ana­lyse du sque­lette

Le plu­gin four­nit tout un tas d'informations inté­res­santes sur votre sque­lette (nombre d’embranchements, taille de la plus longue branche, etc.). Le détail de ces infor­ma­tions est dis­po­nible dans la docu­men­ta­tion.

 

La qua­li­té et la pré­ci­sion du résul­tat obte­nu dépendent bien­sur de votre image ori­gi­nale mais sur­tout du trai­te­ment que vous aurez fait subir à celle-ci. Il est impor­tant de gar­der à l'esprit que toute modi­fi­ca­tion appor­tée à l'image implique sou­vent des pertes d'informations, le choix des options (valeur de seuil, ajus­te­ment du contraste, etc.) joue donc un rôle impor­tant sur le résul­tat final.

Si vous sou­hai­tez vous entrai­ner un peu, je vous recom­mande ces quelques  exemples du site offi­ciel d'ImageJ. Vous pou­vez éga­le­ment jeter un oeil à ces deux articles qui donnent des exemples d'analyse de gels : Wes­tern Blot, et un tuto­rial plus géné­ra­liste sur les gels. Un ensei­gnant de l'université de Bor­deaux I (que j'ai eu la chance d'avoir comme pro­fes­seur il y a quelques années 😉 ) , a mis en ligne un blog qui  ras­semble plein d'informations et d'exemples per­met­tant de se faire la main sur Ima­geJ de manière ludique. Enfin, quand vous serez pas­sés expert en mani­pu­la­tion d'images, vous pour­rez aller tes­ter vos capa­ci­tés sur une série de mini-jeux déve­lop­pée par ce même ensei­gnant (mer­ci pour ce joli tra­vail Mr Taveau !). Voi­la de quoi bien vous occu­per 😉

J’espère que cette courte intro­duc­tion vous don­ne­ra envie de vous pen­cher un peu plus sur les dif­fé­rentes tech­niques d'analyse d'image et vous per­met­tra de vous débrouiller en cas de besoin.

 

 



Pour continuer la lecture :


Commentaires

2 réponses à “Introduction à l'analyse d'images”

  1. Excellent article ! Cepen­dant j'ai peut être quelques remarques à pro­po­ser de part le peu d'expérience que j'ai pu engran­ger durant mon stage de mas­ter (bien­tôt fini d'ailleurs).

    Tout d'abord, l'utilisation de Fiji dans le cadre de recherches en bio­lo­gie apporte de mul­tiples avan­tages, tous lis­tés et décrits dans l'article sui­vant : http://​www​.nature​.com/​n​m​e​t​h​/​j​o​u​r​n​a​l​/​v​9​/​n​7​/​f​u​l​l​/​n​m​e​t​h​.​2​0​1​9​.​h​tml
    Un exemple concerne le module 'Ske­le­to­nize', dis­po­nible dès l'installation du logi­ciel. Fiji ras­semble donc une grande par­tie des plu­gins d'ImageJ les plus uti­li­sés en bio­lo­gie (sans par­ler de toutes les amé­lio­ra­tions qu'il apporte à Ima­geJ, cf : article cité ci-des­sus).

    Sinon, j'ai aus­si appris que, selon les images, il est par­fois inté­res­sant de sépa­rer les trois "canaux" de cou­leurs (rouge, vert, bleu) avant de conver­tir l'image en niveaux de gris. En effet, il est pos­sible que (pour reprendre l'exemple expo­sé dans cet article) le canal rouge ne contienne aucun bruit et révèle uni­que­ment les infor­ma­tions d'intérêt (ce n'est qu'une sup­po­si­tion).

    Enfin, je suis tout à fait d'accord quant à l'importance d'avoir une image de qua­li­té. Ça sim­pli­fie tout !

    Mer­ci pour cet article !

  2. Mer­ci Davd, pour ce com­ple­ment d'information.
    Je tes­te­rai Fiji la pro­chaine fois que j'ai besoin de faire de l'imagerie !
    Pour ce qui est de la sepa­ra­tion des canaux, hon­ne­te­ment je ne sais pas trop quels seraient les effets. Mais il y a sans doute un meilleur work­flow que celui que j'ai pro­pose dans cet article. A tes­ter donc !

Laisser un commentaire