09.08.2013 Views

Analyse avec le logiciel imagej d'un lot d'images en microscopie par ...

Analyse avec le logiciel imagej d'un lot d'images en microscopie par ...

Analyse avec le logiciel imagej d'un lot d'images en microscopie par ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

in2p3-00530281, version 1 - 28 Oct 2010<br />

PCCF RI 1004<br />

24 Juil<strong>le</strong>t 2010<br />

<strong>Analyse</strong> <strong>avec</strong> <strong>le</strong> <strong>logiciel</strong> ImageJ d’un <strong>lot</strong> d’images <strong>en</strong><br />

<strong>microscopie</strong> <strong>par</strong> immunofluorec<strong>en</strong>ce de cellu<strong>le</strong>s de<br />

fibroblastes irradiées <strong>en</strong> X à l’E.S.R.F.<br />

F.Chandez, G.Montarou<br />

Laboratoire de Physique Corpusculaire de C<strong>le</strong>rmont-Ferrand<br />

CNRS/IN2P3, C<strong>le</strong>rmont Université<br />

F-63177 Aubière Cedex France<br />

Sommaire<br />

Le problème de radios<strong>en</strong>sibilité individuel<strong>le</strong> est plus d’actualité que jamais face à l’ap<strong>par</strong>ition<br />

d’une diversification des types de faisceaux et notamm<strong>en</strong>t l’ap<strong>par</strong>ition des faisceaux de <strong>par</strong>ticu<strong>le</strong>s<br />

lourdes (hadronthérapie <strong>par</strong> ions légers tels <strong>le</strong>s ions carbone) pour <strong>le</strong> traitem<strong>en</strong>t de tumeurs<br />

cancéreuses radio-résistantes aux traitem<strong>en</strong>ts classiques <strong>par</strong> photons. C’est dans ce cadre que <strong>le</strong><br />

programme de recherche expérim<strong>en</strong>ta<strong>le</strong> ROSIRIS (RadiobiOlogie des Systèmes Intégrés pour<br />

l’optimisation des traitem<strong>en</strong>ts utilisant des rayonnem<strong>en</strong>ts ionisants et évaluation du RISque associé)<br />

a été initié <strong>par</strong> l’IRSN et l’INSERM.<br />

Un des objectifs de ce programme sci<strong>en</strong>tifique est de corré<strong>le</strong>r <strong>le</strong>s observab<strong>le</strong>s caractérisant <strong>le</strong>s<br />

événem<strong>en</strong>ts biologiques précoces aux événem<strong>en</strong>ts physiques résultant des dépôts d’énergie des<br />

rayonnem<strong>en</strong>ts ionisants dans <strong>le</strong>s cellu<strong>le</strong>s. L’originalité de l’approche réside dans l’utilisation des<br />

techniques <strong>le</strong>s plus réc<strong>en</strong>tes d’id<strong>en</strong>tification des cassures doub<strong>le</strong>-brin de l’ADN. La méthode choisie<br />

pour l'étude des cassures doub<strong>le</strong>s brins est l'observation des foci H2AX <strong>en</strong> <strong>microscopie</strong> <strong>par</strong><br />

immunofluoresc<strong>en</strong>ce. L’immunofluoresc<strong>en</strong>ce <strong>avec</strong> des anticorps spécifiques contre <strong>le</strong>s formes<br />

phosphorylées de l’histone H2AX ( -H2AX) permet <strong>en</strong> effet de mettre <strong>en</strong> évid<strong>en</strong>ce <strong>le</strong>s cassures<br />

doub<strong>le</strong>-brin (DSB) sous forme de spots fluoresc<strong>en</strong>ts appelés foci. Suivant la nature et l’énergie des<br />

<strong>par</strong>ticu<strong>le</strong>s, <strong>le</strong> nombre, la tail<strong>le</strong>, l’int<strong>en</strong>sité lumineuse et la ré<strong>par</strong>tition spatia<strong>le</strong> des foci H2AX est<br />

susceptib<strong>le</strong> de changer. Le projet ROSIRIS a pour objectif de constituer des plateformes<br />

d’irradiation, ainsi qu’une plateforme de traitem<strong>en</strong>t et des analyses des images cellulaires, basée<br />

sur l’utilisation d’un microscope automatisée. Cette plateforme devrait permettre de traiter une<br />

grande quantité d’images et donc de constituer une base de données significatives permettant de<br />

tester <strong>le</strong>s observab<strong>le</strong>s biologiques <strong>en</strong> fonctions des conditions d’irradiation. Parallè<strong>le</strong>m<strong>en</strong>t à ce<br />

dispositif expérim<strong>en</strong>tal d’acquisition d’image, il sera nécessaire de mettre au point un <strong>logiciel</strong> de<br />

traitem<strong>en</strong>t et d’analyse <strong>le</strong> plus indép<strong>en</strong>dant possib<strong>le</strong> de l’opérateur permettant une analyse<br />

automatique des données. Cette note décrit <strong>le</strong>s résultats d’une première approche de ce domaine,<br />

destiné à <strong>en</strong> préciser <strong>le</strong>s difficultés et <strong>le</strong>s défis pour obt<strong>en</strong>ir et réaliser une tel<strong>le</strong> plateforme<br />

d’analyse d’image.<br />

Page 1


in2p3-00530281, version 1 - 28 Oct 2010<br />

Le projet ROSIRIS<br />

Les individus prés<strong>en</strong>t<strong>en</strong>t de façon innée une s<strong>en</strong>sibilité variab<strong>le</strong> aux rayonnem<strong>en</strong>ts ionisants. Il a été<br />

démontré que certains pati<strong>en</strong>ts qui sont soumis à des irradiations thérapeutiques montr<strong>en</strong>t une<br />

réponse à l’irradiation plus forte qu’att<strong>en</strong>du au niveau des tissus sains, aussi bi<strong>en</strong> <strong>en</strong> termes d'effets<br />

précoces que tardifs.<br />

Les complications inhér<strong>en</strong>tes aux surdosages au niveau des organes à risque justifi<strong>en</strong>t une<br />

évaluation des risques liés aux radiothérapies, mais aussi une prise <strong>en</strong> compte de la radios<strong>en</strong>sibilité<br />

individuel<strong>le</strong> du pati<strong>en</strong>t et de son statut génétique.<br />

Le problème de radios<strong>en</strong>sibilité individuel<strong>le</strong> est plus d’actualité que jamais face à l’ap<strong>par</strong>ition<br />

d’une diversification des types de faisceaux et notamm<strong>en</strong>t l’ap<strong>par</strong>ition des faisceaux de <strong>par</strong>ticu<strong>le</strong>s<br />

lourdes (hadronthérapie <strong>par</strong> ions légers tels <strong>le</strong>s ions carbone) dont <strong>le</strong>s indications relèv<strong>en</strong>t<br />

précisém<strong>en</strong>t des situations de radiorésistance aux photons.<br />

C’est dans ce cadre que <strong>le</strong> programme de recherche expérim<strong>en</strong>ta<strong>le</strong> ROSIRIS (RadiobiOlogie des<br />

Systèmes Intégrés pour l’optimisation des traitem<strong>en</strong>ts utilisant des rayonnem<strong>en</strong>ts ionisants et<br />

évaluation du RISque associé) a été initié <strong>par</strong> l’IRSN et l’INSERM.<br />

Un des objectifs général de ce projet est <strong>le</strong> développem<strong>en</strong>t de la modélisation biophysique des<br />

événem<strong>en</strong>ts précoces induits <strong>par</strong> <strong>le</strong>s rayonnem<strong>en</strong>ts ionisants, notamm<strong>en</strong>t la modélisation des<br />

événem<strong>en</strong>ts stochastiques primaires. L’<strong>en</strong>jeu principal est de proposer une nouvel<strong>le</strong> définition de la<br />

dose d’irradiation qui r<strong>en</strong>de mieux compte de l'hétérogénéité des événem<strong>en</strong>ts physiques qui<br />

survi<strong>en</strong>n<strong>en</strong>t quelques 10 -6 s après l'irradiation à l'échel<strong>le</strong> du noyau cellulaire et/ou de la cellu<strong>le</strong> afin<br />

de mieux prédire <strong>le</strong>s effets biochimiques et biologiques correspondants.<br />

Il s’agit éga<strong>le</strong>m<strong>en</strong>t de corré<strong>le</strong>r <strong>le</strong>s observab<strong>le</strong>s caractérisant <strong>le</strong>s événem<strong>en</strong>ts biologiques précoces<br />

aux événem<strong>en</strong>ts physiques. L’originalité de l’approche réside dans l’utilisation des techniques <strong>le</strong>s<br />

plus réc<strong>en</strong>tes d’id<strong>en</strong>tification des cassures doub<strong>le</strong>-brin de l’ADN. Les actions à m<strong>en</strong>er sont de:<br />

définir un modè<strong>le</strong> biologique « simp<strong>le</strong> » et des observab<strong>le</strong>s significatives à l’échel<strong>le</strong><br />

subcellulaire qui soi<strong>en</strong>t adaptées à la modélisation de la topologie des évènem<strong>en</strong>ts<br />

biologiques radioinduits,<br />

choisir et développer des outils de modélisation de la topologie des dépôts d’énergie<br />

(traces) qui permett<strong>en</strong>t de prédire ces observab<strong>le</strong>s <strong>en</strong> fonction des conditions<br />

expérim<strong>en</strong>ta<strong>le</strong>s d’irradiation.<br />

La méthode choisie pour l'étude des cassures doub<strong>le</strong>s brins est l'observation des foci H2AX <strong>en</strong><br />

<strong>microscopie</strong> <strong>par</strong> immunofluoresc<strong>en</strong>ce. L’immunofluoresc<strong>en</strong>ce <strong>avec</strong> des anticorps spécifiques contre<br />

<strong>le</strong>s formes phosphorylées de l’histone H2AX ( -H2AX) permet <strong>en</strong> effet de mettre <strong>en</strong> évid<strong>en</strong>ce <strong>le</strong>s<br />

cassures doub<strong>le</strong>-brin (DSB) sous forme de spots fluoresc<strong>en</strong>ts appelés foci<br />

Suivant la nature et l’énergie des <strong>par</strong>ticu<strong>le</strong>s, <strong>le</strong> nombre, la tail<strong>le</strong>, l’int<strong>en</strong>sité lumineuse et la ré<strong>par</strong>tition<br />

spatia<strong>le</strong> des foci H2AX est susceptib<strong>le</strong> de changer. En effet, des observations très réc<strong>en</strong>tes (N Foray et<br />

al.) ont montré que la décond<strong>en</strong>sation de la chromatine, notamm<strong>en</strong>t due à des cassures simp<strong>le</strong>-brin de<br />

l'ADN (SSB) pouvait disperser <strong>le</strong> signal lumineux du focus initial et aboutir à la formation quasi-homogène<br />

de foci de plus petite tail<strong>le</strong>.<br />

De plus, <strong>en</strong> plus du dénombrem<strong>en</strong>t automatique des foci et de <strong>le</strong>ur tail<strong>le</strong>, des tests peuv<strong>en</strong>t être<br />

effectués, à dose macroscopique éga<strong>le</strong>, <strong>avec</strong> des ag<strong>en</strong>ts chimiques cond<strong>en</strong>seurs/ou décond<strong>en</strong>seurs de<br />

l'ADN comme <strong>le</strong> DMSO, <strong>le</strong> butyrate de sodium ou certains ag<strong>en</strong>ts intercalants.<br />

Enfin, des données préliminaires obt<strong>en</strong>ues <strong>avec</strong> des irradiations cellulaires <strong>par</strong> des neutrons indiqu<strong>en</strong>t<br />

que <strong>le</strong> nombre, l'int<strong>en</strong>sité lumineuse, la tail<strong>le</strong> et la dispersion des foci vari<strong>en</strong>t drastiquem<strong>en</strong>t <strong>avec</strong><br />

l'énergie incid<strong>en</strong>te des neutrons<br />

Des techniques d’analyse d’image permett<strong>en</strong>t de quantifier <strong>le</strong> nombre, la tail<strong>le</strong> et l’int<strong>en</strong>sité de chaque<br />

foci. Il est alors possib<strong>le</strong> de corré<strong>le</strong>r ces trois premières observab<strong>le</strong>s (nombre, tail<strong>le</strong> et int<strong>en</strong>sité des foci)<br />

aux événem<strong>en</strong>ts physiques produits dans des conditions d’irradiation variées, à <strong>par</strong>tir d’un grand nombre<br />

d’images pour chaque configuration différ<strong>en</strong>te d’irradiation. Une tel<strong>le</strong> acquisition de données est<br />

aujourd’hui r<strong>en</strong>due possib<strong>le</strong> <strong>par</strong> l’automatisation de la col<strong>le</strong>cte des images microscopiques sur des<br />

plateformes automatisées.<br />

L’analyse de la ré<strong>par</strong>tition spatia<strong>le</strong> des foci et des alignem<strong>en</strong>ts possib<strong>le</strong>s des événem<strong>en</strong>ts biologiques<br />

dans <strong>le</strong> noyau cellulaire irradié est plus comp<strong>le</strong>xe et nécessite un développem<strong>en</strong>t méthodologique plus<br />

important.<br />

A <strong>par</strong>tir des données topologiques des dépôts d’énergie primaires obt<strong>en</strong>ues <strong>par</strong> simulation, il est possib<strong>le</strong><br />

d’agréger (clusterisation ou voxelisation) ces dépôts afin de pouvoir <strong>le</strong>s corré<strong>le</strong>r aux dommages de l’ADN<br />

matérialisés <strong>par</strong> <strong>le</strong>s foci H2AX.<br />

Page 2


in2p3-00530281, version 1 - 28 Oct 2010<br />

Pour ce faire, différ<strong>en</strong>tes tail<strong>le</strong>s d’agrégats correspondant aux dim<strong>en</strong>sions des cassures de l’ADN (10-100<br />

nm) peuv<strong>en</strong>t être exploré. Des corrélations seront recherchées <strong>en</strong>tre tail<strong>le</strong>s d'agrégats, int<strong>en</strong>sité<br />

lumineuse et tail<strong>le</strong> des foci <strong>d'un</strong>e <strong>par</strong>t, et nombre des évènem<strong>en</strong>ts physiques et des foci d'autre <strong>par</strong>t.<br />

La s<strong>en</strong>sibilité de la méthode pourra être améliorée dans un second temps, <strong>en</strong> pr<strong>en</strong>ant <strong>en</strong> compte la<br />

topologie de la distribution des agrégats dans <strong>le</strong>s évènem<strong>en</strong>ts simulés.<br />

Mise <strong>en</strong> évid<strong>en</strong>ce des dommages ADN <strong>par</strong> marqueurs<br />

moléculaires<br />

La molécu<strong>le</strong> d’ADN se trouve sous différ<strong>en</strong>tes formes de cond<strong>en</strong>sation au cours du cyc<strong>le</strong> cellulaire.<br />

L’unité de base de la chromatine, appelée nucléosome, regroupe 146 paires de bases d'ADN<br />

<strong>en</strong>roulées autour d’un groupem<strong>en</strong>t de petites protéines basiques. Il s’agit d’un octamère de<br />

protéines appelées histones. Cette structure est constituée de divers types de protéines histones. À<br />

ce jour, cinq histones sont décrites:<br />

<strong>le</strong>s histones H2A, H2B, H3 et H4 form<strong>en</strong>t un octamère globulaire (de structure<br />

2x(H2A,H2B,H3,H4)) qui permet l'<strong>en</strong>rou<strong>le</strong>m<strong>en</strong>t de 146 paires de bases d'ADN <strong>en</strong> un tour trois<br />

quart afin de former un nucléosome ou "collier de per<strong>le</strong>s" : 1er degré de cond<strong>en</strong>sation de<br />

l'ADN (11 nm)<br />

l'histone H1 permet quant à el<strong>le</strong> la compaction des nucléosomes et rigidifie la structure<br />

hélicoïda<strong>le</strong> ainsi obt<strong>en</strong>ue (obt<strong>en</strong>tion <strong>d'un</strong> solénoïde : 2ème degré de cond<strong>en</strong>sation de l'ADN -<br />

30 nm -).<br />

Puisque <strong>le</strong>s processus tels que la ré<strong>par</strong>ation et la transcription de l'ADN doiv<strong>en</strong>t accéder à l'ADN, <strong>le</strong><br />

nucléosome est une structure dynamique qui est régulée <strong>par</strong> de nombreuses modifications<br />

cova<strong>le</strong>ntes affectant principa<strong>le</strong>m<strong>en</strong>t <strong>le</strong>ur extrémité N et C-termina<strong>le</strong> (acétylation, méthylation,<br />

phosphorylation,…..)<br />

Figure (1) : Vue de nucléosomes et de l’<strong>en</strong>rou<strong>le</strong>m<strong>en</strong>t de l’ADN autour de cel<strong>le</strong>-ci<br />

Figure (2) : Organisation structurel<strong>le</strong> des histones de l’octamère<br />

globulaire : chacune des protéines histones subiss<strong>en</strong>t <strong>en</strong> perman<strong>en</strong>ce<br />

des modifications cova<strong>le</strong>ntes affectant principa<strong>le</strong>m<strong>en</strong>t <strong>le</strong>ur extrémité Ntermina<strong>le</strong><br />

(acétylation, méthylation, polyribosylation, ubiquitinylisation,<br />

phopshorylation).<br />

Page 3


in2p3-00530281, version 1 - 28 Oct 2010<br />

L’histone H2AX, une isoforme de l’histone H2A, représ<strong>en</strong>te 2 à 25 % du taux d’expression relatif de<br />

la protéine H2A, <strong>en</strong> fonction du type cellulaire ou tissulaire étudié et est distribuée de façon<br />

homogène sur la chromatine. El<strong>le</strong> possède une extrémité C-termina<strong>le</strong> plus longue, <strong>avec</strong> un motif<br />

SQE <strong>par</strong>ticulier, phosphorylab<strong>le</strong> <strong>par</strong> l’intermédiaire d’une sérine associée au motif SQE <strong>par</strong> <strong>le</strong>s<br />

kinases de la famil<strong>le</strong> PIKK: ATM (Ataxia telangiectasia mutated), ATR et DNA-PKcs.<br />

D’un point de vue fonctionnel, H2AX semb<strong>le</strong> être principa<strong>le</strong>m<strong>en</strong>t associé au mainti<strong>en</strong> de l’intégrité<br />

du génome, au moy<strong>en</strong> de sa <strong>par</strong>ticipation à la ré<strong>par</strong>ation <strong>le</strong>s bris doub<strong>le</strong>-brin à l’ADN, introduits de<br />

façon exogène <strong>par</strong> un dommage <strong>en</strong>vironnem<strong>en</strong>tal (radiation ionisante, produits chimiques).<br />

Immédiatem<strong>en</strong>t après l’ap<strong>par</strong>ition d’une cassure doub<strong>le</strong> brin de l’ADN, la doub<strong>le</strong> hélice d’ADN se<br />

décond<strong>en</strong>se sur une région de 2 MB <strong>en</strong>cadrant la cassure La protéine histone H2AX devi<strong>en</strong>t alors<br />

accessib<strong>le</strong> et la sérine 139 de cette protéine est phosphorylée de manière dose dép<strong>en</strong>dante <strong>par</strong> <strong>le</strong>s<br />

kinases de la famil<strong>le</strong> des PI3K reconnaissant spécifiquem<strong>en</strong>t un motif SQE.<br />

Chez <strong>le</strong>s mammifères, cette famil<strong>le</strong> compte plusieurs protéines impliquées dans la ré<strong>par</strong>ation des<br />

cassures doub<strong>le</strong> brin, dont ATM (Ataxia Telangiectasia Mutated), ATR (AT-Related) et DNA-PK<br />

(protéine kinase dép<strong>en</strong>dante de l’ADN). Pour chaque cassure doub<strong>le</strong> brin de l’ADN, 2000 molécu<strong>le</strong>s<br />

d’histone H2AX sont phosphorylées<br />

Cette phosphosrylation peut être mise <strong>en</strong> évid<strong>en</strong>ce à l’aide d’anticorps spécifiques, faisant<br />

ap<strong>par</strong>aître la cassure doub<strong>le</strong>-brin sous forme de spots fluoresc<strong>en</strong>ts appelés foci -H2AX comme <strong>le</strong><br />

montre la figure (3). On suppose qu’il existe une corrélation un-pour-un a été obt<strong>en</strong>ue <strong>en</strong>tre <strong>le</strong><br />

nombre de cassures doub<strong>le</strong>-brin et <strong>le</strong> nombre de foci. Mais d’aucuns considèr<strong>en</strong>t que la relation -<br />

H2AX/DSB n’est plus fondée si l’on ti<strong>en</strong>t compte du phénomène de cond<strong>en</strong>sation de la chromatine.<br />

D’autres marqueurs moléculaires précoces comme pDNA-PK, MRE11, pATM, ATR peuv<strong>en</strong>t être<br />

év<strong>en</strong>tuel<strong>le</strong>m<strong>en</strong>t utilisés pour compléter l’analyse des dommages radioinduits de l’ADN (Joubert et<br />

al., 2008).<br />

Figure (3) : Visualisation des dommages induits <strong>par</strong><br />

radiation ionisante <strong>par</strong> l’analyse des foci -H2AX.<br />

Description du Protoco<strong>le</strong> des expéri<strong>en</strong>ces<br />

La lignée cellulaire choisie dans <strong>le</strong> projet ROSIRIS pour <strong>le</strong>s irradiations est une lignée des<br />

fibroblastes humains non-transformés prov<strong>en</strong>ant d’un témoin radiorésistant (lignée 1BR3),<br />

prov<strong>en</strong>ant d’un témoin radio-résistant. Cette lignée a été choisie pour son adhér<strong>en</strong>ce, son<br />

homogénéité, sa stabilité génomique, la facilité d’obt<strong>en</strong>ir une population cellulaire <strong>en</strong> phase de<br />

plateau (99% de cellu<strong>le</strong>s <strong>en</strong> G0/G1), ainsi que pour l'<strong>en</strong>semb<strong>le</strong> de données existantes sur ces cellu<strong>le</strong>s<br />

irradiées aux rayons X et la large gamme disponib<strong>le</strong> de fibroblastes humains issus de pathologies<br />

Page 4


in2p3-00530281, version 1 - 28 Oct 2010<br />

différ<strong>en</strong>tes. Ces cellu<strong>le</strong>s, bi<strong>en</strong> caractérisées radiobiologiquem<strong>en</strong>t, ont un ADN homogène, bi<strong>en</strong><br />

modélisab<strong>le</strong>.<br />

Afin de faire varier <strong>le</strong>s conditions du dépôt d’énergie lors des irradiations, il est nécessaire d’utiliser<br />

des rayonnem<strong>en</strong>ts de TEL différ<strong>en</strong>t. Dans un premier temps, deux types de rayonnem<strong>en</strong>t sont<br />

utilisés :<br />

un rayonnem<strong>en</strong>t de bas TEL (rayons X ),<br />

un rayonnem<strong>en</strong>t de haut TEL (faisceaux monoénergétiques de neutrons de 2 keV à 19 MeV).<br />

Le mode d’irradiation est éga<strong>le</strong>m<strong>en</strong>t important :<br />

<strong>en</strong> mode macro-faisceau, <strong>le</strong> nombre de <strong>par</strong>ticu<strong>le</strong>s incid<strong>en</strong>tes est inconnue ; de même que<br />

<strong>le</strong>s points d’impact et donc l’id<strong>en</strong>tification claire des cellu<strong>le</strong>s touchées. Le contrô<strong>le</strong> de la<br />

dose est diffici<strong>le</strong>. Le dépôt d’énergie dans <strong>le</strong> milieu n'est pas homogène.<br />

En mode microfaisceau, <strong>le</strong> nombre de <strong>par</strong>ticu<strong>le</strong>s délivrées est contrôlé <strong>avec</strong> précision. Il est<br />

possib<strong>le</strong> d’étudier <strong>le</strong>s effets induits <strong>par</strong> de très faib<strong>le</strong>s doses y compris <strong>par</strong> une seu<strong>le</strong><br />

<strong>par</strong>ticu<strong>le</strong>. Un microfaisceau permet d’irradier sé<strong>le</strong>ctivem<strong>en</strong>t une zone précise au niveau de<br />

la cellu<strong>le</strong> individuel<strong>le</strong> <strong>avec</strong> un nombre contrôlé de <strong>par</strong>ticu<strong>le</strong> incid<strong>en</strong>te.<br />

Les cellu<strong>le</strong>s sont irradiées et <strong>le</strong>s dommages de l’ADN sont analysées juste après l’irradiation, au<br />

mom<strong>en</strong>t où tous <strong>le</strong>s dommages sont reconnus et bi<strong>en</strong> avant que <strong>le</strong>s phénomènes de ré<strong>par</strong>ation ne<br />

fass<strong>en</strong>t varier <strong>le</strong>ur nombre.<br />

Expéri<strong>en</strong>ce d’irradiation à l’ESRF<br />

Les données de base consist<strong>en</strong>t <strong>en</strong> plusieurs séries d’images de cellu<strong>le</strong>s de fibroblaste (1BR3)<br />

irradiées à 2 Gy <strong>en</strong> X <strong>avec</strong> 4 heures de ré<strong>par</strong>ation, acquises lors d’une manipulation, <strong>le</strong> 6 février<br />

2009 à l’ERSF<br />

Les cellu<strong>le</strong>s sont disposées sur des lamel<strong>le</strong>s (1,5x1,5 cm). Après irradiation, <strong>le</strong> protoco<strong>le</strong> de<br />

traitem<strong>en</strong>t des cellu<strong>le</strong>s irradiées a été <strong>le</strong> suivant :<br />

Rinçage au PBS (tampon phosphate salin)<br />

Fixation au <strong>par</strong>aformaldéhyde<br />

Lyse (déterg<strong>en</strong>t) pour r<strong>en</strong>dre la membrane poreuse (1 à 5 minutes)<br />

Application anticorps primaire (40 minutes à 37°)<br />

Application anticorps secondaire (20 minutes)<br />

Dépôt d’une goutte de VectaShield, incluant la solution DAPI sur la lame de verre de support<br />

Application de la lamel<strong>le</strong> <strong>avec</strong> collage <strong>par</strong> <strong>le</strong> VectaShield<br />

Dépôt de vernis sur <strong>le</strong>s cotés de la lamel<strong>le</strong> pour r<strong>en</strong>dre hermétique la couche <strong>en</strong>tre la lame<br />

et la lamel<strong>le</strong><br />

La durée tota<strong>le</strong> du processus de traitem<strong>en</strong>t est de deux heures <strong>en</strong>viron.<br />

L‘acquisition des d’images est effectuée <strong>avec</strong> un microscope BX51 de marque Olympus équipé de<br />

plusieurs objectifs dont <strong>le</strong>s plus couramm<strong>en</strong>t utilisés sont <strong>le</strong> 10X et <strong>le</strong> 100X, <strong>le</strong>s autres sont : 2X, 40X<br />

et 60X. Une brève description de cet ap<strong>par</strong>eil, ainsi que ses principes de fonctionnem<strong>en</strong>t, sont<br />

donnés dans l’annexe A. Dans <strong>le</strong> cas de l’utilisation <strong>en</strong> 100X une goutte d’hui<strong>le</strong> assure la liaison<br />

<strong>en</strong>tre l’objectif et la lame. Le microscope est équipé d’une caméra numérique CCD Olympus DP70<br />

dont la description et <strong>le</strong>s principes de fonctionnem<strong>en</strong>t sont décrits dans l’annexe B.<br />

La prés<strong>en</strong>ce de foci -H2AX dans <strong>le</strong> plan de focalisation du microscope ap<strong>par</strong>ait clairem<strong>en</strong>t sur<br />

l’image comme <strong>le</strong> montre la figure (4). Bi<strong>en</strong> que la <strong>microscopie</strong> à foca<strong>le</strong> fixe ne restitue pas la 3D<br />

comme la <strong>microscopie</strong> confoca<strong>le</strong>, <strong>le</strong>s cellu<strong>le</strong>s fibroblastes, du fait de <strong>le</strong>ur forme aplaties (type<br />

« œuf au plat ») restitu<strong>en</strong>t bi<strong>en</strong> <strong>le</strong>s focis sur <strong>le</strong> plan de focalisation du microscope.<br />

Sur une lamel<strong>le</strong> il y a <strong>en</strong>viron 10 5 cellu<strong>le</strong>s et quelques c<strong>en</strong>taines sont visib<strong>le</strong>s dans <strong>le</strong> champ du<br />

microscope <strong>avec</strong> un objectif 10X. 75% des cellu<strong>le</strong>s sont <strong>en</strong> phases G1. Lors de l’exam<strong>en</strong> des champs<br />

<strong>le</strong>s cellu<strong>le</strong>s sont « triées » selon <strong>le</strong>ur phase dans <strong>le</strong> cyc<strong>le</strong> cellulaire<br />

Globa<strong>le</strong>m<strong>en</strong>t <strong>le</strong> nombre de focis visib<strong>le</strong>s décroit <strong>avec</strong> <strong>le</strong> temps de ré<strong>par</strong>ation laissé aux cellu<strong>le</strong>s, <strong>par</strong><br />

contre <strong>le</strong>ur int<strong>en</strong>sité augm<strong>en</strong>te. Très schématiquem<strong>en</strong>t, pour des irradiations <strong>en</strong> X , pour 10<br />

minutes on a beaucoup de petit focis, pour 24 heures on a quelques gros focis très lumineux<br />

Les lames peuv<strong>en</strong>t être éga<strong>le</strong>m<strong>en</strong>t examinées <strong>en</strong> changeant la longueur d’onde d’excitation (voir<br />

Annexe B). Ceci permet de visualiser l'ADN sous sa forme cond<strong>en</strong>sée (chromatine) <strong>par</strong><br />

l’intermédiaire de la fluoresc<strong>en</strong>ce de la molécu<strong>le</strong> DAPI (cou<strong>le</strong>ur b<strong>le</strong>ue) dans <strong>le</strong> noyau comme <strong>le</strong><br />

montre la figure (5).<br />

Page 5


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (4) : cellu<strong>le</strong>s fibroblastes irradiées montrant la prés<strong>en</strong>ce de cassures<br />

doub<strong>le</strong>-brin sous forme de foci -H2AX<br />

Figure (5) : fluoresc<strong>en</strong>ce b<strong>le</strong>ue au niveau de la chromatine dans <strong>le</strong>s noyaux<br />

marqués au DAPI<br />

Plusieurs résolutions sont disponib<strong>le</strong>s. Les résolutions utilisées durant l’acquisition ont été faites <strong>en</strong> :<br />

- Résolution standard 1360x1024 pixels<br />

- Haute résolution 4080x3072 pixels<br />

Avec un grossissem<strong>en</strong>t 10X, on peut observer plusieurs c<strong>en</strong>taines de noyaux. En grossissem<strong>en</strong>t 100X, on<br />

peut avoir 3 ou 4 noyaux <strong>en</strong> moy<strong>en</strong>ne <strong>par</strong> champ<br />

A la longue, l’illumination des cellu<strong>le</strong>s <strong>en</strong>g<strong>en</strong>dre un phénomène de « fading », c’est à dire une perte de<br />

fluoresc<strong>en</strong>ce ; il faut alors augm<strong>en</strong>ter <strong>le</strong> temps de pose pour avoir une int<strong>en</strong>sité équiva<strong>le</strong>nte dans<br />

l’image.<br />

L’analyse des lames irradiées a permis de constituer un <strong>lot</strong> de 123 images différ<strong>en</strong>tes dont la notation<br />

originel<strong>le</strong> est « image_x » <strong>avec</strong> x=1 à 123. Une pré-analyse de ce <strong>lot</strong> d’image a permis d’éliminer <strong>le</strong>s<br />

images « ratées » à la suite d’une mauvaise manipulation ou configuration. Après ce premier tri <strong>le</strong>s<br />

images ont été classées <strong>en</strong> 5 catégories et r<strong>en</strong>umérotées<br />

Images Dapi<br />

Ces images ont été acquises <strong>avec</strong> un grossissem<strong>en</strong>t 10X et un temps de pose de vue de 100 ms. Les deux<br />

modes de résolutions ont été utilisées:<br />

Haute résolution (4080x3072 pixels) pour <strong>le</strong>s images « fibro_dapi_10x_HR_1 à 5 »<br />

Résolution standard (1360x1024 pixels) pour <strong>le</strong>s images « fibro_dapi_10x_RS_1 à 5 »<br />

Images 100X<br />

Ces images ont été acquises <strong>avec</strong> un grossissem<strong>en</strong>t 100X . Pour chaque champ sé<strong>le</strong>ctionné, deux images<br />

différ<strong>en</strong>tes ont été acquise :<br />

une <strong>en</strong> mode Dapi <strong>avec</strong> un temps de pose de 50 ms ;<br />

une <strong>en</strong> mode H2AX <strong>avec</strong> un temps de pose de 1 s.<br />

Les images sont <strong>en</strong> haute résolution (4080x3072 pixels). La numérotation des images permet d’associer<br />

<strong>le</strong>s images <strong>par</strong> paires et donc d’avoir <strong>le</strong>s deux modes <strong>par</strong> champ acquis<br />

Page 6


in2p3-00530281, version 1 - 28 Oct 2010<br />

Dapi pour <strong>le</strong>s images « fibro_dapi_100x_HR_1 à 31 »<br />

H2AX pour <strong>le</strong>s images « fibro_h2ax_100x_HR_1 à 31 »<br />

Images de calibration «Dark »<br />

Le microscope permet d’<strong>en</strong>registrer des images obt<strong>en</strong>ues uniquem<strong>en</strong>t <strong>par</strong> <strong>le</strong> CCD. Ces images<br />

<strong>en</strong>registr<strong>en</strong>t <strong>le</strong> courant d’obscurité de la CCD (images « black »), <strong>avec</strong> deux temps de pause différ<strong>en</strong>ts : 1<br />

s et 23 ms<br />

temps de pause de 1 s pour <strong>le</strong>s images « fibro_black_HR_1s_1 à 11 »<br />

temps de pause de 23 ms pour <strong>le</strong>s images « fibro_black_HR_23ms_1 à 11 »<br />

Images de calibration « Offset »<br />

On peut éga<strong>le</strong>m<strong>en</strong>t <strong>en</strong>registrer des images <strong>avec</strong> un « shutter » interrompant <strong>le</strong> chemin de la lumière<br />

avant l’arrivée dans <strong>le</strong> CCD. Ces images ont été acquise <strong>avec</strong> un temps de pause 1s, id<strong>en</strong>tique au temps<br />

de pose <strong>avec</strong> cellu<strong>le</strong> (images « shutter » )<br />

Images « fibro_shutter_HR_1 à 11 »<br />

Images de calibration « PLU »<br />

Afin de tester l’uniformité de la réponse du CCD, des images de lame vierge ont été acquises <strong>avec</strong><br />

différ<strong>en</strong>ts filtres (images de Plage de Luminosité Uniforme) <strong>en</strong> grossissem<strong>en</strong>t 100X et haute résolution:<br />

4080x3072 pixels<br />

mode Dapi sur 10 s pour <strong>le</strong>s images « fibro_PLU_DAPI_10s_1 à 3 »<br />

mode H2AX sur 10 s pour <strong>le</strong>s images « fibro_PLU_h2ax_10s_1 »<br />

mode H2AX sur 60 s pour <strong>le</strong>s images « fibro_PLU_h2ax_60s_1 à 2 »<br />

Les mesures effectuées, visant à corriger <strong>le</strong>s défauts inhér<strong>en</strong>ts au système d’imagerie (« Black », « PLU »,<br />

« shutter »), pourront servir à donner une première connaissance des bruits à pr<strong>en</strong>dre <strong>en</strong> compte pour<br />

obt<strong>en</strong>ir <strong>le</strong>s « meil<strong>le</strong>ures » images que possib<strong>le</strong>. L’origine de ces bruits est prés<strong>en</strong>tée dans l’annexe C.<br />

Pour la suite de cette étude nous avons sé<strong>le</strong>ctionné <strong>le</strong>s images acquises <strong>avec</strong> un grossissem<strong>en</strong>t 100X .Pour<br />

chaque champ sé<strong>le</strong>ctionné, deux images différ<strong>en</strong>tes sont disponib<strong>le</strong>s:<br />

<strong>en</strong> mode Dapi pour <strong>le</strong>s images fibro_dapi_100x_HR_1 à 30<br />

<strong>en</strong> mode H2AX pour <strong>le</strong>s images fibro_h2ax_100x_HR_1 à 30<br />

Description du <strong>logiciel</strong> ImageJ<br />

Deux notions d’échantillonnage intervi<strong>en</strong>n<strong>en</strong>t pour produire une image numérique :<br />

échantillonnage <strong>en</strong> coordonnées spatia<strong>le</strong>s,<br />

échantillonnage <strong>en</strong> int<strong>en</strong>sité.<br />

Une image est constituée <strong>d'un</strong> <strong>en</strong>semb<strong>le</strong> de pixels. Le pixel représ<strong>en</strong>te ainsi <strong>le</strong> plus petit élém<strong>en</strong>t<br />

constitutif <strong>d'un</strong>e image numérique. Le nombre de pixels dans <strong>le</strong>s deux dim<strong>en</strong>sions détermine la définition<br />

de l’image. Nos images ont une définition de 4080x3072 pixels <strong>en</strong> haute résolution.<br />

Les images sont au format TIFF (Tagged Image Fi<strong>le</strong> Format). Ce format permet de garder <strong>le</strong> maximum<br />

d'informations au contraire du format JPEG. Tous <strong>le</strong>s fichiers TIFF peuv<strong>en</strong>t être lus sur PC, Mac et Unix.<br />

L'<strong>en</strong>tête conti<strong>en</strong>t d'autres informations, nommées étiquettes (tags), permettant l'insertion de<br />

docum<strong>en</strong>tation supplém<strong>en</strong>taire standard. Par contre <strong>le</strong> format JPEG fonctionne <strong>par</strong> décomposition des<br />

images <strong>en</strong> <strong>par</strong>ties de 8x8 pixels. Il supprime des détails dans chaque <strong>par</strong>tie (niveaux de compression de<br />

1% à 99%).<br />

Une image cou<strong>le</strong>ur est décomposée <strong>en</strong> 3 composantes, R(Red), G(Gre<strong>en</strong>) et B(Blue). Pour chaque pixel, <strong>le</strong><br />

codage de la cou<strong>le</strong>ur est représ<strong>en</strong>té <strong>par</strong> trois va<strong>le</strong>urs, chacune codée sur un octet (de 0 à 255). Ceci<br />

correspond à 256 ^3 combinaisons, c'est-à-dire au total 24 bits soit plus de 16 millions de cou<strong>le</strong>urs. Par<br />

conséqu<strong>en</strong>t la tail<strong>le</strong> d’une image est de 3x4080x3072 octets, soit 36 Megaoctets<br />

Une image cou<strong>le</strong>ur peut être cond<strong>en</strong>sée <strong>en</strong> faisant une somme pondérée des trois composantes, R(Red),<br />

G(Gre<strong>en</strong>) et B(Blue). Pour chaque pixel, l’int<strong>en</strong>sité est égal à la somme des trois va<strong>le</strong>urs, pondérées<br />

chacune d’un certain poids. Par exemp<strong>le</strong>, on peut attribuer un poids égal à chacune des composantes<br />

cou<strong>le</strong>urs, <strong>le</strong> résultat étant un niveau de gris sur un octet (de 0 à 255). Cette opération est utilisab<strong>le</strong> à des<br />

fins de prés<strong>en</strong>tation mais pas forcém<strong>en</strong>t uti<strong>le</strong> pour l’analyse des images<br />

ImageJ est un des meil<strong>le</strong>urs <strong>logiciel</strong>s Op<strong>en</strong> Source pour <strong>le</strong> traitem<strong>en</strong>t d’image <strong>en</strong> biologie et <strong>en</strong> médecine<br />

pour <strong>le</strong> traitem<strong>en</strong>t et l'analyse <strong>d'images</strong>. Il peut :<br />

afficher, éditer, traiter et analyser la plu<strong>par</strong>t des formats de fichier existants<br />

proposer un grand nombre d’algorithmes pour l’analyse de l’image.<br />

Page 7


in2p3-00530281, version 1 - 28 Oct 2010<br />

A ce jour, ImageJ est un des <strong>logiciel</strong>s <strong>le</strong>s plus utilisés pour <strong>le</strong> traitem<strong>en</strong>t d’images acquise <strong>par</strong><br />

<strong>microscopie</strong>. Le programme s’exécute soit sur une machine virtuel<strong>le</strong> Java ou sur un JRE (Java Runtime<br />

Environm<strong>en</strong>t). De fait, <strong>le</strong> langage Java r<strong>en</strong>d ImageJ multiplateforme (Windows, Mac, Linux, Unix, …).<br />

Le principe de base d’ImageJ est d'être conçu pour être ext<strong>en</strong>sib<strong>le</strong> sous forme de modu<strong>le</strong>s d’ext<strong>en</strong>sions.<br />

ImageJ dispose de fonctions pour <strong>le</strong> chargem<strong>en</strong>t de modu<strong>le</strong>s Java : <strong>le</strong>s « plugins ».<br />

Les formats d’images supportés <strong>en</strong> natif sont classiques, mais la librairie « OME plugins for ImageJ »<br />

proposé <strong>par</strong> <strong>le</strong> projet www.op<strong>en</strong>microscopy.org ajout<strong>en</strong>t une col<strong>le</strong>ction de plugin pour manipu<strong>le</strong>r <strong>le</strong>s<br />

formats de fichiers <strong>le</strong>s plus populaires <strong>en</strong> <strong>microscopie</strong>.<br />

En <strong>par</strong>allè<strong>le</strong> à la version standard d’ImageJ, l’utilisation d’une version adaptée à biologie permet de<br />

bénéficier des très nombreux et puissants plugins dédiés à la <strong>microscopie</strong>, associés à un manuel <strong>en</strong> ligne<br />

très bi<strong>en</strong> docum<strong>en</strong>té.<br />

ImageJ bénéficie d’une grande communauté de développeurs qui contribue à ét<strong>en</strong>dre <strong>le</strong>s fonctionnalités<br />

du noyau. L’utilisateur dispose maint<strong>en</strong>ant d’une bibliothèque de plus de 300 fonctions disponib<strong>le</strong>s<br />

gratuitem<strong>en</strong>t. De nombreuses opérations de traitem<strong>en</strong>t <strong>d'images</strong> sont réalisab<strong>le</strong>s <strong>avec</strong> ImageJ. Parmi<br />

<strong>le</strong>squel<strong>le</strong>s :<br />

visualisation, analyse, et traitem<strong>en</strong>t d’images 8/16/32 bits<br />

formats d’image utilisab<strong>le</strong>s : TIFF, GIF, JPEG, BMP, DICOM, …<br />

calculs d’aires, affichage de l’échel<strong>le</strong>, mesures de distances et d’ang<strong>le</strong>s,<br />

modification de contraste, smoothing, détection des contours, filtre médian,<br />

ajustem<strong>en</strong>t de l'histogramme des niveaux de gris, débruitage, correction d'éclairage,<br />

opérations logiques et arithmétiques <strong>en</strong>tre images, traitem<strong>en</strong>ts morphologies : érosion/dilatation,<br />

ligne de <strong>par</strong>tage des eaux, sque<strong>le</strong>ttisation.<br />

L’utilisateur peut reproduire des séqu<strong>en</strong>ces de commandes <strong>en</strong> <strong>en</strong>registrant une macro-commande.<br />

Plus de r<strong>en</strong>seignem<strong>en</strong>ts concernant ImageJ sont disponib<strong>le</strong>s sur:<br />

La page d’accueil du site officiel sur ImageJ: http://rsbweb.nih.gov/ij/<br />

Le portail pour la docum<strong>en</strong>tation sur ImageJ: http://<strong>imagej</strong>docu.tudor.lu<br />

Principe du prétraitem<strong>en</strong>t des images <strong>avec</strong> ImageJ<br />

Les images issues de l’imagerie de fluoresc<strong>en</strong>ce, acquise <strong>par</strong> <strong>le</strong> détecteur (CCD) prés<strong>en</strong>t<strong>en</strong>t un certain<br />

nombre de defaults qui peuv<strong>en</strong>t affecter la qualité de ces images et <strong>par</strong> conséqu<strong>en</strong>t <strong>le</strong>s performances de<br />

l’analyse. Cette section a pour but d’introduire <strong>le</strong>s élém<strong>en</strong>ts permettant de mettre au point un protoco<strong>le</strong><br />

de prétraitem<strong>en</strong>t des images pour améliorer la qualité des images fina<strong>le</strong>s. Pour cela il faut se rappe<strong>le</strong>r<br />

que <strong>le</strong> capteur utilisé est un CCD et donc comme tout instrum<strong>en</strong>t possède des defaults intrinsèques<br />

(bruits intrinsèques). En fait <strong>le</strong> CCD n’est pas <strong>le</strong> seul élém<strong>en</strong>t susceptib<strong>le</strong> d’introduire des biais dans <strong>le</strong><br />

signal (bruits externes). L’annexe (C) fait un bilan exhaustif de ces différ<strong>en</strong>ts bruits.<br />

Dans <strong>le</strong> cas de l’analyse des images acquises à l’ESRF, nous ne considérerons uniquem<strong>en</strong>t que <strong>le</strong> bruit<br />

thermique du CCD. D’autre <strong>par</strong>t, nous supposerons que la pose est suffisamm<strong>en</strong>t longue pour que <strong>le</strong> bruit<br />

de <strong>le</strong>cture finisse <strong>par</strong> dev<strong>en</strong>ir négligeab<strong>le</strong> devant <strong>le</strong> bruit thermique.<br />

Le prétraitem<strong>en</strong>t, ou calibration, consiste à retrouver l’image origina<strong>le</strong> formée sur la matrice du capteur<br />

<strong>par</strong> <strong>le</strong> flux de photons incid<strong>en</strong>ts. Le prétraitem<strong>en</strong>t idéa<strong>le</strong> nécessiterait d’acquérir au début de chaque<br />

prise d’image, des acquisitions spécifiques, appelées : « offset », « dark », « flat-field »:<br />

Signal d’offset (« offset ») : On fait une pose la plus brève possib<strong>le</strong>, dans l'obscurité tota<strong>le</strong> (obturateur<br />

fermé).<br />

Signal thermique (« dark ») : On va acquérir une image <strong>avec</strong> un temps de pose du même ordre de<br />

grandeur que l'image, <strong>en</strong> bloquant toute <strong>en</strong>trée de lumière qui pourrait arriver sur <strong>le</strong> CCD (obturateur<br />

fermé) et <strong>en</strong> pr<strong>en</strong>ant <strong>le</strong> même temps d'exposition que cel<strong>le</strong> de l'image. L’image «dark» compr<strong>en</strong>d<br />

uniquem<strong>en</strong>t <strong>le</strong> signal de bruit de fond é<strong>le</strong>ctronique de l'ap<strong>par</strong>eil. Donc lorsque <strong>le</strong> temps de pose<br />

augm<strong>en</strong>te, <strong>le</strong>s charges thermiques devi<strong>en</strong>n<strong>en</strong>t très importantes.<br />

Signal de Plage de Luminosité Uniforme (« flat‐field ») : Une dernière catégorie de bruits provi<strong>en</strong>t de<br />

la variation de s<strong>en</strong>sibilité ([1]) des pixels du CCD et des défauts du système optique. Par exemp<strong>le</strong> <strong>le</strong>s<br />

[1] Les pixels des capteurs n'ont pas une s<strong>en</strong>sibilité homogène à la lumière. Un capteur observant une scène uniforme ne donnera pas<br />

forcem<strong>en</strong>t une image uniforme. L'effet peut être lié à des impuretés prés<strong>en</strong>t<strong>en</strong>t dans <strong>le</strong> silicium du CCD. La probabilité d’un pixel à créer un<br />

photoé<strong>le</strong>ctron varie fortem<strong>en</strong>t <strong>avec</strong> la longueur d'onde. Certains pixels sont souv<strong>en</strong>t aveug<strong>le</strong>s à la plu<strong>par</strong>t des photons <strong>en</strong> dehors de <strong>le</strong>ur<br />

plage norma<strong>le</strong>. Ils ne peuv<strong>en</strong>t donc détecter qu'une fraction des photons qui pourrait être détectée. Chaque pixel dans <strong>le</strong> détecteur a sa<br />

propre efficacité (bi<strong>en</strong> que <strong>le</strong>s variations de pixel à pixel soi<strong>en</strong>t extrêmem<strong>en</strong>t faib<strong>le</strong>s) et cette efficacité est propre à chaque longueur d'onde.<br />

Heureusem<strong>en</strong>t, ce comportem<strong>en</strong>t est stab<strong>le</strong> et peut être corrigé <strong>en</strong> divisant <strong>le</strong>s images brutes <strong>par</strong> des images de PLU cont<strong>en</strong>ant ces effets.<br />

Page 8


in2p3-00530281, version 1 - 28 Oct 2010<br />

poussières sur <strong>le</strong>s surfaces optiques peuv<strong>en</strong>t produire des ombres. De même <strong>le</strong>s variations de<br />

luminosité conduis<strong>en</strong>t à un vignettage (non-uniformité de l’int<strong>en</strong>sité de la lumière à l’intérieur du<br />

champ du microscope). L’image « flat-field » est utilisée pour iso<strong>le</strong>r et corriger des imperfections<br />

de la chaîne optique. On fait une pose longue sur une image de fluoresc<strong>en</strong>ce supposée uniforme <strong>en</strong><br />

luminosité, <strong>avec</strong> la même mise au point que <strong>le</strong>s images. Cette image de référ<strong>en</strong>ce doit être<br />

obt<strong>en</strong>ue à <strong>par</strong>tir d’une lame cont<strong>en</strong>ant un film de colorant fluoresc<strong>en</strong>t, réputé uniforme, à défaut<br />

un objet uniformém<strong>en</strong>t fluoresc<strong>en</strong>t. La même configuration de filtre pour l’acquisition des images<br />

doit être utilisée<br />

Si on appel<strong>le</strong> :<br />

SX,Y l’image brute <strong>en</strong> sortie du CCD,<br />

IX,Yl’image après prétraitem<strong>en</strong>t<br />

Dark X ,Y la<br />

matrice du signal thermique (« Dark »)<br />

PLU X ,Y la matrice <strong>en</strong> illumination uniforme (« PLU »)<br />

Offset X ,Y la matrice du signal d’offset (« Offset »)<br />

On peut écrire<br />

SX,YDarkX,YOffsetX,Y SX,YDarkX,Y IX,Y <br />

<br />

<br />

<br />

PLUX,YDarkX,YOffsetX,Y PLUX,YDarkX,Y On obti<strong>en</strong>t fina<strong>le</strong>m<strong>en</strong>t une image dite « calibrée » du bruit de fond <strong>par</strong>asite et des variations d'int<strong>en</strong>sité<br />

des pixels. Ces traitem<strong>en</strong>ts de base sont effectués via <strong>le</strong> traitem<strong>en</strong>t des opérations sur des images. Il faut<br />

rappe<strong>le</strong>r néanmoins que toute opération mathématique (soustraction, multiplication) introduit éga<strong>le</strong>m<strong>en</strong>t<br />

une dégradation du rapport signal sur bruit.<br />

Les figures suivantes montr<strong>en</strong>t la distribution de probabilité (exprimées <strong>en</strong> %) de la va<strong>le</strong>ur d’offset<br />

calculées à <strong>par</strong>tir<br />

des images de type « Black » (bruit thermique moy<strong>en</strong> sur 10 images acquises p<strong>en</strong>dant une<br />

seconde chacune) pour la figure (6)<br />

des images de type « shutter» (image moy<strong>en</strong>ne sur 10 images acquises p<strong>en</strong>dant une seconde<br />

chacune) pour la figure (7)<br />

Dans <strong>le</strong>s deux cas la somme des probabilités sur l’<strong>en</strong>semb<strong>le</strong> des va<strong>le</strong>urs d’offset (<strong>en</strong>tre 0 et 257) est éga<strong>le</strong><br />

à 100. Les résultats des deux p<strong>lot</strong>s montr<strong>en</strong>t clairem<strong>en</strong>t que <strong>le</strong>s images ne sont pas affectées d’un<br />

quelconque piédestal puisque à 99%, <strong>le</strong>s va<strong>le</strong>urs des pixels est égal à 0. Par conséqu<strong>en</strong>t dans la suite <strong>le</strong><br />

courant d’obscurité sera considéré comme négligeab<strong>le</strong>. Cep<strong>en</strong>dant l’évaluation de ces distributions est<br />

un préalab<strong>le</strong> à toute analyse.<br />

Figure (6) : Distribution des probabilités des va<strong>le</strong>urs d’offset d’après<br />

<strong>le</strong>s images de type « black » (bruit thermique 10 images acquises<br />

p<strong>en</strong>dant une seconde)<br />

Page 9


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (7) : Distribution des probabilités des va<strong>le</strong>urs d’offset<br />

d’après <strong>le</strong>s images de type « shutter» (10 images acquises p<strong>en</strong>dant<br />

une seconde)<br />

Les images de type « PLU » ; c'est-à-dire « fibro_PLU_h2ax_10s» ou « fibro_PLU_h2ax_60s» on été<br />

utilisées pour estimer la distribution des va<strong>le</strong>urs des pixels de ces images. En cas d’illumination uniforme,<br />

<strong>le</strong>s spectres des trois composantes devrai<strong>en</strong>t être une fonction delta. La figure (8) montre ces<br />

distributions pour une illumination de 10 secondes. L’illumination n’est pas suffisante pour que <strong>le</strong>s<br />

va<strong>le</strong>urs de chacune des composantes soi<strong>en</strong>t significatives. La figure (9) <strong>par</strong> contre montre <strong>le</strong>s<br />

distributions pour une illumination de 60 secondes. A <strong>par</strong>tir de ces distributions, <strong>le</strong>s va<strong>le</strong>urs moy<strong>en</strong>nes et<br />

<strong>le</strong>s largeurs tota<strong>le</strong>s à mi-hauteur des distributions sont résumées dans <strong>le</strong> tab<strong>le</strong>au (1).<br />

Figure (8) : Distribution des probabilités des va<strong>le</strong>urs des pixels dans <strong>le</strong>s trois<br />

composantes Red, Gre<strong>en</strong> et Blue, d’après une image de type «PLU» (10 secondes)<br />

Page 10


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (9) : Distribution des probabilités des va<strong>le</strong>urs des pixels dans <strong>le</strong>s trois<br />

composantes Red Gre<strong>en</strong> et Blue, d’après une image de type «PLU» (60 secondes)<br />

Red Blue Gre<strong>en</strong><br />

Va<strong>le</strong>ur moy<strong>en</strong>ne 12,3 64,2 157<br />

LTMH 5,05 16,5 4,44<br />

R 0,41 0,26 0,03<br />

Un plugin de prétraitem<strong>en</strong>t sous ImageJ a été mis au point pour améliorer <strong>le</strong> rapport signal sur bruit des<br />

images de focis <strong>en</strong> H2AX (« fibro_h2ax_100x_HR ») ou de DAPI (« fibro_DAPI_100x_HR »)à l’aide des<br />

images de type PLU ( « fibro_PLU_h2ax_60s_1 à 2 »).<br />

On <strong>par</strong>t donc d’image PLU; dans <strong>le</strong> cas prés<strong>en</strong>t on utilise <strong>le</strong>s images « fibro_PLU_h2ax_60s_1 » et<br />

« fibro_PLU_H2ax_60s_2 » que l’on combine <strong>en</strong> une image moy<strong>en</strong>ne pour réduire <strong>le</strong> bruit<br />

statistique<br />

On décompose cette image moy<strong>en</strong>ne de champ uniforme, codées <strong>en</strong> RGB 24-bit, <strong>en</strong> 3 images de<br />

niveaux de gris 8-bit, chacune de ces images correspondant à un des canaux de cou<strong>le</strong>ur ; R, G et B.<br />

Pour chaque composante de cou<strong>le</strong>ur de l’image moy<strong>en</strong>ne, on calcu<strong>le</strong> la va<strong>le</strong>ur moy<strong>en</strong>ne sur<br />

l’<strong>en</strong>semb<strong>le</strong> des pixels :<br />

<br />

PLU i, j S <br />

8bits Canal R,G,B<br />

Canal R,G,B<br />

Chaque composante de cou<strong>le</strong>ur de l’image moy<strong>en</strong>ne est convertie du mode 8-bits au mode<br />

32-bits<br />

<br />

PLU i, j PLU i, j<br />

8bits CanalR,G,B 32bits<br />

CanalR,G,B A <strong>par</strong>tir des trois moy<strong>en</strong>nes SCanal R,G,B et des trois images moy<strong>en</strong>nes (R,G,B) <strong>en</strong> mode 32-<br />

bits PLU i, j <br />

32bits Canal R,G,B , on calcu<strong>le</strong> trois « masques »; c'est-à-dire on constitue<br />

une image I2i,j où pour chaque pixel i, j Canal R,G,B est associé <strong>le</strong> scalaire<br />

<br />

i,j PLU i,j PLU i,j <br />

Canal R,G,B32bits Canal R,G,B<br />

32bits<br />

Canal R,G,B<br />

<br />

S PLU i,j<br />

Canal R,G,B 32bits<br />

Canal R,G,B<br />

Page 11


in2p3-00530281, version 1 - 28 Oct 2010<br />

Le masque est une image qui est utilisée pour créer une nouvel image I obt<strong>en</strong>ue <strong>par</strong> la fonction<br />

« Image calculator » d’ImageJ ; c'est-à-dire <strong>en</strong> multipliant, pixel à pixel une image origina<strong>le</strong><br />

<br />

1<br />

I i,j <strong>par</strong> <strong>le</strong> masque I i,j <br />

<br />

2<br />

<br />

I i,j Ii,j I i,j<br />

1 2<br />

Ii,j est l’image fina<strong>le</strong>. L’utilisation du mode 32-bit évite ainsi <strong>le</strong>s débordem<strong>en</strong>ts provoqués <strong>par</strong><br />

la multiplication de 2 pixels d’une image 8-bit. Par exemp<strong>le</strong> la va<strong>le</strong>ur 150 multipliée <strong>par</strong> 4<br />

devi<strong>en</strong>dra 255 <strong>en</strong> mode 8-bit au lieu de 600 <strong>en</strong> mode 32-bit. Une image 16-bit non signée peut<br />

suffire.<br />

Si on utilise <strong>le</strong> masque d’un canal (R,G ou B) <strong>avec</strong> la composante de la PLU moy<strong>en</strong>ne<br />

correspondant au même de canal de cou<strong>le</strong>ur, on obti<strong>en</strong>t une image uniforme dont la va<strong>le</strong>ur pour<br />

chaque pixel est égal à la va<strong>le</strong>ur moy<strong>en</strong>ne utilisée pour calcu<strong>le</strong>r <strong>le</strong> masque. En effet<br />

Ii,j <br />

Canal R,G,B i,j PLU<br />

Canal R,G,B 32bits<br />

i,j Canal<br />

R,G,B<br />

<br />

PLU32bits i, j<br />

<br />

Canal R,G,B<br />

PLU<br />

i, j<br />

PLU32bits i, j Canal<br />

R,G,B<br />

<br />

<br />

<br />

<br />

PLU i, j<br />

<br />

32bits<br />

Canal R,G,B<br />

32bits<br />

Canal R,G,B<br />

Dans <strong>le</strong> cas ou l’on utilise <strong>le</strong>s images de type PLU ( « fibro_PLU_h2ax_60s_1 à 2 »), et selon la<br />

figure (7), ces va<strong>le</strong>urs sont éga<strong>le</strong>s à 12,3 pour <strong>le</strong> canal R, 157 pour <strong>le</strong> canal G et 64,2 pour <strong>le</strong> canal<br />

B.<br />

Les masques serv<strong>en</strong>t donc a corriger <strong>le</strong>s images de la non uniformité de la réponse de la camera<br />

dans chacune des trois composantes de cou<strong>le</strong>ur<br />

On décompose l’image à traiter (fibroblaste <strong>en</strong> H2AX ou Dapi) selon <strong>le</strong>s composantes R, G et B :<br />

ImageSourcei, j Cannal R,G,B<br />

On applique sur chaque composantes R, G et B, <strong>le</strong> masque correspondant<br />

<br />

ImageCorrigée i, j<br />

Canal R,G,B<br />

<br />

ImageSource i, j i, j<br />

Canal R,G,BCanal R,G,B<br />

Les 3 composantes corrigées sont fusionnées <strong>en</strong> une image RGB qui est donc l’image fina<strong>le</strong><br />

corrigée<br />

Nous avons réalisé un plugin d’ImageJ, « PLU_RGB_Avg », qui a pour objectif d’effectuer <strong>le</strong><br />

prétraitem<strong>en</strong>t d’images Dapi ou H2ax à <strong>par</strong>tir de PLU(s) selon <strong>le</strong> protoco<strong>le</strong> décrit précédemm<strong>en</strong>t.<br />

Au démarrage de ce plugin, il faut choisir <strong>le</strong> répertoire de travail ; c’est à dire l’emplacem<strong>en</strong>t du<br />

fichier de log et lui donner un nom (<strong>par</strong> défaut <strong>le</strong> nom du plugin). Le plugin crée alors <strong>le</strong> fichier log<br />

récapitulatif des opérations effectuées tout au long de l’exécution du plugin. Le plugin agit sur une<br />

pi<strong>le</strong> d’images de PLU sé<strong>le</strong>ctionnées <strong>par</strong> l’utilisateur dans un répertoire.<br />

Pour faciliter la vérification du plugin, nous avons crée des images réduites composées de matrice<br />

de 85x64 pixels obt<strong>en</strong>ues à <strong>par</strong>tir des images origina<strong>le</strong>s haute résolution. Cela n’affecte <strong>en</strong> ri<strong>en</strong> <strong>le</strong><br />

processus de prétraitem<strong>en</strong>t, si ce n’est <strong>le</strong> temps de calcul et l’espace mémoire nécessaire pour<br />

traiter <strong>le</strong>s images. Le plugin a éga<strong>le</strong>m<strong>en</strong>t été vérifié sur des images complètes. Les fichiers d’essai<br />

sont donc :<br />

Image de PLU : « fibro_PLU_1.tif » et «fibro_PLU_2.tif »<br />

Image de fibroblastes H2AX : «fibro_9.tif »<br />

Page 12


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (10) : Chargem<strong>en</strong>t des images TIFF de type RGB, utilisées <strong>par</strong> <strong>le</strong><br />

pluggin « PLU_RGB_Avg »: images de type PLU et l’image à corriger<br />

Le plugin applique une projection sur <strong>le</strong>s images de PLU pour obt<strong>en</strong>ir une image de même type<br />

(toutes <strong>le</strong>s images utilisées doiv<strong>en</strong>t avoir la même résolution). La méthode de projection sur la pi<strong>le</strong><br />

d’images de PLU est <strong>par</strong> défaut une moy<strong>en</strong>ne.<br />

Tous <strong>le</strong>s <strong>par</strong>amètres nécessaires pour <strong>le</strong> prétraitem<strong>en</strong>t s’initialis<strong>en</strong>t dans <strong>le</strong> plugin au moy<strong>en</strong> d’un<br />

panel comme <strong>le</strong> montre la figure suivante:<br />

Figure (11) : Choix des options de prétraitem<strong>en</strong>t<br />

Le plugin affiche alors l’image de la pi<strong>le</strong> d’images de PLU projetée <strong>avec</strong> la méthode de projection<br />

choisie, dans notre cas « Average Int<strong>en</strong>sity » :<br />

Page 13


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (12) : PLU moy<strong>en</strong>ne de la projection des images fibro_PLU_1.tif et fibro_PLU_2.tif<br />

Le plugin sé<strong>par</strong>e <strong>en</strong>suite l’image PLU moy<strong>en</strong>ne <strong>en</strong> trois images 8-bit représ<strong>en</strong>tant <strong>le</strong>s canaux R, G et<br />

B et récupère la va<strong>le</strong>ur moy<strong>en</strong>ne pour chaque canal. Puis divise indép<strong>en</strong>damm<strong>en</strong>t <strong>le</strong>s 3 canaux <strong>par</strong><br />

<strong>le</strong>ur va<strong>le</strong>ur moy<strong>en</strong>ne (<strong>le</strong> plugin ne permet pas d’autre possibilité que la moy<strong>en</strong>ne).<br />

On choisit <strong>en</strong>suite à <strong>par</strong>tir d’un panel, l’image à prétraiter :<br />

Figure (13) : Sé<strong>le</strong>ction de l’image DAPI ou H2AX à prétraiter (à condition que cel<strong>le</strong>-ci ait été acquise<br />

dans <strong>le</strong>s mêmes conditions que <strong>le</strong>s images PLU).<br />

On divise (méthode <strong>par</strong> défaut) <strong>le</strong>s images, pixel-à-pixel, pour obt<strong>en</strong>ir une image résultante. La<br />

formu<strong>le</strong> utilisée pour l’opérateur ‘Division’ est la suivante :<br />

ImageCorrigéei, j Canal<br />

R,G,B<br />

ImageSourcei, j <br />

Canal R,G,B i, j<br />

Canal<br />

R,G,B<br />

Les 3 canaux corrigés sé<strong>par</strong>ém<strong>en</strong>t sont fusionnés <strong>en</strong> une image RGB fina<strong>le</strong>, qui est affichée <strong>par</strong> <strong>le</strong><br />

plugin, ainsi que l’histogramme de cel<strong>le</strong>-ci :<br />

Figure (14) : Histogramme de l’image RGB fina<strong>le</strong><br />

Page 14


in2p3-00530281, version 1 - 28 Oct 2010<br />

Résultat et évaluation des corrections du prétraitem<strong>en</strong>t<br />

Pour évaluer l’effet des corrections induites <strong>par</strong> <strong>le</strong> prétraitem<strong>en</strong>t, on utilise comme image origina<strong>le</strong><br />

l’image « fibro_ h2ax_100x_HR_21 » ainsi que l’image Dapi correspondante.<br />

L’évaluation des corrections du prétraitem<strong>en</strong>t peut être rapidem<strong>en</strong>t effectuée <strong>par</strong> com<strong>par</strong>aison de<br />

l'aspect général de l’image corrigée <strong>par</strong> rapport à l’image origina<strong>le</strong>. Les figures (17) et (18) montr<strong>en</strong>t ces<br />

com<strong>par</strong>aisons pour <strong>le</strong> coup<strong>le</strong> d’images #21 dans <strong>le</strong>s deux modes d’acquisition: DAPI et H2AX.<br />

Cette évaluation est très subjective. Cep<strong>en</strong>dant, on remarque quelques modifications dans <strong>le</strong>s images<br />

corrigées :<br />

Le contraste est beaucoup plus important, aussi bi<strong>en</strong> dans <strong>le</strong>s images DAPI et H2AX,<br />

de <strong>par</strong> <strong>le</strong>ur int<strong>en</strong>sité, un plus grand nombre de foci ap<strong>par</strong>aiss<strong>en</strong>t plus faci<strong>le</strong>m<strong>en</strong>t dans l’image<br />

H2AX,<br />

<strong>le</strong>s pixels chauds ont dis<strong>par</strong>us dans <strong>le</strong>s images corrigées, mais <strong>le</strong>s traces <strong>par</strong>asites ont rehaussées<br />

notamm<strong>en</strong>t dans l’image DAPI. Ces amas peuv<strong>en</strong>t être un problème dans l’analyse ultérieure des<br />

images<br />

Cette augm<strong>en</strong>tation importante du contraste a <strong>en</strong> fait pour origine une correction apportée <strong>par</strong> ImageJ<br />

durant <strong>le</strong>s calculs de conversion (contrast stretching). Le rehaussem<strong>en</strong>t du contraste se produit au<br />

mom<strong>en</strong>t de la conversion des images 32-bit <strong>en</strong> 8-bit de chaque composante RGB <strong>par</strong> redéfinition de la<br />

dynamique.<br />

Si on a une composante de cou<strong>le</strong>ur d’une image 32-bit dont la dynamique est restreinte à l’interval<strong>le</strong><br />

[0,210]. Comme <strong>le</strong> montre la figure (15), l’expansion de la dynamique <strong>par</strong> défaut lors de la conversion<br />

32-bit <strong>en</strong> 8-bit, va re<strong>par</strong>tir la dynamique de l’image brute sur <strong>le</strong>s 256 niveaux de gris<br />

disponib<strong>le</strong>s (correspondant à une image 8-bit)<br />

Figure (15) : Résultat de l’expansion de la dynamique <strong>par</strong> défaut lors<br />

de la fusion des composantes de cou<strong>le</strong>ur : l’histogramme de la<br />

composante est ré<strong>par</strong>tie sur toute la pa<strong>le</strong>tte des niveaux de gris ; à<br />

gauche l’histogramme original, à droite l’histogramme redistribué<br />

L’expansion de la dynamique est introduite <strong>par</strong> défaut lors de la fusion RGB pour former <strong>le</strong>s images<br />

fina<strong>le</strong>s. Par contre <strong>le</strong>s va<strong>le</strong>urs d’int<strong>en</strong>sité rest<strong>en</strong>t inchangées lors de la conversion inverse; c’est <strong>le</strong> cas de<br />

la conversion de 8-bit <strong>en</strong> 32-bits.<br />

Lorsque <strong>le</strong> prétraitem<strong>en</strong>t de calibration est réalisé <strong>avec</strong> ImageJ, <strong>le</strong>s résultats obt<strong>en</strong>us dép<strong>en</strong>d<strong>en</strong>t<br />

fortem<strong>en</strong>t des mécanismes de conversion d’images réalisés au cours du traitem<strong>en</strong>t et notamm<strong>en</strong>t lors de<br />

la fusion des composantes (<strong>en</strong> 32 bits) à l’image RGB (<strong>en</strong> 8 bits). Lors de cette étape, on a deux<br />

possibilités :<br />

Soit on fusionne <strong>le</strong>s 3 images correspondantes à chaque composante <strong>en</strong> une image RGB <strong>en</strong><br />

autorisant l’expansion de la dynamique, c'est-à-dire l’adaptation de la dynamique à la gamme.<br />

Cette méthode est l’option <strong>par</strong> défaut dans ImageJ,<br />

Soit on fusionne <strong>le</strong>s 3 images correspondantes à chaque composante <strong>en</strong> une image RGB <strong>en</strong><br />

conservant la dynamique d’origine.<br />

L’expansion de la dynamique (« rescaling ») appliquée <strong>par</strong> défaut <strong>par</strong> ImageJ est une transformation<br />

linéaire simp<strong>le</strong>:<br />

profondeur de codage<br />

2 1 <br />

M V math.round V min max min <br />

Page 15


in2p3-00530281, version 1 - 28 Oct 2010<br />

Un plugin « xy2txt » a été écrit pour afficher <strong>le</strong>s int<strong>en</strong>sités (<strong>en</strong> mode graysca<strong>le</strong> ou RGB). Les sorties de ce<br />

plugin sont représ<strong>en</strong>tés sur la figure (16).<br />

V correspond à la va<strong>le</strong>ur réel<strong>le</strong> de<br />

l’int<strong>en</strong>sité du pixel (va<strong>le</strong>ur ≥ 0,<br />

résultat de la division de l’image à<br />

traiter <strong>par</strong> la moy<strong>en</strong>ne des images<br />

PLU),<br />

La colonne Sca<strong>le</strong> = false représ<strong>en</strong>te<br />

la va<strong>le</strong>ur convertie <strong>en</strong> 8-bit,<br />

La colonne Sca<strong>le</strong> = true est la<br />

va<strong>le</strong>ur mappée de V sur l’interval<strong>le</strong><br />

[0, 255].<br />

Figure (16) : Outputs du plugin « xy2txt ». Les tab<strong>le</strong>aux du bas représ<strong>en</strong>t<strong>en</strong>t <strong>le</strong> cont<strong>en</strong>u des<br />

pixels après fusion des composantes RGB sans expansion de la dynamique (à gauche) et <strong>avec</strong> (à<br />

droite).<br />

Pour <strong>le</strong> premier pixel d’int<strong>en</strong>sité > 0 et de coordonnées (17, 23), la va<strong>le</strong>ur de l’int<strong>en</strong>sité corrigée vaut<br />

26.7. La profondeur de codage d’une image <strong>en</strong> 256 niveaux de gris nécessite 8 bits. La va<strong>le</strong>ur mappée<br />

p<strong>en</strong>dant l’étape de conversion réalisée <strong>par</strong> ImageJ <strong>avec</strong> l’option « scaling=true », est :<br />

,arrondi à 32<br />

<br />

M 27, 7 255 26, 7 0210 0 32, 4<br />

Page 16


in2p3-00530281, version 1 - 28 Oct 2010<br />

Dans <strong>le</strong> plugin « PLU_RGB_Avg », on choisit d’agir sur la dynamique dès la phase de conversion des<br />

images 32-bit <strong>en</strong> 8-bit, <strong>en</strong> autorisant ou non l’expansion de la dynamique <strong>par</strong> l’intermédiaire d’une<br />

commande sur <strong>le</strong> panel des <strong>par</strong>amètres du plugin (comme on peut <strong>le</strong> voir sur la figure (11)<br />

Dans <strong>le</strong> cas où on fusionne <strong>le</strong>s 3 composantes RGB <strong>en</strong> autorisant <strong>le</strong> rescaling de l’image, on obti<strong>en</strong>t un<br />

effet artificiel d’augm<strong>en</strong>tation du contraste. De plus cette augm<strong>en</strong>tation de contraste va dép<strong>en</strong>dre de la<br />

dynamique de l’image. Par exemp<strong>le</strong>, dans <strong>le</strong> cas d’un histogramme couvrant l’interval<strong>le</strong> [0, 250], il n’y<br />

aura quasim<strong>en</strong>t pas d’augm<strong>en</strong>tation puisque la composante est déjà à 250. Par contre pour <strong>le</strong>s<br />

composantes de cou<strong>le</strong>urs secondaires dont <strong>le</strong>s moy<strong>en</strong>nes sont <strong>en</strong> général faib<strong>le</strong>s, <strong>le</strong> rescaling va<br />

augm<strong>en</strong>ter artificiel<strong>le</strong>m<strong>en</strong>t <strong>le</strong> poids de ces composantes<br />

Il faut aussi pr<strong>en</strong>dre garde à cette manipulation qui aide à la compréh<strong>en</strong>sion des images mais qui ne<br />

convi<strong>en</strong>t pas si on doit quantifier <strong>le</strong>s images (modification des images). En outre, l’utilisation a posteriori<br />

du rehaussem<strong>en</strong>t de contraste via <strong>le</strong> m<strong>en</strong>u d’ImageJ (Image Adjust Brightness/Contraste) aura <strong>le</strong><br />

même effet.<br />

L’option de « rescaling », appliquée <strong>par</strong> défaut lors de la conversion des images 16 ou 32-bit <strong>en</strong> 8-bit,<br />

optimisera <strong>le</strong> contraste visuel<strong>le</strong> des images mais ne modifiera pas <strong>le</strong> rapport signal/bruit qui est comme<br />

nous <strong>le</strong> soulignions est <strong>le</strong> facteur principal pour l’analyse ultérieure des images.<br />

En toute rigueur, il serait donc nécessaire d’interdire <strong>le</strong> rescaling au mom<strong>en</strong>t de fusionner <strong>le</strong>s<br />

composantes pour créer l’image RGB fina<strong>le</strong>.<br />

Les figures (17) et (18) représ<strong>en</strong>t<strong>en</strong>t <strong>le</strong>s images DAPI et H2AX #21 <strong>avec</strong> l’expansion de la dynamique. Les<br />

figures (19) et (20) représ<strong>en</strong>t<strong>en</strong>t <strong>le</strong>s images DAPI et H2AX #21 sans l’expansion de la dynamique. La<br />

com<strong>par</strong>aison semb<strong>le</strong> décevante à première vue. Il est vrai que dans ce cas, <strong>le</strong> microscope comme <strong>le</strong> CCD<br />

sont de bonne qualité et bi<strong>en</strong> réglés. Cep<strong>en</strong>dant il y a toujours une inhomogénéité de la réponse du<br />

système (optique et CCD) qui doit être au moins évaluée pour montrer son importance. Par exemp<strong>le</strong> <strong>le</strong>s<br />

figures (21) montr<strong>en</strong>t <strong>le</strong>s images, converties <strong>en</strong> gris (sur 8 bits) des trois composantes de cou<strong>le</strong>ur (RGB)<br />

du masque obt<strong>en</strong>u à <strong>par</strong>tir des images de PLU acquise sur 10 secondes. Dans la colonne de droite, on a<br />

représ<strong>en</strong>té l’histogramme associé à chacune des composantes.<br />

Le contraste et la luminosité ont été ajustés pour percevoir l’inhomogénéité des distributions<br />

d’éclairem<strong>en</strong>t. Outre l’assombrissem<strong>en</strong>t des coins haut-gauche et bas-droit et des bords de chacune<br />

des images, on voit <strong>par</strong> ail<strong>le</strong>urs que chaque image prés<strong>en</strong>te un aspect « granu<strong>le</strong>ux » dont l’origine<br />

réside certainem<strong>en</strong>t dans <strong>le</strong>s fluctuations statistiques résultant du temps de pose (10 secondes)<br />

<strong>avec</strong> <strong>le</strong>quel <strong>le</strong>s PLU ont été acquises.<br />

On remarque éga<strong>le</strong>m<strong>en</strong>t sur <strong>le</strong>s trois images, une « tache » sombre dans la <strong>par</strong>tie basse-droite.<br />

Cette tache est prés<strong>en</strong>te dans toutes <strong>le</strong>s images de PLU acquises lors de cette sessions de prise<br />

d’image.<br />

Ce default est mis <strong>en</strong> évid<strong>en</strong>ce dans la figure (23) qui représ<strong>en</strong>te l’image moy<strong>en</strong>ne des PLU<br />

acquises <strong>avec</strong> un temps de pose de 60 secondes ; la PLU moy<strong>en</strong>ne a été convertie <strong>en</strong> gris sur 8 bits,<br />

puis l’int<strong>en</strong>sité et <strong>le</strong> contraste on été ajusté pour faire ressortir <strong>le</strong> défaut optique<br />

La mauvaise uniformité de la lumière (assombrissem<strong>en</strong>t sur <strong>le</strong>s bords de l’image) ap<strong>par</strong>ait <strong>en</strong>core<br />

plus clairem<strong>en</strong>t sur cette image. La <strong>par</strong>tie (b) de la figure 23 prés<strong>en</strong>te un grossissem<strong>en</strong>t de l’image<br />

autour du défaut ; on y voit clairem<strong>en</strong>t que ce défaut résultant d’un objet situé sur <strong>le</strong> chemin<br />

optique est relativem<strong>en</strong>t important <strong>en</strong> termes de nombre de pixels concernés. Ce défaut peut être<br />

une poussière située sur une des <strong>le</strong>ntil<strong>le</strong>s ou sur <strong>le</strong> filtre utilisé lors de la prise d’image. El<strong>le</strong><br />

ap<strong>par</strong>ait sous forme d'anneaux conc<strong>en</strong>triques de diffraction comme on <strong>le</strong> voit sur ces images.<br />

De plus ce grossissem<strong>en</strong>t fait ap<strong>par</strong>aitre un pixel « mort ».La <strong>par</strong>tie inférieure de l’image (23),<br />

représ<strong>en</strong>te <strong>le</strong> profil de l’int<strong>en</strong>sité dans <strong>le</strong>s pixels situés sur <strong>le</strong> chemin indiqué sur l’image prés<strong>en</strong>tée<br />

sur la <strong>par</strong>tie (d). Ce chemin passant <strong>par</strong> <strong>le</strong> pixel « mort », on voit sur la <strong>par</strong>tie (c ) que l’int<strong>en</strong>sité<br />

prés<strong>en</strong>te un creux brutal au passage de ce pixel<br />

En conclusion <strong>le</strong> prétraitem<strong>en</strong>t a une portée réduite sur <strong>le</strong>s images acquises à l’ESRF, du fait de la<br />

bonne qualité du capteur de la caméra associé au microscope. Mais el<strong>le</strong> peut avoir toute son<br />

importance dans <strong>le</strong> cas d’une mauvaise homogénéité du capteur associé au microscope. En tout état<br />

de cause, cette uniformité doit être vérifiée de manière systématique et doit faire <strong>par</strong>tie des<br />

vérifications à réaliser avant toute prise d’images (calibration). En effet, ce prétraitem<strong>en</strong>t corrige<br />

systématiquem<strong>en</strong>t certains défauts de l’optique et permet d’uniformiser <strong>le</strong>s images avant de <strong>le</strong>s<br />

quantifier. De même, nous n’avons pas utilisé la correction de bruit thermique (offset des images)<br />

du fait de la bonne qualité de la CCD. De manière id<strong>en</strong>tique, il faudra effectuer la vérification du<br />

bruit thermique systématiquem<strong>en</strong>t avant l’acquisition massive d’image.<br />

Page 17


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (17) : Correction de l’image Dapi #21 <strong>en</strong> haute résolution: image origina<strong>le</strong> (<strong>en</strong><br />

haut) et image corrigée (<strong>en</strong> bas). L.es images sont corrigées <strong>en</strong> utilisant trois images PLU<br />

(temps d’exposition de 10s). L’option de rescaling, appliquée <strong>par</strong> défaut lors de la<br />

conversion des images 32-bit <strong>en</strong> 8-bit, optimise <strong>le</strong> contraste visuel des images mais ne<br />

modifiera pas <strong>le</strong> rapport signal/bruit.<br />

Page 18


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (18) : Correction de l’image H2AX #21 <strong>en</strong> haute résolution: image origina<strong>le</strong> (<strong>en</strong> haut) et image<br />

corrigée (<strong>en</strong> bas). Les images sont corrigées <strong>en</strong> utilisant 2 images de PLU (temps d’exposition de<br />

60s). L’option de rescaling, appliquée <strong>par</strong> défaut lors de la conversion des images 16 ou 32-bit <strong>en</strong> 8bit,<br />

optimise <strong>le</strong> contraste visuel des images mais ne modifiera pas <strong>le</strong> rapport signal/bruit.<br />

.<br />

Page 19


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (19) : Image Dapi #21 <strong>en</strong> haute résolution: l’image origina<strong>le</strong> (<strong>en</strong> haut) et l’image<br />

corrigée (<strong>en</strong> bas). L’option de rescaling n’a pas été appliquée pour corriger l’image. Le<br />

prétraitem<strong>en</strong>t a simp<strong>le</strong>m<strong>en</strong>t eu pour effet (non perceptib<strong>le</strong> à cette échel<strong>le</strong>) de<br />

supprimer <strong>le</strong>s « pixels chauds ».<br />

Page 20


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (20) : Image H2AX #21 <strong>en</strong> haute résolution: l’image origina<strong>le</strong> (<strong>en</strong> haut) et l’image<br />

corrigée (<strong>en</strong> bas). L’option de rescaling n’a pas été appliquée pour corriger l’image. Le<br />

prétraitem<strong>en</strong>t a simp<strong>le</strong>m<strong>en</strong>t eu pour effet (non perceptib<strong>le</strong> à cette échel<strong>le</strong>) de<br />

supprimer <strong>le</strong>s « pixels chauds ».<br />

Page 21


in2p3-00530281, version 1 - 28 Oct 2010<br />

Masque de la composante Rouge Histogramme<br />

Masque de la composante Verte Histogramme<br />

Masque de la composante B<strong>le</strong>ue Histogramme<br />

Figure (22) : A gauche, <strong>le</strong>s masques des composantes RGB obt<strong>en</strong>us à <strong>par</strong>tir d’une pi<strong>le</strong> de 3<br />

images de PLU projetées <strong>par</strong> la méthode de la moy<strong>en</strong>ne (tps d’exposition de 10s). Le contraste<br />

et la luminosité ont été ajustés pour percevoir l’inhomogénéité des distributions d’éclairem<strong>en</strong>t.<br />

A droite, l’histogramme de chaque composante est prés<strong>en</strong>té.<br />

Page 22


in2p3-00530281, version 1 - 28 Oct 2010<br />

a) Aspect de la PLU moy<strong>en</strong>née.<br />

Zone d’interception<br />

de la lumière <strong>par</strong><br />

une « poussière »<br />

Mauvaise<br />

uniformité de la<br />

lumière<br />

(assombrissem<strong>en</strong>t<br />

autour du foyer<br />

optique)<br />

Pixel « mort »<br />

c) Zoom sur l’interception de la lumière<br />

<strong>par</strong> une poussière.<br />

Poussière<br />

Pixel « mort »<br />

b) Zoom sur deux types<br />

d’obstac<strong>le</strong> à la lumière.<br />

Bruit<br />

statistique<br />

d) Coupe sur <strong>le</strong>s défauts de la<br />

f<strong>en</strong>être de zoom.<br />

Figure (23) - Défauts optiques du capteur :pixel « mort » et « poussière » prés<strong>en</strong>te sur <strong>le</strong> chemin<br />

optique du microscope.<br />

Page 23


in2p3-00530281, version 1 - 28 Oct 2010<br />

Description de la macro de comptage des foci <strong>par</strong> noyau<br />

L’objectif étant de faire des quantifications sur <strong>le</strong>s images des cellu<strong>le</strong>s irradiées, l’analyse des images<br />

doit consister à :<br />

reconnaitre <strong>le</strong>s noyaux dans <strong>le</strong>s images,<br />

reconnaitre <strong>le</strong>s foci dans <strong>le</strong>s noyaux pour caractériser <strong>le</strong>urs caractéristiques : int<strong>en</strong>sité, surface,<br />

périmètre, variab<strong>le</strong>s de forme, etc).<br />

Cet outil d’analyse automatique de reconnaissance et de mesure des foci permettra d’obt<strong>en</strong>ir une liste<br />

des foci <strong>par</strong> noyaux qui sera utilisée <strong>en</strong>suite pour extraire <strong>le</strong>s informations statistiques sur la topologie<br />

des foci .Les algorithmes de traitem<strong>en</strong>t d’images sont inclus dans une macro ImageJ.<br />

Cette macro utilise des sé<strong>le</strong>ctions de <strong>par</strong>tie des images au moy<strong>en</strong> de zone d’intérêt (« Region Of<br />

Interest » ou ROI dans <strong>le</strong> formalisme d’ImageJ).<br />

Une ROI est donc une <strong>par</strong>tie de l’image sur laquel<strong>le</strong> sera effectuée des opérations ou des mesures;<br />

<strong>le</strong> reste de l’image étant ignoré.<br />

On peut définir une ROI <strong>par</strong> la création d’un masque binaire, qui est une image binaire de la même<br />

tail<strong>le</strong> que l’image origina<strong>le</strong>, mais pour laquel<strong>le</strong> <strong>le</strong>s pixels cont<strong>en</strong>us dans la ROI sont à « 1 » et <strong>le</strong>s<br />

pixels hors de la ROI sont à « 0 ». On définit plus couramm<strong>en</strong>t <strong>le</strong>s ROI <strong>par</strong> l’intermédiaire d’un<br />

seuillage sur l’int<strong>en</strong>sité associée à chaque pixel : si l’int<strong>en</strong>sité est au delà du seuil, <strong>le</strong>s pixels sont<br />

considérés comme ap<strong>par</strong>t<strong>en</strong>ant à la ROI (pixels à « 1 »), <strong>le</strong>s pixels dont l’int<strong>en</strong>sité est inférieure au<br />

seuil sont considérés comme n’ap<strong>par</strong>t<strong>en</strong>ant pas à la ROI (pixels à « 0 »).<br />

Les pixels d’une ROI peuv<strong>en</strong>t définir une zone continue, c’est <strong>le</strong> cas lorsque la ROI est définit<br />

géométriquem<strong>en</strong>t <strong>par</strong> une forme fermée (polygone, cerc<strong>le</strong>, rectang<strong>le</strong>..). Dans <strong>le</strong> cas d’un seuillage,<br />

la ROI peut être formé <strong>par</strong> des groupes de pixels non voisins.<br />

On peut définir plus d’un ROI dans une image; toute <strong>le</strong>s ROIs définies sont gérées <strong>par</strong> <strong>le</strong> « ROI<br />

Manager » d’ImageJ<br />

La méthode de sé<strong>le</strong>ction des focis repose sur l’utilisation de coup<strong>le</strong>s d’images associées ; l’image<br />

DAPI permet de définir la ROI correspondant aux noyaux cellulaires ; l’image H2AX associée permet<br />

<strong>en</strong>suite de définir <strong>le</strong>s foci dans la ROI définissant ces noyaux cellulaires. Il est donc nécessaire, au<br />

préalab<strong>le</strong>, de disposer d’un dossier cont<strong>en</strong>ant deux sous-dossiers *obligatoirem<strong>en</strong>t* nommés « DAPI »<br />

et « H2AX ». Dans <strong>le</strong>s deux dossiers 'DAPI' et 'H2AX, <strong>le</strong>s images à analyser DAPI et H2AX doiv<strong>en</strong>t être<br />

ap<strong>par</strong>iées correctem<strong>en</strong>t dans <strong>le</strong> même ordre comme <strong>le</strong> montre la figure (24).<br />

Dossier images DAPI Dossier images H2AX<br />

Figure (24) : Répertoire 'DAPI' et 'H2AX cont<strong>en</strong>ant <strong>le</strong>s images ap<strong>par</strong>iées, qui vont être<br />

utilisées <strong>par</strong> la macro pour l’analyse<br />

Page 24


in2p3-00530281, version 1 - 28 Oct 2010<br />

Donc dans un premier temps, l’image DAPI est convertie sur 8 bits, <strong>en</strong> niveau de gris. Dans <strong>le</strong> cas<br />

prés<strong>en</strong>t, on s’est cont<strong>en</strong>té de la conversion standard dans ImageJ ; c'est-à-dire<br />

gray=0.299red+0.587gre<strong>en</strong>+0.114blue<br />

Puis l’image est utilisée pour définir, <strong>par</strong> seuillage sur l’int<strong>en</strong>sité des pixels de l’image DAPI, des<br />

masques binaires définissant pot<strong>en</strong>tiel<strong>le</strong>m<strong>en</strong>t <strong>le</strong>s noyaux cellulaires. Le réglage du niveau de<br />

seuillage est ajusté automatiquem<strong>en</strong>t d’après l’histogramme de l’image sé<strong>le</strong>ctionnée (méthode<br />

« SetAutoThreshold() »). Les ROI pot<strong>en</strong>tiels sont sé<strong>le</strong>ctionnés selon des caractéristiques de<br />

configuration qui sont mesurés sur <strong>le</strong>s masques. Le choix de la mesure de ces caractéristiques est<br />

prédéfini dans la macro <strong>par</strong> « run("Set Measurem<strong>en</strong>ts...", "area mean c<strong>en</strong>troid redirect="…"<br />

decimal=3 circularity perimeter fit") ». Parmi la liste des caractéristiques, la macro mesure :<br />

«area»: Surface du masque (noyau ou foci) dans l’unité définie <strong>par</strong> la calibration spatia<strong>le</strong><br />

des images. Dans notre cas, <strong>le</strong>s unités sont des « inches » <strong>avec</strong> la conversion de 200 pixels<br />

<strong>par</strong> « inch ».<br />

«mean»: Int<strong>en</strong>sité moy<strong>en</strong>ne (<strong>en</strong> va<strong>le</strong>urs de gris) sur la surface du masque sé<strong>le</strong>ctionné ;<br />

c'est-à-dire la somme des int<strong>en</strong>sités de gris associés à chaque pixel, divisée <strong>par</strong> <strong>le</strong> nombre<br />

de pixels.<br />

«c<strong>en</strong>troid»’: calcul des coordonnées du c<strong>en</strong>tre de gravité du « c<strong>en</strong>troid ». Le calcul du<br />

c<strong>en</strong>tre de masse peut être pondéré <strong>par</strong> <strong>le</strong>s int<strong>en</strong>sités des pixels. Les unités utilisées pour<br />

exprimer ces coordonnées sont des pixels<br />

« circularity »: critère géométrique dont <strong>le</strong> calcul utilise la formu<strong>le</strong> suivante,<br />

aera <br />

Circularity 4 <br />

<br />

<br />

2<br />

perimeter<br />

<br />

<br />

Une va<strong>le</strong>ur de circularité de 1 correspond à une forme circulaire; alors qu’une circularité<br />

de 0 indique plutôt un polygone allongé (un trait)<br />

Les critères utilisés pour la sé<strong>le</strong>ction des ROI des noyaux peuv<strong>en</strong>t être ajusté <strong>par</strong> l’utilisateur au<br />

cours de l’exécution de la macro <strong>par</strong> l’intermédiaire d’un panneau comme <strong>le</strong> montre la figure (25)<br />

Pour ce qui concerne <strong>le</strong>s masques associés au noyau, <strong>le</strong>s critères de sé<strong>le</strong>ction sont <strong>le</strong>s suivants<br />

« aera » supérieure à 10000 pixels<br />

« circularity » comprise <strong>en</strong>tre 0 et 1<br />

Figure (25) : Détermination des <strong>par</strong>amètres de l’analyse pour <strong>le</strong>s masques des noyaux et des<br />

foci : seuil sur l’aire du masque, <strong>par</strong>amètre de circularité<br />

Après cette première sé<strong>le</strong>ction, on obti<strong>en</strong>t une liste de masques qui définiss<strong>en</strong>t <strong>le</strong>s ROI<br />

correspondant aux noyaux. L’utilisateur est alors invité à valider manuel<strong>le</strong>m<strong>en</strong>t chacune de ces<br />

sé<strong>le</strong>ctions, et év<strong>en</strong>tuel<strong>le</strong>m<strong>en</strong>t refuser une sé<strong>le</strong>ction inappropriée.<br />

Page 25


in2p3-00530281, version 1 - 28 Oct 2010<br />

La figure (26) représ<strong>en</strong>te sur la <strong>par</strong>tie gauche une mauvaise sé<strong>le</strong>ction du fait de deux noyaux<br />

adjac<strong>en</strong>ts, et sur la <strong>par</strong>tie droite une bonne sé<strong>le</strong>ction.<br />

Rejet de la sé<strong>le</strong>ction sur l’image DAPI Un masque de noyau acceptab<strong>le</strong><br />

Figure (26) : deux exemp<strong>le</strong>s de masque définissant <strong>le</strong>s noyaux cellulaires : la sé<strong>le</strong>ction de gauche est<br />

annulée <strong>par</strong> l’utilisateur, alors que la sé<strong>le</strong>ction de la <strong>par</strong>tie droite est validée<br />

Les sé<strong>le</strong>ctions des ROI des noyaux sont r<strong>en</strong>ommées (préfixe "Cell_"). L’<strong>en</strong>semb<strong>le</strong> des ROI des noyaux<br />

validés sont sauvegardé dans un fichier «fibro_h2ax_100x_HR_Y.tif_ROIs.zip » ou Y est <strong>le</strong> numéro de<br />

l’image. Chacun des masques validés est éga<strong>le</strong>m<strong>en</strong>t sauvegardé dans un fichier sé<strong>par</strong>é<br />

«fibro_h2ax_100x_HR_Y.tif_ROIs_Cell_X .zip » ou X est <strong>le</strong> numéro du noyau dans l’image<br />

Figure (27) : Résultats sauvegardés dans <strong>le</strong> répertoire de travail<br />

Les « ROI » conti<strong>en</strong>n<strong>en</strong>t toutes <strong>le</strong>s informations correspondantes aux masques. Cette sauvegarde<br />

permet de vider <strong>le</strong> ROI Manager de tout masque avant de comm<strong>en</strong>cer la deuxième phase du<br />

traitem<strong>en</strong>t.<br />

Page 26


in2p3-00530281, version 1 - 28 Oct 2010<br />

La deuxième phase consiste à définir des focis <strong>par</strong> la création de masques correspondant à l’<strong>en</strong>semb<strong>le</strong><br />

des pixels représ<strong>en</strong>tant un foci dans l’image H2AX. Les masques de foci sont obt<strong>en</strong>us <strong>par</strong> un seuillage<br />

automatique de l’image <strong>avec</strong> la méthode « SetAutoThreshold ».<br />

Les foci pot<strong>en</strong>tiels sont éga<strong>le</strong>m<strong>en</strong>t mesurés pour effectuer un filtrage selon la va<strong>le</strong>ur de l’aire et de<br />

la circularité du masque correspondant. Pour ce qui concerne <strong>le</strong>s masques associés au foci, <strong>le</strong>s<br />

critères de sé<strong>le</strong>ction sont <strong>le</strong>s suivants<br />

« aera » supérieure à 10 pixels<br />

« circularité » comprise <strong>en</strong>tre 0 et 1<br />

Les figures (28) et (29) prés<strong>en</strong>t<strong>en</strong>t <strong>le</strong>s masques définis pour un noyau cellulaire à <strong>par</strong>tir de l’image DAPI,<br />

et <strong>le</strong>s masques correspondants aux focis dans ce noyau cellulaire, déterminés dans l’image H2AX<br />

correspondante <strong>en</strong> utilisant <strong>le</strong> masque du noyau pour limiter la recherche des focis.<br />

En fin d'analyse, <strong>le</strong>s résultats des analyses (mesures de surface, périmètre, position et ratio divers)<br />

des foci <strong>par</strong> noyau sont placés dans des fichiers « .xls » dans <strong>le</strong> répertoire <strong>par</strong><strong>en</strong>t.<br />

Figure (28) : Prés<strong>en</strong>tation de l’<strong>en</strong>veloppe convexe du noyau<br />

Figure (29) : Prés<strong>en</strong>tation de tous <strong>le</strong>s foci détectés <strong>avec</strong> <strong>le</strong>s préréglages choisis<br />

Page 27


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (30) : Synthèse des résultats (Nombre de foci <strong>par</strong> noyau)<br />

La macro se termine <strong>par</strong> l’affichage de la distribution du nombre de foci <strong>par</strong> noyau:<br />

Sur l’axe X, <strong>le</strong> nombre de foci <strong>par</strong> noyau,<br />

Sur l’axe Y, <strong>le</strong> nombre de noyaux candidats.<br />

Figure (31) : P<strong>lot</strong> du graphe de fréqu<strong>en</strong>ce<br />

Pour l’image #26, <strong>le</strong> premier noyau ret<strong>en</strong>u (cell_0) conti<strong>en</strong>t l’<strong>en</strong>semb<strong>le</strong> de mesures des 24 foci du<br />

noyau:<br />

Page 28


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (32) : fibro_h2ax_100x_HR_26.tif_Cell_0.xls<br />

<strong>Analyse</strong> des images H2AX acquises à l’ESRF<br />

La macro de reconnaissance des foci a été utilisée pour analyser <strong>le</strong>s 31 images de cellu<strong>le</strong><br />

fibroblastes, irradiées à 1 Gray sur <strong>le</strong> faisceau de rayon X de l’ESRF. Compte t<strong>en</strong>u que <strong>le</strong><br />

prétraitem<strong>en</strong>t des images n’apporte pas une amélioration importante dans <strong>le</strong> cas prés<strong>en</strong>t, à la<br />

reconnaissance des foci dans <strong>le</strong>s cellu<strong>le</strong>s, nous avons utilisé <strong>le</strong>s images origina<strong>le</strong>s acquises <strong>en</strong> haute<br />

résolution.<br />

Après une validation visuel<strong>le</strong> des noyaux, nous obt<strong>en</strong>ons un <strong>lot</strong> de 83 noyaux, cont<strong>en</strong>ant 1785 foci.<br />

Les données obt<strong>en</strong>ues pour chaque noyau dans chaque cellu<strong>le</strong> sont stockées dans un fichier sé<strong>par</strong>é<br />

de type « excel ». Ce fichier est converti <strong>en</strong> fichiers « texte », stockés dans un sous répertoire du<br />

répertoire de travail. Un programme <strong>en</strong> C examine <strong>le</strong> cont<strong>en</strong>u de ce sous répertoire pour combiner<br />

l’<strong>en</strong>semb<strong>le</strong> des données et <strong>le</strong>s utiliser pour calcu<strong>le</strong>r et représ<strong>en</strong>ter <strong>par</strong> l’intermédiaire du <strong>logiciel</strong><br />

ROOT <strong>le</strong>s caractéristiques de ce <strong>lot</strong> de cellu<strong>le</strong>s.<br />

Les figures (33) représ<strong>en</strong>t<strong>en</strong>t la distribution du nombre de foci pour l’<strong>en</strong>semb<strong>le</strong> des 83 noyaux. On<br />

obti<strong>en</strong>t une va<strong>le</strong>ur moy<strong>en</strong>ne du nombre de foci <strong>par</strong> noyau de 20.75 <strong>avec</strong> un sigma de 6.96. La <strong>par</strong>tie<br />

gauche de la figure est la distribution de l’int<strong>en</strong>sité tota<strong>le</strong> des focis dans <strong>le</strong>s noyaux ; int<strong>en</strong>sité<br />

calculée comme la somme des produits des surfaces de chaque foci (<strong>en</strong> pixel carré) multiplié <strong>par</strong><br />

l’int<strong>en</strong>sité moy<strong>en</strong>ne de ce même foci. Cette distribution prés<strong>en</strong>te un pic marqué pour une va<strong>le</strong>ur de<br />

6-7 . Ce pic est dominé <strong>par</strong> des foci de petite surface.<br />

En effet comme <strong>le</strong> montre la figure (34), 350 des 1785 focis ont une surface inférieure ou éga<strong>le</strong> à<br />

100 pixel-carré (soit ~20 % de l’<strong>en</strong>semb<strong>le</strong> des pixels). L’int<strong>en</strong>sité moy<strong>en</strong>ne est relativem<strong>en</strong>t bi<strong>en</strong><br />

définie : 31 <strong>avec</strong> un sigma de 10. Par contre la forme de ces foci est très variab<strong>le</strong> car comme <strong>le</strong><br />

montre la distribution de la circularité de ceux-ci, cette forme varie depuis un cerc<strong>le</strong> presque<br />

<strong>par</strong>fait (circularité proche de 1), à une forme relativem<strong>en</strong>t allongée (circularité proche de 0).<br />

aera <br />

Circularity 4 <br />

<br />

<br />

2<br />

perimeter<br />

<br />

<br />

Page 29


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (33) : Distribution du nombre de foci <strong>par</strong> noyau (à gauche), et de l’int<strong>en</strong>sité tota<strong>le</strong> de ces<br />

focis dans <strong>le</strong>s noyaux (à droite)<br />

Figure (34) : Distribution de la surface des 1785 foci <strong>en</strong> pixel-carré (à gauche), et de <strong>le</strong>ur int<strong>en</strong>sité<br />

moy<strong>en</strong>ne (à droite). L’histogramme du bas représ<strong>en</strong>te la distribution de la circularité des foci.<br />

L’analyse de la topologie des focis dans <strong>le</strong>s noyaux peut être faite à <strong>par</strong>tir des coordonnées <strong>en</strong> x et<br />

y de ces foci. Dans un premier temps, nous avons simp<strong>le</strong>m<strong>en</strong>t calculé la va<strong>le</strong>ur moy<strong>en</strong>ne des<br />

Page 30


in2p3-00530281, version 1 - 28 Oct 2010<br />

distances <strong>en</strong>tre <strong>le</strong> c<strong>en</strong>troid des positions des focis à l’intérieur du noyau. Une fois <strong>le</strong>s coordonnées<br />

du c<strong>en</strong>troid calculées, on se sert de cel<strong>le</strong>-ci pour déterminer la distance carré moy<strong>en</strong>ne <strong>en</strong>tre ce<br />

c<strong>en</strong>troid et tous <strong>le</strong>s focis. La distribution de la racine carrée de cette variab<strong>le</strong> est représ<strong>en</strong>tée sur la<br />

figure (35). La s<strong>en</strong>sibilité de cette variab<strong>le</strong> de dispersion n’est pas suffisante pour caractériser la<br />

distribution des focis dans <strong>le</strong>s noyaux, il faut donc faire appel à d’autres types de variab<strong>le</strong>s.<br />

La figure (35) représ<strong>en</strong>te <strong>le</strong> diagramme de corrélation <strong>en</strong>tre l’int<strong>en</strong>sité tota<strong>le</strong> des focis mesurée<br />

dans <strong>le</strong>s noyaux et <strong>le</strong> nombre de foci détectés. Une corrélation existe car il est possib<strong>le</strong> de définir à<br />

<strong>par</strong>tir du nuage de point une ligne de corrélation. Cep<strong>en</strong>dant cette corrélation n’est pas aussi<br />

marquée que l’on pourrait att<strong>en</strong>dre.<br />

La figure (36) représ<strong>en</strong>te <strong>le</strong> diagramme de corrélation <strong>en</strong>tre l’int<strong>en</strong>sité tota<strong>le</strong> des foci mesurés dans<br />

<strong>le</strong>s noyaux et la dispersion des foci détectés. Il n’y a ap<strong>par</strong>emm<strong>en</strong>t aucune corrélation. Cep<strong>en</strong>dant<br />

cette variab<strong>le</strong> de dispersion ne semb<strong>le</strong> pas assez s<strong>en</strong>sib<strong>le</strong> et significative pour mesurer une<br />

quelconque variation.<br />

Figure (35) : Diagramme de corrélation <strong>en</strong>tre la dispersion des foci (sur l’axe des abscisses), et<br />

l’int<strong>en</strong>sité tota<strong>le</strong> (sur l’axe des ordonnées) dans <strong>le</strong>s 83 noyaux mesurés<br />

Figure (36) : Distribution de la dispersion des foci dans <strong>le</strong>s noyaux. La définition de cette dispersion<br />

est expliquée dans <strong>le</strong> texte<br />

Page 31


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (37) : Diagramme de corrélation <strong>en</strong>tre <strong>le</strong> nombre de foci (sur l’axe des abscisses), et<br />

l’int<strong>en</strong>sité tota<strong>le</strong> (sur l’axe des ordonnées) dans <strong>le</strong>s 83 noyaux mesurés<br />

Conclusion et perspectives<br />

Cette étude avait pour but d’examiner sur <strong>lot</strong> d’images obt<strong>en</strong>ues <strong>par</strong> <strong>microscopie</strong> à épifluorec<strong>en</strong>ce,<br />

significatives des images susceptib<strong>le</strong>s d’être traitées dans <strong>le</strong> cadre du projet ROSIRIS. Puis de<br />

montrer quel<strong>le</strong>s pouvai<strong>en</strong>t être <strong>le</strong>s difficultés r<strong>en</strong>contrées pour effectuer l’analyse de ces images<br />

dans <strong>le</strong> but d’obt<strong>en</strong>ir des informations pertin<strong>en</strong>tes sur <strong>le</strong>s processus biologiques découlant de<br />

l’irradiation de cellu<strong>le</strong>.<br />

Dans un premier temps, nous avons décrit succinctem<strong>en</strong>t <strong>le</strong>s principes de fonctionnem<strong>en</strong>t des<br />

élém<strong>en</strong>ts matériels utilisés :<br />

Microscope Olympus BX51 (Annexe A),<br />

CCD Olympus DP70 (Annexe B),<br />

<strong>en</strong> vue de compr<strong>en</strong>dre quel<strong>le</strong> était <strong>le</strong>s divers facteurs susceptib<strong>le</strong> d’altérer la qualité des images.<br />

Cette analyse été abordée selon <strong>le</strong> principe de calibration nécessaire à tout ap<strong>par</strong>eillage de mesure.<br />

Nous avons donc <strong>en</strong>visagé une phase préalab<strong>le</strong> de prétraitem<strong>en</strong>t (calibration) qui devrait être<br />

effectuée simultaném<strong>en</strong>t à toute phase d’acquisition d’image. Bi<strong>en</strong> sur cette phase de<br />

prétraitem<strong>en</strong>t est fortem<strong>en</strong>t dép<strong>en</strong>dante du matériel employé et peut demander un travail de<br />

mesure très important (quantimétrie). Le travail prés<strong>en</strong>té dans ce docum<strong>en</strong>t n’est qu’une première<br />

ébauche destiné à cerner <strong>le</strong>s points <strong>le</strong>s plus importants.<br />

A <strong>par</strong>tir d’un certain nombre de prise d’images réalisées lors de l’acquisition des images cellulaires<br />

<strong>avec</strong> <strong>le</strong> microscope à épifluorec<strong>en</strong>ce dans des conditions <strong>par</strong>ticulières : illumination uniforme,<br />

image « noire », image d’offset… Nous avons réalisé quelques prétraitem<strong>en</strong>ts.<br />

Le <strong>logiciel</strong> utilisé pour ces travaux est <strong>le</strong> <strong>logiciel</strong> ImageJ dont <strong>le</strong>s capacités et <strong>le</strong>s performances <strong>en</strong><br />

font l’outil indisp<strong>en</strong>sab<strong>le</strong> pour l’analyse des images. Ce travail nous a donc permis de réaliser<br />

l’appr<strong>en</strong>tissage de ce <strong>logiciel</strong> et de la programmation des macros utilisab<strong>le</strong>s dans ce contexte.<br />

Nous avons montré que <strong>le</strong> matériel utilisé dans <strong>le</strong> cadre de cette expéri<strong>en</strong>ce était de bonne qualité<br />

et relativem<strong>en</strong>t bi<strong>en</strong> réglé : peu de pixels mort, non uniformité relativem<strong>en</strong>t faib<strong>le</strong>. De sorte que<br />

<strong>le</strong>s images origina<strong>le</strong>s étai<strong>en</strong>t déjà de bonne qualité. Une amélioration significative des images<br />

nécessiterait un travail beaucoup plus important de quantimétrie : mesure de la non-linéarité,<br />

mesure de la PSF.<br />

Page 32


in2p3-00530281, version 1 - 28 Oct 2010<br />

A <strong>par</strong>tir du batch de 31 coup<strong>le</strong>s d’images (DPAI et H2AX) ; ce qui représ<strong>en</strong>te <strong>en</strong>viron une c<strong>en</strong>taine<br />

de noyaux cellulaires, nous avons mis au point une première macro d’analyse, écrite <strong>en</strong> langage<br />

ImageJ.<br />

L’efficacité de reconnaissance de cette macro est remarquab<strong>le</strong> lorsque l’on valide visuel<strong>le</strong>m<strong>en</strong>t <strong>le</strong>s<br />

résultats de la recherche de focis sur <strong>le</strong>s images origina<strong>le</strong>s. Cette macro nous a permis de découvrir<br />

<strong>le</strong>s difficultés inhér<strong>en</strong>tes à une analyse automatique d’une grande quantité d’images.<br />

En conclusion, ce travail précurseur à une plateforme d’exploitation et de traitem<strong>en</strong>t d’image dans<br />

<strong>le</strong> contexte du projet ROSIRIS nous a permis de compr<strong>en</strong>dre <strong>le</strong>s difficultés de ce type de projet Un<br />

modè<strong>le</strong> générique du processus comp<strong>le</strong>t du traitem<strong>en</strong>t des images, depuis l’acquisition des images<br />

jusqu’a l’interprétation fina<strong>le</strong> et l’évaluation des observab<strong>le</strong>s est représ<strong>en</strong>tée sur la figure (38).<br />

Figure (38) : Enchainem<strong>en</strong>t des étapes pour la reconstruction des foci<br />

Page 33


in2p3-00530281, version 1 - 28 Oct 2010<br />

Annexe A<br />

Microscope Olympus BX51<br />

Les schémas de microscope prés<strong>en</strong>tés dans cette annexe sont tirés de la docum<strong>en</strong>tation du<br />

constructeur, et illustr<strong>en</strong>t <strong>le</strong> fonctionnem<strong>en</strong>t du microscope Olympus BX51 équipé <strong>d'un</strong> bloc<br />

d'éclairage et des sources lumineuses pour <strong>le</strong> fonctionnem<strong>en</strong>t <strong>en</strong> transmission (tungstène-halogène)<br />

et <strong>en</strong> épifluorec<strong>en</strong>ce (arc à mercure). Pour ce dernier mode de fonctionnem<strong>en</strong>t, <strong>le</strong> microscope est<br />

équipé d’une tourel<strong>le</strong> de filtres de fluoresc<strong>en</strong>ce, logée à l'avant du bloc d'éclairage.<br />

Le principe fondam<strong>en</strong>tal de la <strong>microscopie</strong> de fluoresc<strong>en</strong>ce, est de visualiser des substances<br />

fluoresc<strong>en</strong>tes. Dans <strong>le</strong>s cellu<strong>le</strong>s, <strong>le</strong>s molécu<strong>le</strong>s non fluoresc<strong>en</strong>tes sont marquées <strong>par</strong> des substances<br />

appelées fluorochromes. Les molécu<strong>le</strong>s maint<strong>en</strong>ant fluoresc<strong>en</strong>tes sont excitées <strong>par</strong> une lumière<br />

dont la longueur d'onde excite directem<strong>en</strong>t <strong>le</strong> fluorophore. Ce fluorophore se désexcite <strong>en</strong> émettant<br />

alors de la lumière à une énergie plus basse. C'est <strong>le</strong> phénomène de fluoresc<strong>en</strong>ce.<br />

Les fluorochromes <strong>le</strong>s plus classiques sont la rhodamine et ses dérivés, la fluorescéine et ses dérivés<br />

et <strong>le</strong> DAPI. Ils émett<strong>en</strong>t respectivem<strong>en</strong>t dans <strong>le</strong> rouge, <strong>le</strong> vert et <strong>le</strong> b<strong>le</strong>u.<br />

La fluoresc<strong>en</strong>ce observée peut avoir plusieurs origines :<br />

Fluoresc<strong>en</strong>ce naturel<strong>le</strong> <strong>d'un</strong>e substance située dans la cellu<strong>le</strong>, exemp<strong>le</strong> : la chlorophyl<strong>le</strong><br />

fluoresce naturel<strong>le</strong>m<strong>en</strong>t <strong>en</strong> rouge.<br />

Utilisation <strong>d'un</strong>e substance fluoresc<strong>en</strong>te se fixant spécifiquem<strong>en</strong>t sur une structure. Par<br />

exemp<strong>le</strong>, <strong>le</strong> DAPI se fixe spécifiquem<strong>en</strong>t sur l'ADN et fluoresce <strong>en</strong> b<strong>le</strong>u.<br />

Utilisation <strong>d'un</strong>e substance non spécifique fluoresc<strong>en</strong>te naturel<strong>le</strong>m<strong>en</strong>t, exemp<strong>le</strong> : rhodamine<br />

et fluorescéine. Cette substance est fixée sur un anticorps spécifique <strong>d'un</strong> antigène. La<br />

spécificité est due à l'anticorps. La fluoresc<strong>en</strong>ce observée permet de localiser l'antigène.<br />

Un microscope à fluoresc<strong>en</strong>ce est un microscope photonique équipé de deux lampes, une lampe<br />

ordinaire pour une observation classique <strong>par</strong> transmission et une lampe à arc pour la fluoresc<strong>en</strong>ce.<br />

Un microscope équipé <strong>en</strong> épifluoresc<strong>en</strong>ceépifluorec<strong>en</strong>ce est pourvu de plusieurs jeux de filtres<br />

d'excitation permettant de choisir la longueur d'onde incid<strong>en</strong>te et des filtres d'émission (ou d'arrêt)<br />

permettant de sé<strong>le</strong>ctionner <strong>le</strong>s radiations émises <strong>par</strong> l'objet excité.<br />

L’utilisateur peut sé<strong>le</strong>ctionner une combinaison de la longueur d’onde de la lumière d’excitation et<br />

du spectre de la lumière d’émission qui est r<strong>en</strong>voyée vers <strong>le</strong> capteur (CCD) :<br />

Excitation dans l’ultravio<strong>le</strong>t (350 nm) - Emission dans <strong>le</strong> b<strong>le</strong>ue (450 nm)<br />

Excitation dans <strong>le</strong> b<strong>le</strong>ue (450 nm) - Emission dans <strong>le</strong> vert (550 nm)<br />

Excitation dans <strong>le</strong> vert (550 nm) - Emission dans <strong>le</strong> jaune (580 nm)<br />

Excitation dans l’orange (600 nm) - Emission dans <strong>le</strong> rouge (620 nm)<br />

Excitation dans <strong>le</strong> rouge (650 nm) - Emission dans l’infra rouge (690 nm)<br />

Les deux coupes suivantes montr<strong>en</strong>t <strong>le</strong>s chemins de la lumière, depuis la source lumineuse jusqu’au<br />

capteur final de la lumière émise <strong>par</strong> l’échantillon, dans deux cas :<br />

cas A : excitation dans <strong>le</strong> b<strong>le</strong>u (450 nm) et émission dans <strong>le</strong> vert (550 nm) ;<br />

cas B : excitation dans <strong>le</strong> vert (550 nm) et émission dans <strong>le</strong> jaune (580 nm)<br />

Nous prés<strong>en</strong>tons ci après trois exemp<strong>le</strong>s d'utilisation de la fluoresc<strong>en</strong>ce : choix du fluorochrome,<br />

caractéristiques optiques du fluorochrome, spectres des filtres et résultats <strong>d'un</strong>e expéri<strong>en</strong>ce.<br />

utilisation du TRITC (Tetra methyl Rhodamine Iso Thio Cyanate, dérivé de la Rhodamine)<br />

pour la fluoresc<strong>en</strong>ce rouge<br />

utilisation du FITC (Fluoresceine Iso Thio Cyanate, dérivé de la fluorescéine) pour la<br />

fluoresc<strong>en</strong>ce verte<br />

utilisation du DAPI (Di Aminido Ph<strong>en</strong>yl lndo, réactif spécifique de l'ADN) pour la fluoresc<strong>en</strong>ce<br />

b<strong>le</strong>ue<br />

Page 34


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (A-1) : Coupe du microscope Olympus BX51 <strong>en</strong> mode de fonctionnem<strong>en</strong>t<br />

épifluorec<strong>en</strong>ce. Les chemins de la lumière est prés<strong>en</strong>tée depuis la source lumineuse<br />

jusqu’au capteur final de la lumière émise <strong>par</strong> l’échantillon. A gauche excitation<br />

dans <strong>le</strong> b<strong>le</strong>u (450 nm) et émission dans <strong>le</strong> vert (550 nm) ; à droite excitation dans <strong>le</strong><br />

vert (550 nm) et émission dans <strong>le</strong> jaune (580 nm)<br />

Utilisation <strong>d'un</strong> fluorochrome à fluoresc<strong>en</strong>ce rouge<br />

Les colorants fluoresc<strong>en</strong>ts <strong>en</strong> rouge <strong>le</strong>s plus connus sont des dérivés de la rhodamine comme <strong>le</strong><br />

TRITC (Tetra methyl Rhodamine Iso Thio Cyanate). Comme <strong>le</strong> montre la figure suivante, la<br />

rhodamine absorbe <strong>le</strong>s radiations vertes (max 541nm) et restitue une fluoresc<strong>en</strong>ce rouge (max<br />

572nm).<br />

Le microscope doit être équipé <strong>d'un</strong> jeu de filtres correspondant aux caractéristiques du<br />

fluorochrome :<br />

1-un filtre d'excitation permettant la sé<strong>le</strong>ction des radiations absorbées de la radiation<br />

absorbée <strong>par</strong> <strong>le</strong> fluorochrome (ici autour de 541nm),<br />

2-un miroir dichroïque réfléchissant <strong>le</strong>s radiations absorbab<strong>le</strong>s vers l'échantillon et ne<br />

laissant passer <strong>par</strong> transmission que <strong>le</strong>s radiations rouges et au dessus (ici >580nm)<br />

3-un filtre d'émission ne laissant passer <strong>par</strong> transmission que <strong>le</strong>s radiations rouges et au<br />

dessus (>560nm).<br />

Le trajet de la radiation lumineuse est <strong>le</strong> suivant.<br />

Page 35


in2p3-00530281, version 1 - 28 Oct 2010<br />

Le filtre d'excitation<br />

sé<strong>le</strong>ctionne <strong>le</strong>s radiations<br />

spécifiques du<br />

fluorochrome...<br />

qui sont réfléchies <strong>par</strong> <strong>le</strong><br />

miroir et éclair<strong>en</strong>t<br />

l'échantillon...<br />

celui-ci émet <strong>le</strong>s radiations<br />

de fluoresc<strong>en</strong>ce qui seu<strong>le</strong>s<br />

atteign<strong>en</strong>t l'oculaire.<br />

Utilisation <strong>d'un</strong> fluorochrome à fluoresc<strong>en</strong>ce verte<br />

Les colorants fluoresc<strong>en</strong>ts <strong>en</strong> vert <strong>le</strong>s plus connus sont des dérivés de la fluorescéine comme <strong>le</strong> FITC<br />

(Fluorescéine Iso Thio Cyanate). Comme on <strong>le</strong> voit, la fluorescéine absorbe <strong>le</strong>s radiations /b<strong>le</strong>ues<br />

(max 490nm) et restitue une fluoresc<strong>en</strong>ce verte (max 520nm).<br />

Utilisation <strong>d'un</strong> fluorochrome à fluoresc<strong>en</strong>ce b<strong>le</strong>ue<br />

Les colorants fluoresc<strong>en</strong>ts <strong>en</strong> b<strong>le</strong>u sont nombreux. L'exemp<strong>le</strong> choisi est celui du DAPI (Di Aminido<br />

Ph<strong>en</strong>yl lndol) colorant utilisé <strong>en</strong> cytochimie et spécifique de l'ADN. Le DAPI (Di Aminido Ph<strong>en</strong>yl<br />

lndol) se fixe spécifiquem<strong>en</strong>t sur l'ADN. Eclairé <strong>en</strong> lumière vio<strong>le</strong>tte (max 372nm), il émet une<br />

fluoresc<strong>en</strong>ce b<strong>le</strong>ue (max 456nm). Comme on <strong>le</strong> voit, <strong>le</strong> DAPI absorbe <strong>le</strong>s radiations vio<strong>le</strong>ttes (max<br />

372nm) et restitue une fluoresc<strong>en</strong>ce b<strong>le</strong>ue (max 456nm).<br />

Page 36


in2p3-00530281, version 1 - 28 Oct 2010<br />

Annexe B<br />

Olympus DP70 Digital Camera System<br />

Le microscope Olympus BX51 est équipé d’une caméra numérique cou<strong>le</strong>ur Olympus DP70 refroidie,<br />

de 12.5 millions de pixel, qui incorpore <strong>le</strong>s dernières innovations technologiques. Le capteur DP70,<br />

représ<strong>en</strong>té sur la figure (A-2), utilise un CCD (Charge-Coup<strong>le</strong>d Device, ou dispositif à transfert de<br />

charge) <strong>avec</strong> filtration des cou<strong>le</strong>urs primaires (RVB).<br />

Figure (B-1) : Configuration du CCD Olympus DP70<br />

Naturel<strong>le</strong>m<strong>en</strong>t, ces capteurs sont s<strong>en</strong>sib<strong>le</strong>s à l'<strong>en</strong>semb<strong>le</strong> du spectre de la lumière visib<strong>le</strong>. Grâce à un<br />

filtre de Bayer, constitué de cellu<strong>le</strong>s colorées des cou<strong>le</strong>urs primaires, chaque photosite du capteur<br />

ne voit qu'une seu<strong>le</strong> cou<strong>le</strong>ur : rouge, vert ou b<strong>le</strong>u. Du fait de la précision requise, <strong>le</strong>s pastil<strong>le</strong>s<br />

colorées du filtre sont déposées directem<strong>en</strong>t sur <strong>le</strong> capteur <strong>avec</strong> une technologie proche de la<br />

photolithographie des circuits intégrés. Pour chaque canal, <strong>le</strong>s pixels abs<strong>en</strong>ts sont obt<strong>en</strong>us dans <strong>le</strong><br />

processus de restitution de l'image complète <strong>par</strong> interpolation.<br />

Figure (B-2) : Arrangem<strong>en</strong>t des filtres de cou<strong>le</strong>ur dans la configuration de Bayer<br />

Ce capteur CCD incorpore 1.45 million de pixels efficaces. Des images peuv<strong>en</strong>t être acquises à la<br />

résolution maximum de 4080 x 3072 pixels. La résolution du DP70 est de 12 bits, produisant des<br />

images <strong>en</strong> cou<strong>le</strong>ur de 36 bits RVB<br />

Anatomie d’un CCD<br />

Les dispositifs à couplage de charge (CCDs) sont des circuits intégrés silicium se composant <strong>d'un</strong>e<br />

matrice de photosite (photodiode) qui fonctionne <strong>par</strong> conversion de l’énergie incid<strong>en</strong>te sous forme<br />

de photons <strong>en</strong> une charge é<strong>le</strong>ctronique. Quand un photon dans la gamme du visib<strong>le</strong>, de l’ultra-vio<strong>le</strong>t<br />

ou de l’infrarouge heurte un atome de silicium, il produira habituel<strong>le</strong>m<strong>en</strong>t un é<strong>le</strong>ctron libre et un<br />

"trou" créé <strong>par</strong> l'abs<strong>en</strong>ce provisoire de l'é<strong>le</strong>ctron dans <strong>le</strong> réseau cristallin de silicium.<br />

Les é<strong>le</strong>ctrons produits <strong>par</strong> l'interaction des photons <strong>avec</strong> des atomes de silicium sont stockés dans<br />

un puits de pot<strong>en</strong>tiel maint<strong>en</strong>u à chaque photosite. Le nombre d'é<strong>le</strong>ctrons col<strong>le</strong>ctés est<br />

proportionnel à la quantité de lumière reçue.<br />

Le schéma de principe illustré sur la figure (B-3) montre <strong>le</strong>s divers composants qui compos<strong>en</strong>t<br />

l'anatomie <strong>d'un</strong> CCD typique.<br />

Page 37


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (B-3) : Anatomie d’un élém<strong>en</strong>t de la matrice d’un CCD typique<br />

Les différ<strong>en</strong>ts photosites sont isolés é<strong>le</strong>ctriquem<strong>en</strong>t de <strong>le</strong>urs voisines. Le dispositif architectural<br />

principal <strong>d'un</strong> CCD est donc une large matrice d’é<strong>le</strong>ctrodes (« portes ») formée d’une couche<br />

conductrice de polysilicium dopé, sé<strong>par</strong>é du substrat de silicium <strong>par</strong> une couche mince isolante de<br />

dioxyde de silicium.<br />

Système de transfert de charge<br />

À la fin de l'exposition, après que <strong>le</strong>s é<strong>le</strong>ctrons ai<strong>en</strong>t été col<strong>le</strong>ctés dans chaque photodiode de la<br />

matrice, <strong>le</strong>s charges sont transférées de photosite <strong>en</strong> photosite jusqu'à un système d’amplification<br />

et de sortie unique <strong>par</strong> <strong>le</strong> jeu de variations de pot<strong>en</strong>tiel cycliques appliquées aux gril<strong>le</strong>s.<br />

Ce décalage est accompli <strong>en</strong> changeant <strong>le</strong> pot<strong>en</strong>tiel du négatif du puits de pot<strong>en</strong>tiel, tout <strong>en</strong><br />

simultaném<strong>en</strong>t augm<strong>en</strong>tant la polarisation de la prochaine é<strong>le</strong>ctrode (porte) à une va<strong>le</strong>ur positive.<br />

Le substrat de silicium placé directem<strong>en</strong>t sous la porte devi<strong>en</strong>t alors un puits pot<strong>en</strong>tiel capab<strong>le</strong> de<br />

rassemb<strong>le</strong>r <strong>le</strong>s é<strong>le</strong>ctrons produits loca<strong>le</strong>m<strong>en</strong>t <strong>par</strong> la lumière incid<strong>en</strong>te. Les portes voisines aid<strong>en</strong>t à<br />

confiner des é<strong>le</strong>ctrons dans <strong>le</strong> puits de pot<strong>en</strong>tiel <strong>en</strong> formant des zones des pot<strong>en</strong>tiels plus é<strong>le</strong>vés<br />

<strong>en</strong>tourant <strong>le</strong> puits.<br />

Les charges sont transférées à travers chaque photodiode dans un processus utilisant des cyc<strong>le</strong>s<br />

plusieurs étapes comme <strong>le</strong> montre la figure (B-4).<br />

La vitesse de transfert est suffisamm<strong>en</strong>t rapide pour être accomplie au cours de la période<br />

d'intégration de charge pour la prochaine image.<br />

Le processus de transfert des charges est commandé <strong>par</strong> une série d'horloges qui opèr<strong>en</strong>t toutes <strong>le</strong>s<br />

portes simultaném<strong>en</strong>t dans la matrice, y compris <strong>le</strong>s portes de transfert <strong>en</strong>tre <strong>le</strong>s registres séries et<br />

<strong>par</strong>allè<strong>le</strong>s et <strong>le</strong>s portes de remise à zéro des photodiodes. Pour <strong>le</strong>s matrices de capteurs CCD, <strong>le</strong><br />

transfert de charge peut s’effectuer de trois manières :<br />

Système de transfert <strong>par</strong>allè<strong>le</strong>-série (capture p<strong>le</strong>ine trame) : Les cellu<strong>le</strong>s de la matrice<br />

sont couplées vertica<strong>le</strong>m<strong>en</strong>t et toutes <strong>le</strong>s lignes vertica<strong>le</strong>s sont transférées <strong>en</strong> <strong>par</strong>allè<strong>le</strong> dans<br />

un registre à décalage de <strong>le</strong>cture très rapide. Ce type de capteur nécessite un obturateur<br />

é<strong>le</strong>ctromécanique pour maint<strong>en</strong>ir la zone photos<strong>en</strong>sib<strong>le</strong> dans l'obscurité p<strong>en</strong>dant <strong>le</strong>s<br />

opérations de transfert.<br />

Système de transfert interligne : Le capteur compr<strong>en</strong>d une zone image <strong>en</strong>trelacée <strong>avec</strong><br />

des colonnes de stockage. A la fin de l’acquisition, <strong>le</strong>s charges stockées dans <strong>le</strong>s colonnes<br />

d’acquisition sont transférées dans <strong>le</strong>s colonnes de stockage. Le cont<strong>en</strong>u des colonnes de<br />

stockage est <strong>en</strong>suite transféré à la sortie vidéo selon un mode <strong>par</strong>allè<strong>le</strong>-série. Dans cette<br />

technique une faib<strong>le</strong> proportion de la surface du capteur est l’élém<strong>en</strong>t photos<strong>en</strong>sib<strong>le</strong><br />

proprem<strong>en</strong>t dit (10 à 20 %). Il est néanmoins possib<strong>le</strong> d’améliorer la s<strong>en</strong>sibilité <strong>en</strong> utilisant<br />

des micro-<strong>le</strong>ntil<strong>le</strong>s (--> amélioration jusqu’à x4)<br />

Système de transfert de trame : Dans la technique de transfert de trame <strong>le</strong>s colonnes<br />

d’acquisition et de stockage sont alignées vertica<strong>le</strong>m<strong>en</strong>t. Le principe reste <strong>le</strong> même que<br />

dans <strong>le</strong> cas précéd<strong>en</strong>t. Cette solution permet d’avoir des dynamiques é<strong>le</strong>vées, car la<br />

totalité de la zone image est photos<strong>en</strong>sib<strong>le</strong>. En revanche, ce système provoque des effets<br />

de traînage vertical important.<br />

Page 38


in2p3-00530281, version 1 - 28 Oct 2010<br />

Figure (B-4) : Transfert des charges de photosite <strong>en</strong> photosite <strong>par</strong> <strong>le</strong><br />

jeu de variations de pot<strong>en</strong>tiel cycliques appliquées aux gril<strong>le</strong>s<br />

(bandes conductrices horizonta<strong>le</strong>s, isolées <strong>en</strong>tre el<strong>le</strong>s <strong>par</strong> une<br />

couche de SiO2) jusqu'à un système d’amplification et de sortie<br />

unique.<br />

Page 39


in2p3-00530281, version 1 - 28 Oct 2010<br />

Annexe C<br />

Notions de Bruit dans <strong>le</strong>s CCD<br />

Le bruit, inhér<strong>en</strong>t à tout capteur d’images numériques, a de multip<strong>le</strong>s origines. Le rapport<br />

signal/bruit ( SNR ) est déterminant pour la qualité des mesures comme <strong>le</strong> montre la figure suivante.<br />

Figure (C-1) : Qualité d’une image de microscope à fluoresc<strong>en</strong>ce <strong>en</strong><br />

fonction du rapport signal/bruit ( SNR ).<br />

Le signal <strong>en</strong>registré <strong>par</strong> la caméra CCD est <strong>par</strong>asité <strong>par</strong> différ<strong>en</strong>ts bruits. Les bruits inhér<strong>en</strong>ts au CCD<br />

sont fortem<strong>en</strong>t dép<strong>en</strong>dant de sa structure interne et implique la compréh<strong>en</strong>sion du fonctionnem<strong>en</strong>t<br />

de celui-ci. Dans <strong>le</strong> cas du dispositif utilisé pour ces acquisitions, <strong>le</strong> CCD utilisé est l’Olympus DP70<br />

dont une brève description est donnée <strong>en</strong> annexe B. Les principaux bruits peuv<strong>en</strong>t être subdivisés<br />

<strong>en</strong> 3 catégories :<br />

Les bruits intrinsèques, produits <strong>par</strong> la chaîne de détection : Le CCD, <strong>le</strong>s divers étages<br />

d’amplification, <strong>le</strong>s circuits é<strong>le</strong>ctroniques, <strong>le</strong> numériseur, etc. Nous considérons uniquem<strong>en</strong>t<br />

au bruit thermique<br />

Les bruits externes, que nous limiterons ici au bruit de signal.<br />

Les bruits de traitem<strong>en</strong>t numérique des images.<br />

Ces trois bruits intervi<strong>en</strong>n<strong>en</strong>t dans <strong>le</strong> calcul du ratio signal/bruit.<br />

Bruits intrinsèques-Bruit thermique ( d )<br />

Dans un CCD, il existe un signal thermique, <strong>en</strong>core appe<strong>le</strong>r signal d’obscurité, qui a pour origine la<br />

génération thermique de porteurs qui vont s'accumu<strong>le</strong>r dans <strong>le</strong>s puits de pot<strong>en</strong>tiel au même titre<br />

que ceux produits <strong>par</strong> effet photoé<strong>le</strong>ctrique (signal). Il est possib<strong>le</strong> de <strong>le</strong> constater <strong>en</strong> plaçant <strong>le</strong><br />

CCD dans <strong>le</strong> noir comp<strong>le</strong>t p<strong>en</strong>dant quelques secondes <strong>par</strong> exemp<strong>le</strong>. Ce bruit dép<strong>en</strong>d fortem<strong>en</strong>t de la<br />

température, et varie proportionnel<strong>le</strong>m<strong>en</strong>t au temps de pose pour une température donnée.<br />

Bruits intrinsèques-Bruit de <strong>le</strong>cture ( g )<br />

Il existe éga<strong>le</strong>m<strong>en</strong>t un bruit de <strong>le</strong>cture qui vi<strong>en</strong>t du passage des charges des pixels vers la sortie du<br />

CCD. En effet une fois l'intégration achevée, <strong>le</strong>s charges accumulées sont transférées de proche <strong>en</strong><br />

proche dans <strong>le</strong>s registres du CCD. Malheureusem<strong>en</strong>t, à chaque transfert, une petite fraction des<br />

charges d’un pixel est perdue et récupérée <strong>par</strong> <strong>le</strong> pixel suivant. En moy<strong>en</strong>ne la fraction perdue<br />

dép<strong>en</strong>d du nombre de charges Ns cont<strong>en</strong>ues dans <strong>le</strong> pixel et de l'inefficacité de transfert .<br />

Le taux de charges laissées <strong>en</strong> arrière varie autour d’une va<strong>le</strong>ur moy<strong>en</strong>ne d’un transfert à l’autre.<br />

Le bruit associé à ce phénomène, <strong>en</strong> é<strong>le</strong>ctrons, est :<br />

2nN<br />

g s<br />

Ou n est <strong>le</strong> nombre de transferts nécessaires pour am<strong>en</strong>er <strong>le</strong>s charges d’un pixel donné dans<br />

l’étage de sortie. Le bruit de <strong>le</strong>cture est dû d'autre <strong>par</strong>t à la précision de l'amplification analogique.<br />

Ces deux quantités diminu<strong>en</strong>t quand la vitesse de <strong>le</strong>cture du CCD augm<strong>en</strong>te. Les CCD prés<strong>en</strong>t<strong>en</strong>t<br />

typiquem<strong>en</strong>t un bruit de <strong>le</strong>cture compris <strong>en</strong>tre 10 et 100 é<strong>le</strong>ctrons <strong>par</strong> pixel.<br />

Le bruit de <strong>le</strong>cture intervi<strong>en</strong>t une fois lors de chaque mesure de façon indép<strong>en</strong>dante ; pour cette<br />

raison, la somme de plusieurs images n'est pas équiva<strong>le</strong>nte à une seu<strong>le</strong> pose de la durée tota<strong>le</strong> des<br />

poses élém<strong>en</strong>taires.<br />

Page 40


in2p3-00530281, version 1 - 28 Oct 2010<br />

Bruits intrinsèques-Bruit de reset( r )<br />

Le principe de conversion des charges <strong>en</strong> t<strong>en</strong>sion dans l’étage de sortie d’un CCD est très<br />

spécifique.<br />

Dans un premier temps, une petite capacité est chargée à un niveau de référ<strong>en</strong>ce, puis dans<br />

un second temps <strong>le</strong> paquet de charges correspondant à un pixel décharge cette capacité<br />

d’une quantité proportionnel<strong>le</strong> au nombre d’é<strong>le</strong>ctrons cont<strong>en</strong>u dans <strong>le</strong> paquet.<br />

Vu de l’extérieur, <strong>le</strong> signal se prés<strong>en</strong>te donc sous la forme d’un palier dit de référ<strong>en</strong>ce<br />

correspondant au niveau de précharge, suivit d’un palier dit signal de va<strong>le</strong>ur négative <strong>par</strong><br />

rapport au palier de référ<strong>en</strong>ce.<br />

Le circuit é<strong>le</strong>ctronique intégré dans <strong>le</strong> CCD qui réalise la précharge n’assure<br />

malheureusem<strong>en</strong>t pas une amplitude du niveau de référ<strong>en</strong>ce rigoureusem<strong>en</strong>t éga<strong>le</strong> d’un<br />

pixel à l’autre.<br />

L’origine du problème est à rechercher dans <strong>le</strong> circuit résistif qui produit <strong>le</strong> courant de<br />

charge durant un bref instant, ce courant étant plus ou moins bruité <strong>en</strong> fonction de la<br />

température de fonctionnem<strong>en</strong>t (bruit dit Johnson), et dans <strong>le</strong>s couplages capacitifs.<br />

Après la précharge, <strong>le</strong> bruit est gelé, de même amplitude et de même signe sur <strong>le</strong> palier de<br />

référ<strong>en</strong>ce et <strong>le</strong> palier signal.<br />

La solution optima<strong>le</strong> pour mesurer <strong>le</strong> signal d’un pixel consiste donc à déterminer la différ<strong>en</strong>ce<br />

<strong>en</strong>tre ces deux paliers. Le fait de calcu<strong>le</strong>r (analogiquem<strong>en</strong>t ou numériquem<strong>en</strong>t) la différ<strong>en</strong>ce <strong>en</strong>tre<br />

<strong>le</strong> palier de référ<strong>en</strong>ce et <strong>le</strong> palier vidéo élimine complètem<strong>en</strong>t <strong>le</strong> bruit de reset compte t<strong>en</strong>u de la<br />

forte corrélation de ce bruit sur <strong>le</strong>s deux paliers. Cette tache incombe <strong>le</strong> plus souv<strong>en</strong>t à un circuit<br />

é<strong>le</strong>ctronique spécial (circuit CDS pour Correlated Doub<strong>le</strong> Sampling) ou év<strong>en</strong>tuel<strong>le</strong>m<strong>en</strong>t se limite à<br />

une opération arithmétique réalisée dans l’ordinateur.<br />

Bruits intrinsèques-Bruit effectif de l’amplificateur ( a )<br />

Les circuits é<strong>le</strong>ctroniques servant à conditionner, amplifier et numériser <strong>le</strong> signal vidéo apport<strong>en</strong>t<br />

<strong>le</strong>ur <strong>lot</strong> de bruit. Pour l’ess<strong>en</strong>tiel, <strong>le</strong> bruit de la chaîne é<strong>le</strong>ctronique de traitem<strong>en</strong>t vidéo provi<strong>en</strong>t du<br />

premier étage d’amplification et du convertisseur analogique/numérique.<br />

Dans une é<strong>le</strong>ctronique bi<strong>en</strong> conçue, <strong>le</strong> signal <strong>en</strong> sortie du CCD est rapidem<strong>en</strong>t amplifié. Ceci<br />

permet aux circuits qui suiv<strong>en</strong>t de travail<strong>le</strong>r <strong>avec</strong> de forts signaux, ce qui prévi<strong>en</strong>t dans une large<br />

mesure un apport supplém<strong>en</strong>taire de bruit dans <strong>le</strong> signal.<br />

Le bruit ram<strong>en</strong>é <strong>en</strong> <strong>en</strong>trée d’amplificateur, c’est <strong>en</strong> dire <strong>en</strong> sortie de CCD, s’obti<strong>en</strong>t <strong>en</strong> divisant <strong>par</strong><br />

<strong>le</strong> gain de l’amplificateur. Ce bruit est généra<strong>le</strong>m<strong>en</strong>t faib<strong>le</strong> <strong>par</strong> rapport à la contribution de<br />

nombreux autres facteurs de bruits (il est faci<strong>le</strong> de trouver des amplificateurs ayant un bruit de<br />

quelques nV/Hz seu<strong>le</strong>m<strong>en</strong>t).<br />

)<br />

Bruits intrinsèques-Bruit de quantification ( q<br />

Le bruit q associé au convertisseur analogique/numérique s’appel<strong>le</strong> <strong>le</strong> bruit de quantification. Il<br />

pr<strong>en</strong>d vie dès que l'on discrétise un signal continûm<strong>en</strong>t variab<strong>le</strong>. Il traduit l’approximation réalisée<br />

lors de l’opération de numérisation, une troncature <strong>en</strong> quelque sorte.<br />

Le bruit de quantification est l'erreur moy<strong>en</strong>ne commise <strong>en</strong> échantillonnant <strong>le</strong> signal analogique sur<br />

un nombre fini de pas d’ADC. L'écart-type de cette erreur vaut 1/ 12 <strong>en</strong> pas d’ADC.<br />

On a donc intérêt à coder <strong>le</strong> signal analogique sur un nombre é<strong>le</strong>vé de pas-codeurs, c'est à dire à<br />

coder <strong>le</strong> signal sur un grand nombre de bits (<strong>le</strong> nombre de pas-codeurs est 2 N , où N est <strong>le</strong> nombre<br />

de bits de l’ADC). Si g est <strong>le</strong> gain de la caméra <strong>en</strong> nombre d’é<strong>le</strong>ctrons <strong>par</strong> pas codeur, on montre<br />

que :<br />

Le gain g est égal à :<br />

<br />

q<br />

g<br />

12<br />

2 N<br />

E<br />

g <br />

GS Page 41


in2p3-00530281, version 1 - 28 Oct 2010<br />

Avec, E <strong>le</strong> signal de p<strong>le</strong>ine échel<strong>le</strong> à l'<strong>en</strong>trée du convertisseur <strong>en</strong> volt, G <strong>le</strong> gain d’amplificateur de<br />

la chaîne é<strong>le</strong>ctronique du signal vidéo, S la s<strong>en</strong>sibilité de l'étage de sortie du CCD <strong>en</strong> volt/e- et N<br />

<strong>le</strong> nombre de bits utilisés pour la numérisation.<br />

Le bruit de quantification sera d'autant moins important que <strong>le</strong> gain g sera de faib<strong>le</strong> va<strong>le</strong>ur.<br />

Norma<strong>le</strong>m<strong>en</strong>t, <strong>le</strong> concepteur de la caméra CCD optimise <strong>le</strong> nombre de bits de manière à ce que <strong>le</strong><br />

bruit soit quantifié sur quelques pas de quantification, <strong>en</strong>tre 2 et 5 pour fixer <strong>le</strong>s idées. De la sorte,<br />

on est sûr que la numérisation ne va masquer absolum<strong>en</strong>t aucune information uti<strong>le</strong> dans <strong>le</strong> signal.<br />

Bruit intrinsèque total du CCD<br />

Le bruit total est la moy<strong>en</strong>ne quadratique des différ<strong>en</strong>ts bruits <strong>en</strong>tachant <strong>le</strong> signal, car ceux-ci sont<br />

indép<strong>en</strong>dants. Il s'écrit :<br />

2 2 2 2 2 2<br />

t d g r a q<br />

Si nous faisons <strong>le</strong> récapitulatif des bruits intrinsèques de la caméra CCD, il ap<strong>par</strong>aît que <strong>le</strong>s sources<br />

principa<strong>le</strong>s de bruits sont <strong>le</strong> bruit thermique ( d ), <strong>le</strong> bruit de <strong>le</strong>cture ( g ) et év<strong>en</strong>tuel<strong>le</strong>m<strong>en</strong>t du<br />

bruit de transfert pour peu que <strong>le</strong>s pixels reçoiv<strong>en</strong>t du signal. Dans tous <strong>le</strong>s cas, <strong>le</strong> bruit de<br />

numérisation est négligeab<strong>le</strong> devant <strong>le</strong> bruit de <strong>le</strong>cture.<br />

Bruits externes-bruit de signal ( s )<br />

On peut limiter <strong>le</strong>s bruits externes au bruit de signal. En effet on pourrait ajouter dans cette<br />

catégorie <strong>le</strong>s bruits é<strong>le</strong>ctromagnétiques, dont <strong>le</strong>s sources peuv<strong>en</strong>t être un émetteur radio voisin du<br />

site d’observation, la propre alim<strong>en</strong>tation de la caméra, l’ordinateur lui-même, etc.<br />

Tous ces <strong>par</strong>asites sont captés <strong>par</strong> <strong>le</strong>s liaisons é<strong>le</strong>ctriques qui constitu<strong>en</strong>t l’é<strong>le</strong>ctronique de la<br />

caméra. On laisse de coté <strong>le</strong>s perturbations é<strong>le</strong>ctromagnétiques car <strong>le</strong>urs effets sont terrib<strong>le</strong>m<strong>en</strong>t<br />

dép<strong>en</strong>dants de l’<strong>en</strong>vironnem<strong>en</strong>t de la caméra et de la manière dont cel<strong>le</strong>-ci est conçue. On suppose<br />

ici que cette conception est suffisamm<strong>en</strong>t seine pour ne pas savoir ce type de problème (boîtier<br />

faisant office de bonne cage de Faraday, plan de masse du schéma é<strong>le</strong>ctronique correctem<strong>en</strong>t<br />

dessiné, alim<strong>en</strong>tations correctem<strong>en</strong>t filtrées, etc.).<br />

Du fait de la nature corpusculaire de la lumière, si dans un laps de temps donné nous comptons <strong>le</strong>s<br />

photons <strong>en</strong> prov<strong>en</strong>ance d’une source réputée stab<strong>le</strong> <strong>en</strong> moy<strong>en</strong>ne, nous n’obti<strong>en</strong>drons pas <strong>le</strong> même<br />

résultat d’une expéri<strong>en</strong>ce à l’autre.<br />

La variation du résultat <strong>par</strong> rapport à la moy<strong>en</strong>ne, est un bruit de Poisson. Si Np est <strong>le</strong> nombre de<br />

photons <strong>en</strong>registrés, <strong>le</strong> bruit de photons (ou « shot noise » <strong>en</strong> anglais) est :<br />

<br />

S<br />

Le bruit dép<strong>en</strong>d de l'int<strong>en</strong>sité de la source observée et du temps de pose. Le bruit de <strong>le</strong>cture est<br />

dominant aux courts temps de pose, et finit <strong>par</strong> dev<strong>en</strong>ir négligeab<strong>le</strong> devant <strong>le</strong> bruit thermique<br />

quand la pose s'allonge.<br />

Np<br />

Page 42


in2p3-00530281, version 1 - 28 Oct 2010<br />

Annexe D<br />

Listing du plugin de prétraitem<strong>en</strong>t<br />

« PLU_RGB_Avg_v3_java »<br />

Ce Plugin ImageJ a été écrit pour améliorer la qualité des images de <strong>microscopie</strong> <strong>par</strong> épifluorec<strong>en</strong>ce<br />

a <strong>par</strong>tir <strong>d'images</strong> de calibration, acquises <strong>en</strong> même temps que la prise des images des cellu<strong>le</strong>s. Ces<br />

images correspond<strong>en</strong>t à des acquisitions spécifiques, appelées : « offset », « dark », « flat-field »:<br />

« offset » : On fait une pose la plus brève possib<strong>le</strong>, dans l'obscurité tota<strong>le</strong> (obturateur fermé).<br />

« dark » : On va acquérir une image <strong>avec</strong> un temps de pose du même ordre de grandeur que l'image,<br />

<strong>en</strong> bloquant toute <strong>en</strong>trée de lumière qui pourrait arriver sur <strong>le</strong> CCD (obturateur fermé) et <strong>en</strong><br />

pr<strong>en</strong>ant <strong>le</strong> même temps d'exposition que cel<strong>le</strong> de l'image. L’image «dark» compr<strong>en</strong>d uniquem<strong>en</strong>t <strong>le</strong><br />

signal de bruit de fond é<strong>le</strong>ctronique de l'ap<strong>par</strong>eil. Donc lorsque <strong>le</strong> temps de pose augm<strong>en</strong>te, <strong>le</strong>s<br />

charges thermiques devi<strong>en</strong>n<strong>en</strong>t très importantes.<br />

« flat-field » ou « PLU » : Une dernière catégorie de bruits provi<strong>en</strong>t de la variation de s<strong>en</strong>sibilité<br />

des pixels du CCD et des défauts du système optique. Par exemp<strong>le</strong> <strong>le</strong>s poussières sur <strong>le</strong>s surfaces<br />

optiques peuv<strong>en</strong>t produire des ombres. De même <strong>le</strong>s variations de luminosité conduis<strong>en</strong>t à un<br />

vignettage (non-uniformité de l’int<strong>en</strong>sité de la lumière à l’intérieur du champ du microscope).<br />

L’image « flat-field » est utilisée pour iso<strong>le</strong>r et corriger des imperfections de la chaîne optique. On<br />

fait une pose longue sur une image de fluoresc<strong>en</strong>ce supposée uniforme <strong>en</strong> luminosité, <strong>avec</strong> la<br />

même mise au point que <strong>le</strong>s images. Cette image de référ<strong>en</strong>ce doit être obt<strong>en</strong>ue à <strong>par</strong>tir d’une<br />

lame cont<strong>en</strong>ant un film de colorant fluoresc<strong>en</strong>t, réputé uniforme, à défaut un objet uniformém<strong>en</strong>t<br />

fluoresc<strong>en</strong>t. La même configuration de filtre pour l’acquisition des images doit être utilisée<br />

.<br />

Utilisation de ce plugin:<br />

Ouvrir une ou plusieurs images « flat-field » de format TIFF codées <strong>en</strong> RGB cou<strong>le</strong>ur.<br />

Donner un nom pour créer <strong>le</strong> fichier log récapitulatif.<br />

Projection des « flat-field » pour obt<strong>en</strong>ir une image moy<strong>en</strong>ne et création des masques dans<br />

<strong>le</strong>s trois composantes de cou<strong>le</strong>ur.<br />

Choisir une image à corriger (condition d'acquisition conforme).<br />

Les composantes RGB sont corrigées indép<strong>en</strong>damm<strong>en</strong>t <strong>par</strong> <strong>le</strong>s trois masques RGB<br />

La stack des composantes RGB de l'image est fusionnée <strong>en</strong> une image RGB fina<strong>le</strong>.<br />

Contrô<strong>le</strong> de l'aspect de l'image corrigée.<br />

Pour des images <strong>en</strong> résolution 4080x3072, augm<strong>en</strong>ter la mémoire (Edit/Options/Memory=1500)<br />

Page 43


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

/*<br />

*/<br />

PLU_RGB_Avg_v3_.java<br />

Last update : 10/06/2010<br />

Plugin ImageJ ecrit pour ameliorer la qualite des images de<br />

<strong>microscopie</strong> <strong>par</strong> immunofluoresc<strong>en</strong>ce a <strong>par</strong>tir <strong>d'images</strong> de calibration.<br />

Usage:<br />

- Ouvrir une ou plusieurs images TIFF de PLU de type RGB cou<strong>le</strong>ur.<br />

- Donner un nom pour creer <strong>le</strong> fichier log recapitulatif.<br />

- Projection des PLU<br />

- Choisir une image a corriger (condition d'acquisition conforme).<br />

- Les composantes sont corrigees indep<strong>en</strong>damm<strong>en</strong>t.<br />

- La stack de l'image est fusionnee <strong>en</strong> une image RGB fina<strong>le</strong>.<br />

- Contro<strong>le</strong> de l'aspect de l'image corrigee.<br />

Pour des images <strong>en</strong> resolution 4080x3072, augm<strong>en</strong>ter la memoire (Edit/Options/Memory=1500)<br />

import ij.*;<br />

import ij.process.*;<br />

import ij.gui.*;<br />

import java.awt.*;<br />

import ij.plugin.filter.*;<br />

import ij.plugin.PlugIn;<br />

import ij.io.*;<br />

import javax.swing.*;<br />

import java.io.PrintWriter; // PrintWriter<br />

import ij.io.Fi<strong>le</strong>Saver;<br />

import java.io.*;<br />

import ij.plugin.RGBStackMerge; // RGB Splitter<br />

import ij.measure.*;<br />

import ij.process.ImageStatistics;<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

// Fi<strong>le</strong>Chooser<br />

import javax.swing.JFi<strong>le</strong>Chooser;<br />

import javax.swing.fi<strong>le</strong>chooser.Fi<strong>le</strong>Filter;<br />

import javax.swing.fi<strong>le</strong>chooser.Fi<strong>le</strong>NameExt<strong>en</strong>sionFilter;<br />

import ij.io.Op<strong>en</strong>er;<br />

// Utilities<br />

import java.util.ArrayList;<br />

import java.util.List;<br />

import java.util.Date;<br />

import java.text.DateFormat;<br />

import java.text.Simp<strong>le</strong>DateFormat;<br />

// Array of constantes (operator)<br />

import ij.plugin.ZProjector;<br />

// Use Logger in any java application<br />

import java.util.logging.*;<br />

// Use DecimalFormat<br />

import java.text.DecimalFormat;<br />

-1


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

// Convert Stack to RGB<br />

import ij.process.StackConverter;<br />

// classe des modè<strong>le</strong>s de cou<strong>le</strong>urs<br />

import java.awt.image.ColorModel;<br />

//import java.awt.image.Compon<strong>en</strong>tColorModel;<br />

import java.awt.image.IndexColorModel;<br />

import java.awt.image.DirectColorModel;<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

public class PLU_RGB_Avg_v3_ imp<strong>le</strong>m<strong>en</strong>ts PlugIn {<br />

//Static variab<strong>le</strong>s<br />

private int[] wList;<br />

static Fi<strong>le</strong> dir = null;<br />

static PrintWriter pw = null;<br />

private static int width, height;<br />

private int stackPLUSize;<br />

//Runtime variab<strong>le</strong>s<br />

ImageStack[] stacks = new ImageStack[3]; // R,G, B stacks<br />

//String directory = null;<br />

String wd = null; // working directory<br />

String strDirectory =<br />

"C:\\Imaging\\ImageJ\\plugins\\mesPluginsRosiris\\fibro_h2ax_100x_HR_9 (85x64)";<br />

String outputDir = null; // saving fi<strong>le</strong>s<br />

int debug; // debuging flag<br />

// declare and initialize array of channels<br />

String RGB[] = {"red", "gre<strong>en</strong>", "blue"};<br />

// Déclaration <strong>d'un</strong>e énumération<br />

<strong>en</strong>um <strong>en</strong>umRGB {R, G, B};<br />

// Get all the images from the se<strong>le</strong>cted channel<br />

ImagePlus[] rgbPLUmask = new ImagePlus[3];<br />

//ImagePlus[] rgbPLUmask = null;<br />

private int startSlice = 1; // Projection starts from this slice<br />

private int stopSlice = 1; // Projection <strong>en</strong>ds at this slice<br />

private int method = ZProjector.AVG_METHOD; // Average Stack<br />

private static String[] operators = {"Add","Subtract","Multiply","Divide"};<br />

private static String[] lcOperators = {"add","sub","mul","div"};<br />

private static int operator = 3; // default operator: 'div'<br />

private static boo<strong>le</strong>an doScaling = false;<br />

private String logname; // txt log fi<strong>le</strong> name<br />

public static Logger logger; // create a Logger object<br />

public static Fi<strong>le</strong>Hand<strong>le</strong>r fh; // the human readab<strong>le</strong> hand<strong>le</strong>r<br />

JTextField status = new JTextField("!"); // new text field<br />

static long start; // Chrono<br />

/*<br />

This method runs the plugin<br />

-2


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

*/<br />

public void run(String arg) {<br />

// Initialiaze plugin (op<strong>en</strong> log)<br />

if (!init_plugin()) {<br />

}<br />

//IJ.showMessage("Dialog LOG aborted", "STOP_PLUGIN");<br />

stop_plugin();<br />

return;<br />

// Add all op<strong>en</strong> images to a stack<br />

ImagePlus PLUImgStack = createStackPLU();<br />

if (PLUImgStack == null) { stop_plugin(); return; }<br />

// Perform the projection on PLU image constructs from a stack<br />

ImagePlus PLUImg = computePLUProjection(PLUImgStack);<br />

PLUImgStack.close(); // <strong>le</strong>s canaux ont ete projete.<br />

// int width/height for check all images size<br />

initParameters(PLUImg);<br />

// Op<strong>en</strong> dialog for PLU master (a 8-Bit Image)<br />

if (!showDialog(PLUImg)) { stop_plugin(); return; }<br />

PLUImg.show(); // display average flat-field after dialog<br />

// Creates red, gre<strong>en</strong> abd blue mask<br />

// Tous <strong>le</strong>s pixels de chaque canal de la PLU moy<strong>en</strong>ne projetee<br />

// vont etre divisee <strong>par</strong> la va<strong>le</strong>ur moy<strong>en</strong>ne du canal<br />

createMask(PLUImg); // <strong>le</strong>s 3 canaux de PLUImg sont divises <strong>par</strong> la moy<strong>en</strong>ne canal */<br />

// Op<strong>en</strong> the specified fi<strong>le</strong> as a tiff image and returns an ImagePlus object if successful.<br />

ImagePlus sci<strong>en</strong>ceImg = null;<br />

if ((sci<strong>en</strong>ceImg=op<strong>en</strong>Fi<strong>le</strong>()) == null) { stop_plugin(); return; }<br />

// Pour forcer une image cib<strong>le</strong> sans ouvrir de fi<strong>le</strong> chooser<br />

/*<br />

*/<br />

Op<strong>en</strong>er op<strong>en</strong>er = new Op<strong>en</strong>er();<br />

sci<strong>en</strong>ceImg = op<strong>en</strong>er.op<strong>en</strong>Image(strDirectory, "fibro_9.tif");<br />

if (sci<strong>en</strong>ceImg == null ) {<br />

}<br />

IJ.showMessage("Chargem<strong>en</strong>t de l'image", "Impossib<strong>le</strong>");<br />

return;<br />

sci<strong>en</strong>ceImg.show();<br />

// ImagePlus.getStatistics() method class to get the histogram.<br />

int[] histogram = sci<strong>en</strong>ceImg.getStatistics().histogram;<br />

// Apply correction with masks (PLUredmask, PLUgre<strong>en</strong>mask, PLUbluemask):<br />

// For each channel, multiply sci<strong>en</strong>ce image by PLU/mean<br />

// Creates a ImageStack("red"+"gre<strong>en</strong>"+"blue")<br />

// Converts this Stack to RGB<br />

applyCorrection(sci<strong>en</strong>ceImg);<br />

stop_plugin();<br />

-3


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

/*<br />

Creates and uses a log fi<strong>le</strong> for saving calculs<br />

*/<br />

boo<strong>le</strong>an init_plugin() {<br />

start = System.curr<strong>en</strong>tTimeMillis(); // Start chrono<br />

// Get the curr<strong>en</strong>t class<br />

String classNameMethodName = this.getClass().getName(); // Full class name<br />

wd = System.getProperty("user.dir");<br />

Fi<strong>le</strong> fi<strong>le</strong> = new Fi<strong>le</strong>(classNameMethodName+".txt");<br />

String logname = null;<br />

JFi<strong>le</strong>Chooser fc = new JFi<strong>le</strong>Chooser();<br />

fc.setSe<strong>le</strong>ctedFi<strong>le</strong>(fi<strong>le</strong>);<br />

// We want 'txt' ext<strong>en</strong>sion filter<br />

Fi<strong>le</strong>Filter filter =<br />

new Fi<strong>le</strong>NameExt<strong>en</strong>sionFilter("Text fi<strong>le</strong> (.log, .txt, .dat)",<br />

new String[] {"log", "txt", "dat"});<br />

fc.addChoosab<strong>le</strong>Fi<strong>le</strong>Filter(filter);<br />

fc.setDialogTit<strong>le</strong>("Se<strong>le</strong>ct a log fi<strong>le</strong>name");<br />

if (fc.showOp<strong>en</strong>Dialog(null) == JFi<strong>le</strong>Chooser.APPROVE_OPTION) {<br />

fi<strong>le</strong> = fc.getSe<strong>le</strong>ctedFi<strong>le</strong>();<br />

logname = fi<strong>le</strong>.getAbsolutePath();<br />

}<br />

else {<br />

System.out.println("Fi<strong>le</strong> chooser cancel button clicked");<br />

return false;<br />

}<br />

// Create log<br />

try {<br />

Fi<strong>le</strong>OutputStream fos = new Fi<strong>le</strong>OutputStream(logname/*strDirectory+logname*/);<br />

BufferedOutputStream bos = new BufferedOutputStream(fos);<br />

pw = new PrintWriter(bos);<br />

// Include the curr<strong>en</strong>t class nameit in a log.<br />

pw.println("Summary for plugin "+classNameMethodName+".java");<br />

pw.println( "");<br />

DateFormat dateFormat = new Simp<strong>le</strong>DateFormat("yyyy/MM/dd HH:mm:ss");<br />

Date date = new java.util.Date();<br />

String datetime = dateFormat.format(date);<br />

pw.println("Date/heure: " + datetime);<br />

pw.println("");<br />

// Display some useful information about this fi<strong>le</strong>.<br />

pw.println("Some useful information about log fi<strong>le</strong> "+fi<strong>le</strong>.getName());<br />

pw.println("getAbsolutePath : " + fi<strong>le</strong>.getAbsolutePath());<br />

pw.println("getName : " + fi<strong>le</strong>.getName());<br />

pw.println("getPar<strong>en</strong>t : " + fi<strong>le</strong>.getPar<strong>en</strong>t());<br />

pw.println("getPath : " + fi<strong>le</strong>.getPath());<br />

pw.println("isDirectory : " + fi<strong>le</strong>.isDirectory());<br />

-4


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

}<br />

pw.println("isFi<strong>le</strong> : " + fi<strong>le</strong>.isFi<strong>le</strong>());<br />

pw.println("isHidd<strong>en</strong> : " + fi<strong>le</strong>.isHidd<strong>en</strong>());<br />

pw.println("lastModified : " + new Date(fi<strong>le</strong>.lastModified()).toString());<br />

pw.println("<strong>le</strong>ngth : " + fi<strong>le</strong>.<strong>le</strong>ngth());<br />

pw.println("");<br />

}<br />

catch (IOException e) {<br />

IJ.log("" + e);<br />

System.exit(0);<br />

}<br />

//init_logging();<br />

// We would like to have a default directory name<br />

wd = fi<strong>le</strong>.getPar<strong>en</strong>t();<br />

return true;<br />

void stop_plugin() {<br />

if (pw==null) return; // case pw not initialized<br />

pw.println("elapsed time = " + IJ.d2s((System.curr<strong>en</strong>tTimeMillis()-start)/1000.0, 2)+<br />

" seconds");<br />

pw.flush();<br />

pw.close();<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

//stop_logging();<br />

public void init_logging() {<br />

op<strong>en</strong>Logger(strDirectory); // Op<strong>en</strong> log<br />

}<br />

public void stop_logging() {<br />

}<br />

/*<br />

// use the '<strong>le</strong>ast important' type of message<br />

logger.info("Logging done!");<br />

// C<strong>le</strong>ar the existing hand<strong>le</strong>r<br />

fh.flush();<br />

fh.close();<br />

logger.removeHand<strong>le</strong>r(fh);<br />

Op<strong>en</strong>s all the images and creates PLU stack of 8-bit images<br />

*/<br />

public ImagePlus createStackPLU() {<br />

// for "op<strong>en</strong> fi<strong>le</strong>" dialog<br />

JTextField fi<strong>le</strong>name = new JTextField();<br />

JTextField dir = new JTextField();<br />

//JFi<strong>le</strong>Chooser fi<strong>le</strong>Chooser = new JFi<strong>le</strong>Chooser("C:\\Imaging\\ImageJ\\plugins\\mesPluginsRosiris\\fibro_h2ax_100x_HR_9 (85x64)");<br />

JFi<strong>le</strong>Chooser fi<strong>le</strong>Chooser = new JFi<strong>le</strong>Chooser(wd);<br />

// get a list of all fi<strong>le</strong>s in a directory<br />

Fi<strong>le</strong>[] fi<strong>le</strong>s = null;<br />

-5


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

/*<br />

// Lignes a activer pour forcer une liste precise de fichiers PLU<br />

*/<br />

Fi<strong>le</strong> directory = new Fi<strong>le</strong>(strDirectory);<br />

fi<strong>le</strong>Chooser.setCurr<strong>en</strong>tDirectory(directory);<br />

// We want image ext<strong>en</strong>sion filters<br />

Fi<strong>le</strong>Filter filter =<br />

new Fi<strong>le</strong>NameExt<strong>en</strong>sionFilter("Image fi<strong>le</strong> (.tif, .tiff, .jpg, .jpeg, .gif, .png)",<br />

new String[] {"tif", "tiff", "jpg", "jpeg", "gif", "png"});<br />

fi<strong>le</strong>Chooser.addChoosab<strong>le</strong>Fi<strong>le</strong>Filter(filter);<br />

fi<strong>le</strong>Chooser.setMultiSe<strong>le</strong>ctionEnab<strong>le</strong>d(true);<br />

ArrayList listSe<strong>le</strong>ctedFi<strong>le</strong>s = new ArrayList();<br />

listSe<strong>le</strong>ctedFi<strong>le</strong>s.add(new Fi<strong>le</strong>(strDirectory, "fibro_PLU_1.tif"));<br />

listSe<strong>le</strong>ctedFi<strong>le</strong>s.add(new Fi<strong>le</strong>(strDirectory, "fibro_PLU_2.tif"));<br />

// Op<strong>en</strong> se<strong>le</strong>cted fi<strong>le</strong>s<br />

fi<strong>le</strong>Chooser.setSe<strong>le</strong>ctedFi<strong>le</strong>s((Fi<strong>le</strong>[])listSe<strong>le</strong>ctedFi<strong>le</strong>s.toArray(new Fi<strong>le</strong>[listSe<strong>le</strong>ctedFi<strong>le</strong>s.size()]));<br />

fi<strong>le</strong>s = fi<strong>le</strong>Chooser.getSe<strong>le</strong>ctedFi<strong>le</strong>s();<br />

pw.println("Curr<strong>en</strong>t directory: " + System.getProperty("user.dir"));<br />

//System.setProperty("user.dir", strDirectoy); // change CD<br />

//System.out.println("CD=" + System.getProperty("user.dir"));<br />

// We want image ext<strong>en</strong>sion filters<br />

Fi<strong>le</strong>Filter filter =<br />

new Fi<strong>le</strong>NameExt<strong>en</strong>sionFilter("Image fi<strong>le</strong> (.tif, .tiff, .jpg, .jpeg, .gif, .png)",<br />

new String[] {"tif", "tiff", "jpg", "jpeg", "gif", "png"});<br />

fi<strong>le</strong>Chooser.addChoosab<strong>le</strong>Fi<strong>le</strong>Filter(filter);<br />

fi<strong>le</strong>Chooser.setMultiSe<strong>le</strong>ctionEnab<strong>le</strong>d(true);<br />

fi<strong>le</strong>Chooser.setDialogTit<strong>le</strong>("Op<strong>en</strong> raw flat-field image(s)...");<br />

int retVal = fi<strong>le</strong>Chooser.showOp<strong>en</strong>Dialog(null);<br />

if (retVal == JFi<strong>le</strong>Chooser.CANCEL_OPTION) {<br />

pw.println("Op<strong>en</strong> fi<strong>le</strong> chooser command cancel<strong>le</strong>d by user.");<br />

}<br />

//logger.fine("Op<strong>en</strong> command cancel<strong>le</strong>d by user.");<br />

return null;<br />

// Op<strong>en</strong> se<strong>le</strong>cted fi<strong>le</strong>s<br />

fi<strong>le</strong>s = fi<strong>le</strong>Chooser.getSe<strong>le</strong>ctedFi<strong>le</strong>s();<br />

pw.println("You se<strong>le</strong>cted:");<br />

String[] fi<strong>le</strong>Names = new String[fi<strong>le</strong>s.<strong>le</strong>ngth];<br />

int i=0;<br />

whi<strong>le</strong> (i < fi<strong>le</strong>s.<strong>le</strong>ngth) {<br />

fi<strong>le</strong>Names[i] = fi<strong>le</strong>s[i].getPath();<br />

pw.println("\t" + fi<strong>le</strong>Names[i]);<br />

// check correct fi<strong>le</strong>name<br />

if (fi<strong>le</strong>Names[i] == null) return null;<br />

i++;<br />

}<br />

pw.println(i+" fi<strong>le</strong>(s) se<strong>le</strong>cted.");<br />

// check that there all images have the same width, height, and color model<br />

// Make sure the input image is a stack.<br />

if(fi<strong>le</strong>Names==null || fi<strong>le</strong>Names.<strong>le</strong>ngth


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

image");<br />

}<br />

return null;<br />

if (fi<strong>le</strong>Names==null) return null;<br />

ImageStack stackPLU = null; // temporary stack (arg for projImagePLU contructor)<br />

ImagePlus projImagePLU = null; // Image to hold z-projection<br />

doub<strong>le</strong> min = Doub<strong>le</strong>.MAX_VALUE;<br />

doub<strong>le</strong> max = -Doub<strong>le</strong>.MAX_VALUE;<br />

for (i=0; i


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

IJ.showMessage("outputDir: fi<strong>le</strong>s[0].getPar<strong>en</strong>tFi<strong>le</strong>()+Fi<strong>le</strong>.se<strong>par</strong>ator", outputDir+<br />

"\n"+fi<strong>le</strong>name);<br />

new Fi<strong>le</strong>Saver(projImagePLU).saveAsTiff("fi<strong>le</strong>name");<br />

}<br />

return projImagePLU;<br />

}<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

*/<br />

/*<br />

Performs the projection using the curr<strong>en</strong>t projection method.<br />

Calculates the values of pixels located at the same position<br />

in each slice of the stack<br />

<strong>par</strong>am imp: the ImagePlus object on which to perform the projection<br />

Return the resulting ImagePlus object (projection of stackPLU)<br />

ImagePlus computePLUProjection(ImagePlus PLUImgStack) {<br />

// Validate the argum<strong>en</strong>ts.<br />

if(PLUImgStack==null) { IJ.noImage(); return null; }<br />

stackPLUSize = PLUImgStack.getStackSize();<br />

if (stackPLUSize==0)<br />

throw new Il<strong>le</strong>galArgum<strong>en</strong>tException("Empty stack.");<br />

// Create an empty stack to hold the projections.<br />

// It will have the same width, height, and color model as stackPLU.<br />

ImageStack tmp_out_stack = PLUImgStack.createEmptyStack();<br />

// Initialize the ZProjector object.<br />

ZProjector zproj = new ZProjector(PLUImgStack);<br />

// Slices are numbered 1,2,...,n where n is the number of slices in the stack.<br />

startSlice = 1;<br />

stopSlice = stackPLUSize;<br />

zproj.setStartSlice(startSlice);<br />

zproj.setStopSlice(stopSlice);<br />

zproj.setMethod(method);<br />

// Check for RGB image (RGB stacks are supported)<br />

if(PLUImgStack.getBitDepth()==24 )<br />

zproj.doRGBProjection();<br />

else<br />

zproj.doProjection();<br />

// Image to hold z-projection<br />

ImagePlus projImage = null;<br />

// ImageJ retourne une l'image de la + rec<strong>en</strong>te operation de projection<br />

projImage = zproj.getProjection();<br />

// PROJECTION DONE<br />

ImageProcessor improc = projImage.getProcessor();<br />

tmp_out_stack.addSlice("Projection_of_"+PLUImgStack.getTit<strong>le</strong>(), improc);<br />

// Constructs an ImagePlus from a stack.<br />

ImagePlus out_image = new ImagePlus("Projection_of_"+PLUImgStack.getTit<strong>le</strong>(),<br />

tmp_out_stack);<br />

out_image.show();<br />

-8


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

// projection result Backup<br />

// PLU stack saved into ImagePlus object<br />

String fi<strong>le</strong>name = outputDir+out_image.getTit<strong>le</strong>()+"_("+ZProjector.METHODS[method]+<br />

"_projection).tif";<br />

new Fi<strong>le</strong>Saver(out_image).saveAsTiff(fi<strong>le</strong>name);<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

/*<br />

null);<br />

return out_image;<br />

Multiply each image channel by a mean of channel values<br />

*/<br />

public void createMask(ImagePlus PLUImg /* Stack des PLU moy<strong>en</strong>nees */) {<br />

// Checking<br />

if (PLUImg==null) {<br />

IJ.log("Unfortunately, image was null.");<br />

IJ.noImage(); return;<br />

}<br />

if ( (PLUImg.getType()!=ImagePlus.COLOR_RGB) || (PLUImg.getBitDepth()!=24) ) {<br />

IJ.showMessage("the plugin requires an RGB 24-bit image");<br />

return;<br />

}<br />

// Obtain an RGB image stack<br />

ImageStack is = PLUImg.getStack();<br />

pw.println("Entry createMask: "+is.getWidth()+"x"+is.getHeight()+"x"+is.getSize());<br />

// Splits an RGB image (or stack) into 3 8-bit graysca<strong>le</strong> images or stacks<br />

IJ.showStatus("Splits an RGB image into three 8-bit graysca<strong>le</strong> images");<br />

ImageStack rgbStack = splitStack(PLUImg);<br />

// rgbStack with 3 channels required<br />

if (rgbStack.getSize()!=3)<br />

{ IJ.error("Stack Required"); return; }<br />

String tit<strong>le</strong> = PLUImg.getTit<strong>le</strong>();<br />

pw.println("createMask PLUImg tit<strong>le</strong> = " + tit<strong>le</strong>);<br />

int slices = rgbStack.getSize(); // Returns the number of channels.<br />

pw.println("createMask Num. of slices "+ slices);<br />

DecimalFormat dec = new DecimalFormat("##0.0000");<br />

// Recuperer <strong>le</strong>s 3 slices correspondants aux canaux RGB<br />

// Iterate all slices (slices are 1


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

, rgbip);<br />

}<br />

/*<br />

//stats = rgbPLUmask[rgbcyc<strong>le</strong>].getStatistics();<br />

doub<strong>le</strong> mean, stdDev, hMin, hMax, binWidth;<br />

mean = stats.mean;<br />

stdDev = stats.stdDev;<br />

hMax = stats.max;<br />

hMin = stats.min;<br />

int nBins = stats.histogram.<strong>le</strong>ngth;<br />

// Means stats by Channel<br />

// [0] -> red Pixels, [1] -> gre<strong>en</strong> Pixels, [2] -> blue Pixels<br />

pw.println("\tMean of channel "+RGB[rgbcyc<strong>le</strong>]+ "\t= "+ dec.format(mean)+<br />

"\tnBins="+nBins+"\tstdDev="+dec.format(stdDev));<br />

/*******************************************************************************/<br />

/* Point operation: All pixels divided by a mean value (scalar multiplication) */<br />

/*******************************************************************************/<br />

rgbip = rgbip.convertToFloat(); // 32-bit conversion<br />

rgbip.multiply(1.0D/mean);<br />

rgbPLUmask[rgbcyc<strong>le</strong>] = new ImagePlus("Projection_of_Mask_PLU_("+RGB[rgbcyc<strong>le</strong>]+")"<br />

if (debug==1) {<br />

//rgbPLUmask[rgbcyc<strong>le</strong>].show();<br />

String fi<strong>le</strong>Name = outputDir+rgbPLUmask[rgbcyc<strong>le</strong>].getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(rgbPLUmask[rgbcyc<strong>le</strong>]).saveAsTiff(fi<strong>le</strong>Name);<br />

}<br />

} // <strong>en</strong>d rgbcyc<strong>le</strong><br />

Splits the specified RGB image or stack into a stack of three 8-bit images or stacks<br />

repres<strong>en</strong>ting the red, gre<strong>en</strong> and blue compon<strong>en</strong>ts of the original image.<br />

*/<br />

public ImageStack splitStack(ImagePlus imp) {<br />

ImageProcessor ip = imp.getProcessor();<br />

if (!(ip instanceof ColorProcessor)) {<br />

IJ.showMessage("Only RGB images are curr<strong>en</strong>tly supported.");<br />

return null;<br />

}<br />

// Split the RGB image or stack Channels into three 8-bit images<br />

RGBStackSplitter splitter = new RGBStackSplitter();<br />

// Method RGBStackSplitter.split(ImageStack rgb, boo<strong>le</strong>an keepSource)<br />

splitter.split(imp.getStack(), true);<br />

// Fetch the three stacks created by the split method<br />

ImagePlus red = new ImagePlus("Red", splitter.red); // stack red channel<br />

ImagePlus gre<strong>en</strong> = new ImagePlus("Gre<strong>en</strong>", splitter.gre<strong>en</strong>); // gre<strong>en</strong><br />

ImagePlus blue = new ImagePlus("Blue", splitter.blue); // blue<br />

// image stacks consist of images (slices)<br />

// access the stack by retrieving it from the ImagePlus using ImageStack getStack()<br />

ImageStack is = imp.getStack();<br />

ImageStack rgbStack = new ImageStack(is.getWidth(), is.getHeight());<br />

// color images can be decomposed into the se<strong>par</strong>ate 8-bit R,G and B graysca<strong>le</strong> images<br />

// using the Image > Color > RGB split function<br />

byte[] r,g,b;<br />

ColorProcessor cp; // ColorProcessor returns the se<strong>par</strong>ated RGB compon<strong>en</strong>ts<br />

-10


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

/*<br />

r = new byte[width*height];<br />

g = new byte[width*height];<br />

b = new byte[width*height];<br />

cp = (ColorProcessor)is.getProcessor(1);<br />

cp.getRGB(r,g,b);<br />

//rgbStack.de<strong>le</strong>teSlice(1); // de<strong>le</strong>te 'imp' stack<br />

rgbStack.addSlice(null,r);<br />

rgbStack.addSlice(null,g);<br />

rgbStack.addSlice(null,b);<br />

pw.println("Se<strong>par</strong>ating channels and creating RGB mask for " + imp.getTit<strong>le</strong>());<br />

pw.println("rgb stack size= "+rgbStack.getSize());<br />

// Return an 'ImageStack' rgbStack with se<strong>par</strong>ating channels<br />

return rgbStack;<br />

Apply correction on sci<strong>en</strong>ceImg with PLUredmask, PLUgre<strong>en</strong>mask and PLUbluemask)<br />

For each channel, multiply sci<strong>en</strong>ce image by PLU/mean<br />

Creates a ImageStack("red"+"gre<strong>en</strong>"+"blue")<br />

Converts this Stack to RGB<br />

Image/Color/Stack to RGB<br />

Cree une stack <strong>avec</strong> <strong>le</strong>s canaux R, G, B corriges<br />

Converts a 2 or 3-slice stack to an RGB image assuming that the slices are in R, G, B order.<br />

Equiva<strong>le</strong>nce M<strong>en</strong>u:<br />

"Image/Color/Channels Tool.../More>>/Convert to RGB"<br />

Equiva<strong>le</strong>nce Commande:<br />

IJ.doCommand("Stack to RGB"); // The stack must be 8-bit or 16-bit graysca<strong>le</strong>.<br />

*/<br />

void applyCorrection(ImagePlus sci<strong>en</strong>ceImg) {<br />

if (rgbPLUmask[0] == null || rgbPLUmask[1]== null|| rgbPLUmask[2]== null) {<br />

IJ.showMessage("Chargem<strong>en</strong>t de l'image", "Impossib<strong>le</strong>");<br />

return;<br />

}<br />

// Splits the specified RGB image or stack into three 8-bit graysca<strong>le</strong> images or stacks.<br />

RGBStackSplitter s = new RGBStackSplitter();<br />

s.split(sci<strong>en</strong>ceImg.getStack(), true);<br />

// Get fi<strong>le</strong>name without Ext<strong>en</strong>sion<br />

int index = sci<strong>en</strong>ceImg.getTit<strong>le</strong>().lastIndexOf('.');<br />

String tit<strong>le</strong> = sci<strong>en</strong>ceImg.getTit<strong>le</strong>().substring(0, index);<br />

ImagePlus sci<strong>en</strong>ceRedChannel = new ImagePlus(tit<strong>le</strong> + " (Red)", s.red);<br />

ImagePlus sci<strong>en</strong>ceGre<strong>en</strong>Channel = new ImagePlus(tit<strong>le</strong> + " (Gre<strong>en</strong>)", s.gre<strong>en</strong>);<br />

ImagePlus sci<strong>en</strong>ceBlueChannel = new ImagePlus(tit<strong>le</strong> + " (Blue)", s.blue);<br />

if (debug==1) {<br />

String fi<strong>le</strong>Name = null;<br />

//sci<strong>en</strong>ceRedChannel.show();<br />

fi<strong>le</strong>Name = outputDir+"splitter "+sci<strong>en</strong>ceRedChannel.getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(sci<strong>en</strong>ceRedChannel).saveAsTiff(fi<strong>le</strong>Name);<br />

//sci<strong>en</strong>ceGre<strong>en</strong>Channel.show();<br />

fi<strong>le</strong>Name = outputDir+"splitter "+sci<strong>en</strong>ceGre<strong>en</strong>Channel.getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(sci<strong>en</strong>ceGre<strong>en</strong>Channel).saveAsTiff(fi<strong>le</strong>Name);<br />

-11


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

//sci<strong>en</strong>ceBlueChannel.show();<br />

fi<strong>le</strong>Name = outputDir+"splitter "+sci<strong>en</strong>ceBlueChannel.getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(sci<strong>en</strong>ceBlueChannel).saveAsTiff(fi<strong>le</strong>Name);<br />

// For each channel, multiply sci<strong>en</strong>ce image by PLU/mean<br />

// Creates 3 "Corrected_" RGB images<br />

ImagePlus correctedRedChannel = doCorrection(sci<strong>en</strong>ceRedChannel, rgbPLUmask[0]);<br />

ImagePlus correctedGre<strong>en</strong>Channel = doCorrection(sci<strong>en</strong>ceGre<strong>en</strong>Channel, rgbPLUmask[1]);<br />

ImagePlus correctedBlueChannel = doCorrection(sci<strong>en</strong>ceBlueChannel, rgbPLUmask[2]);<br />

if (debug==1) {<br />

String fi<strong>le</strong>Name = null;<br />

}<br />

/*<br />

//correctedRedChannel.show();<br />

fi<strong>le</strong>Name = outputDir+correctedRedChannel.getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(correctedRedChannel).saveAsTiff(fi<strong>le</strong>Name);<br />

//correctedGre<strong>en</strong>Channel.show();<br />

fi<strong>le</strong>Name = outputDir+correctedGre<strong>en</strong>Channel.getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(correctedGre<strong>en</strong>Channel).saveAsTiff(fi<strong>le</strong>Name);<br />

//correctedBlueChannel.show();<br />

fi<strong>le</strong>Name = outputDir+correctedBlueChannel.getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(correctedBlueChannel).saveAsTiff(fi<strong>le</strong>Name);<br />

Lors de la conversion <strong>d'images</strong> 16-bit (<strong>en</strong>tier) ou 32-bit (réel) <strong>en</strong> image cou<strong>le</strong>ur,<br />

il y a toujours une perte d'information, puisque chaque canal <strong>d'images</strong> <strong>en</strong> cou<strong>le</strong>urs<br />

ne conti<strong>en</strong>t que 8 bits d'information (va<strong>le</strong>urs <strong>en</strong>tre 0 et 255) .<br />

Cette information est perdue et ne peut pas être récupérés <strong>en</strong> utilisant la cou<strong>le</strong>ur,<br />

<strong>le</strong> contraste, ou la luminosité.<br />

Malheureusem<strong>en</strong>t, c'est exactem<strong>en</strong>t la façon standard de produire des images <strong>en</strong> cou<strong>le</strong>ur<br />

à <strong>par</strong>tir <strong>d'images</strong> <strong>en</strong> niveaux de gris dans ImageJ, donc si des images <strong>avec</strong> plus<br />

de dynamique sont utilisées, el<strong>le</strong>s doiv<strong>en</strong>t toujours être dégradé <strong>en</strong> 8-bits avant<br />

d'être convertie <strong>en</strong> cou<strong>le</strong>urs RVB.<br />

*/<br />

// Do Stack conversions<br />

//---------------------<br />

// ImageProcessor convertion to 8-bit graysca<strong>le</strong><br />

// Construction <strong>d'un</strong>e stack <strong>d'images</strong> <strong>avec</strong> des va<strong>le</strong>urs réel<strong>le</strong>s<br />

ImageStack stack = new ImageStack(width, height); // former la stack a convertir <strong>en</strong> RGB<br />

stack.addSlice("red", correctedRedChannel.getProcessor());<br />

stack.addSlice("gre<strong>en</strong>", correctedGre<strong>en</strong>Channel.getProcessor());<br />

stack.addSlice("blue", correctedBlueChannel.getProcessor());<br />

// Constructs an ImagePlus from a stack.<br />

tit<strong>le</strong> = "ImageStack 32-bit (avant conversion)";<br />

ImagePlus imp_corrected = new ImagePlus(tit<strong>le</strong>, stack);<br />

if (debug==1) {<br />

String fi<strong>le</strong>Name = outputDir+imp_corrected.getTit<strong>le</strong>()+".tif";<br />

new Fi<strong>le</strong>Saver(imp_corrected).saveAsTiffStack(fi<strong>le</strong>Name);<br />

}<br />

/* 1. Quand la variab<strong>le</strong> doScaling == false:<br />

Tous <strong>le</strong>s pixels <strong>en</strong> dessous de la va<strong>le</strong>ur de certains niveaux de gris sont mises à 0<br />

et tous ceux qui figur<strong>en</strong>t au dessus de la va<strong>le</strong>ur maxima<strong>le</strong> (pour <strong>le</strong>s images 8-bit)<br />

-12


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

/*<br />

*/<br />

sont mis a cette va<strong>le</strong>ur maxima<strong>le</strong> qui est 255.<br />

Ca revi<strong>en</strong>t a effectuer un seuillage!<br />

2. Quand la variab<strong>le</strong> doScaling == true:<br />

Toute la plage des pixels est utilisee meme si min/max ne l'utilise pas<br />

Conversion <strong>en</strong> niveaux de gris 8-bit <strong>le</strong>s 3 image 32-bit graysca<strong>le</strong>.<br />

ImageJ convertit <strong>le</strong>s images 16-bit et 32-bit <strong>en</strong> 8-bit<br />

<strong>avec</strong> une echel<strong>le</strong> linéaire de min-max à 0-255,<br />

où min et max sont <strong>le</strong>s deux va<strong>le</strong>urs affichées dans<br />

"Image>Adjust>Brightness/Contrast".<br />

La commande "Image>Show Info" affiche ces deux va<strong>le</strong>urs comme plage d'affichage.<br />

REMARQUE :<br />

----------<br />

Cette ext<strong>en</strong>sion ne se fait pas si "Sca<strong>le</strong> Wh<strong>en</strong> Converting" n'est pas coché dans<br />

"Edit>Options>Conversions".<br />

Avec <strong>le</strong>s stacks, toutes <strong>le</strong>s slices sont sca<strong>le</strong>es a 8-bit <strong>en</strong> utilisant <strong>le</strong>s min et<br />

max de la slice <strong>en</strong> cours d'affichage.<br />

// Converts 32-bit graysca<strong>le</strong> to 8-bit graysca<strong>le</strong>.<br />

ImageProcessor ipr = correctedRedChannel.getProcessor().convertToByte(doScaling);<br />

correctedRedChannel.setProcessor(ipr);<br />

ImageProcessor ipg = correctedGre<strong>en</strong>Channel.getProcessor().convertToByte(doScaling);<br />

correctedGre<strong>en</strong>Channel.setProcessor(ipg);<br />

ImageProcessor ipb = correctedBlueChannel.getProcessor().convertToByte(doScaling);<br />

correctedBlueChannel.setProcessor(ipb);<br />

if (debug==1) {<br />

String fi<strong>le</strong>Name = null;<br />

String fi<strong>le</strong>NameExt<strong>en</strong>sion = "_convertToByte(sca<strong>le</strong>="+(doScaling?"true":"false")+<br />

").tif";<br />

fi<strong>le</strong>Name = outputDir+correctedRedChannel.getTit<strong>le</strong>()+fi<strong>le</strong>NameExt<strong>en</strong>sion;<br />

new Fi<strong>le</strong>Saver(correctedRedChannel).saveAsTiff(fi<strong>le</strong>Name);<br />

fi<strong>le</strong>Name = outputDir+correctedGre<strong>en</strong>Channel.getTit<strong>le</strong>()+fi<strong>le</strong>NameExt<strong>en</strong>sion;<br />

new Fi<strong>le</strong>Saver(correctedGre<strong>en</strong>Channel).saveAsTiff(fi<strong>le</strong>Name);<br />

fi<strong>le</strong>Name = outputDir+correctedBlueChannel.getTit<strong>le</strong>()+fi<strong>le</strong>NameExt<strong>en</strong>sion;<br />

new Fi<strong>le</strong>Saver(correctedBlueChannel).saveAsTiff(fi<strong>le</strong>Name);<br />

}<br />

/*<br />

if (debug==1) {<br />

}<br />

*/<br />

//correctedRedChannel.show();<br />

//correctedGre<strong>en</strong>Channel.show();<br />

//correctedBlueChannel.show();<br />

IJ.showMessage("Les 3 composantes RGB de la stack 32-bit ont ete converties <strong>en</strong> byte.");<br />

// Converts a 3 slices 8-bit stack to RGB.<br />

ImageStack redStack = new ImageStack(width,height);<br />

redStack.addSlice("redConvertToByte", correctedRedChannel.getProcessor());<br />

ImageStack gre<strong>en</strong>Stack = new ImageStack(width,height);<br />

gre<strong>en</strong>Stack.addSlice("gre<strong>en</strong>ConvertToByte", correctedGre<strong>en</strong>Channel.getProcessor());<br />

ImageStack blueStack = new ImageStack(width,height);<br />

-13


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

blueStack.addSlice("blueConvertToByte", correctedBlueChannel.getProcessor());<br />

// do stack conversions<br />

RGBStackMerge stackMerge = new RGBStackMerge();<br />

int d = redStack.getSize();<br />

boo<strong>le</strong>an keep = true;<br />

ImageStack stackRGB = stackMerge.mergeStacks(width, height, d, redStack, gre<strong>en</strong>Stack,<br />

blueStack, keep);<br />

ImagePlus correctRGBVersion = new ImagePlus("RGB result of "+sci<strong>en</strong>ceImg.getShortTit<strong>le</strong><br />

(), stackRGB);<br />

new Fi<strong>le</strong>Saver(correctRGBVersion).saveAsTiff(outputDir+"RGB result of "+sci<strong>en</strong>ceImg.<br />

getShortTit<strong>le</strong>()+" (sca<strong>le</strong>="+(doScaling?"true":"false")+").tif");<br />

correctRGBVersion.show();<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

/*<br />

IJ.run("Histogram");<br />

Do multiplication/division/addition/sousytaction of two images<br />

Call on each RVB channel<br />

Creates a "Corrected_" image<br />

*/<br />

public static ImagePlus doCorrection(ImagePlus imp1, ImagePlus imp2) {<br />

ImageProcessor ip1 = imp1.getProcessor(); // target processor ip1<br />

ImageProcessor ip2 = imp2.getProcessor(); // source processor ip2<br />

// 8-bit image contains pixels which values range from 0 to 255<br />

// If you have a pixel with a value of 200 and you multiply it by 3 it will become 255 not 600.<br />

// So, 32 bits conversion!<br />

// Take original image transform it into 32-bit (Image > Type > 32-bit)<br />

// Mathematic operation should not have under/overflow prob<strong>le</strong>ms<br />

ip1 = ip1.convertToFloat();<br />

ip2 = ip2.convertToFloat();<br />

ip1 = ip1.duplicate(); // Returns a duplicate of this image.<br />

try {<br />

if (ip1 instanceof ColorProcessor)<br />

IJ.showMessage("calculate", "Error : ip must be converted to float");<br />

switch (operator) {<br />

case 0: operator = Blitter.ADD; break;<br />

case 1: operator = Blitter.SUBTRACT; break;<br />

case 2: operator = Blitter.MULTIPLY; break;<br />

case 3: operator = Blitter.DIVIDE; break;<br />

}<br />

// Performs correction using specified method<br />

ip1.copyBits(ip2, 0, 0, operator);<br />

}<br />

catch (Il<strong>le</strong>galArgum<strong>en</strong>tException e) {<br />

IJ.error("My error " + imp1.getTit<strong>le</strong>() + ": " + e.getMessage());<br />

return null;<br />

}<br />

ImagePlus result = new ImagePlus("Corrected_32-bit_"+imp1.getTit<strong>le</strong>(), ip1);<br />

-14


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

}<br />

/*<br />

return result;<br />

Op<strong>en</strong> G<strong>en</strong>ericDialog for se<strong>le</strong>ct image fi<strong>le</strong>s<br />

*/<br />

private boo<strong>le</strong>an showDialog(ImagePlus imp) {<br />

width = imp.getWidth();<br />

height = imp.getHeight();<br />

// Conversion Options (/src/ij/plugin/Options.java)<br />

doub<strong>le</strong>[] weights = ColorProcessor.getWeightingFactors();<br />

boo<strong>le</strong>an weighted = !(weights[0]==1d/3d && weights[1]==1d/3d && weights[2]==1d/3d);<br />

G<strong>en</strong>ericDialog gd = new G<strong>en</strong>ericDialog("Plugin Options");<br />

String msg = "This plugin calibrates a RGB image from an average flat-field<br />

image.\n\n";<br />

gd.addMessage(msg);<br />

msg = "Number of images in flat-field sequ<strong>en</strong>ce: "+stackPLUSize;<br />

gd.addMessage(msg);<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

0);<br />

// Differ<strong>en</strong>t kinds of projections.<br />

msg = "Se<strong>le</strong>ct methods for producing average flat-field image:";<br />

gd.addMessage(msg);<br />

gd.addChoice("Projection Type", ZProjector.METHODS, ZProjector.METHODS[method]);<br />

msg = "Se<strong>le</strong>ct operator for calibration:";<br />

gd.addMessage(msg);<br />

gd.addChoice("Operation:", operators, operators[operator]);<br />

gd.addCheckbox("Sca<strong>le</strong> Wh<strong>en</strong> Converting", ImageConverter.getDoScaling());<br />

String prompt = "Weighted RGB Conversions";<br />

if (weighted)<br />

prompt+=" ("+IJ.d2s(weights[0])+","+IJ.d2s(weights[1])+","+IJ.d2s(weights[2])+")";<br />

gd.addCheckbox(prompt, weighted);<br />

gd.addNumericField("Save all images (Debug mode) (1) Display result only (0) ? ", 1,<br />

msg = "Saving images ("+width+"x"+height+") in output directory:\n "+outputDir;<br />

gd.addMessage(msg);<br />

gd.showDialog();<br />

if (gd.wasCance<strong>le</strong>d())<br />

return false;<br />

// Gets Projection methode<br />

method = gd.getNextChoiceIndex();<br />

// Gets Processing operator<br />

operator = gd.getNextChoiceIndex();<br />

// Gets do scaling option<br />

doScaling = gd.getNextBoo<strong>le</strong>an();<br />

ImageConverter.setDoScaling(doScaling);<br />

// Gets conversion option<br />

Prefs.weightedColor = gd.getNextBoo<strong>le</strong>an();<br />

if (!Prefs.weightedColor)<br />

ColorProcessor.setWeightingFactors(1d/3d, 1d/3d, 1d/3d);<br />

else if (Prefs.weightedColor && !weighted)<br />

ColorProcessor.setWeightingFactors(0.299, 0.587, 0.114);<br />

// Asking for debug mode<br />

-15


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

/*<br />

String sPrompt = "Debug mode ? ";<br />

// debug = 1: Running in mode debug<br />

debug = (int)(gd.getNextNumber());<br />

pw.println("Method se<strong>le</strong>cted: " + ZProjector.METHODS[method]);<br />

pw.println("operator se<strong>le</strong>cted: " + operators[operator]);<br />

pw.println("Scaling: " + (ImageConverter.getDoScaling()?"true":"false"));<br />

pw.println("weighted color: " + (Prefs.weightedColor?"true":"false"));<br />

int size = width * height;<br />

int nSlices = imp.getStackSize();<br />

pw.println("Sci<strong>en</strong>ce Image Size ("+width+"x"+height+") = "+size);<br />

pw.println("num Slices = " + nSlices);<br />

pw.println("number of channels = " + imp.getNChannels()); // the number of channels.<br />

pw.println("number of slices = " + imp.getNSlices());<br />

pw.println("number of frames = " + imp.getNFrames());<br />

pw.println("");<br />

IJ.showStatus("Saving log...");<br />

return true;<br />

The method showAbout displays an about dialog.<br />

*/<br />

void showAbout() {<br />

IJ.showMessage("PLU_RGB_avg version 3");<br />

}<br />

/*<br />

Display a fi<strong>le</strong> op<strong>en</strong> dialog, gets the directory and fi<strong>le</strong> name the user has se<strong>le</strong>cted.<br />

If the user has cancel<strong>le</strong>d, we return. Otherwise a non-nullimage is returned.<br />

*/<br />

public static ImagePlus op<strong>en</strong>Fi<strong>le</strong>() {<br />

// Op<strong>en</strong> the specified fi<strong>le</strong> as a tiff image and returns an ImagePlus object if successful.<br />

Op<strong>en</strong>Dialog od = new Op<strong>en</strong>Dialog("Se<strong>le</strong>ct TIFF fi<strong>le</strong>", null);<br />

// check that any TIFF fi<strong>le</strong> was se<strong>le</strong>cted<br />

String dirname = od.getDirectory(); // Returns the se<strong>le</strong>cted directory<br />

if (null == dirname) return null; // dialog was cance<strong>le</strong>d<br />

dirname = dirname.replace('\\', '/'); // Windows safe<br />

if (!dirname.<strong>en</strong>dsWith("/")) dirname += "/";<br />

String fi<strong>le</strong>name = od.getFi<strong>le</strong>Name(); // Returns the se<strong>le</strong>cted fi<strong>le</strong> name<br />

if (null == fi<strong>le</strong>name) {<br />

return null;<br />

} else if (!fi<strong>le</strong>name.<strong>en</strong>dsWith(".tif")) {<br />

IJ.showMessage("Not a TIFF fi<strong>le</strong>!");<br />

return null;<br />

}<br />

// Show path<br />

IJ.showStatus("Loading TIFF Fi<strong>le</strong>: " + dirname + fi<strong>le</strong>name);<br />

pw.println("directory = " + dirname);<br />

pw.println("fi<strong>le</strong>name = " + fi<strong>le</strong>name);<br />

Fi<strong>le</strong> fi<strong>le</strong> = new Fi<strong>le</strong>(dirname, fi<strong>le</strong>name);<br />

-16


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

if (!fi<strong>le</strong>.exists()) {<br />

pw.println("Fi<strong>le</strong> " + fi<strong>le</strong> + " does not exist.");<br />

return null;<br />

}<br />

Op<strong>en</strong>er op<strong>en</strong>er = new Op<strong>en</strong>er();<br />

ImagePlus img = op<strong>en</strong>er.op<strong>en</strong>Image(fi<strong>le</strong>.getPar<strong>en</strong>t(), fi<strong>le</strong>.getName());<br />

if (img.getWidth()!=width && img.getHeight()!=height) {<br />

IJ.showMessage("Dim<strong>en</strong>sions incompatib<strong>le</strong>s", "Hauteurs et/ou largeurs PLU/Image<br />

differ<strong>en</strong>tes!");<br />

return null;<br />

}<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

/*<br />

*/<br />

Fi<strong>le</strong>Info fi = img.getFi<strong>le</strong>Info();<br />

if (fi==null)<br />

return null;<br />

pw.println();<br />

pw.println("-------IJTiffTest results-------");<br />

pw.println("Details for result image "+dirname+fi<strong>le</strong>name);<br />

pw.println(fi);<br />

pw.println("info=" + fi.info);<br />

pw.println("description=" + fi.description);<br />

IJ.showStatus("");<br />

return img;<br />

to use Logger in any java application<br />

// Set the human readab<strong>le</strong> hand<strong>le</strong>r<br />

public void op<strong>en</strong>Logger(String directory) {<br />

// typically use one logger per class<br />

logger = Logger.getLogger(PLU_RGB_Avg_v3_.class.getName());<br />

fh = null;<br />

try {<br />

// Get the curr<strong>en</strong>t class<br />

String classNameMethodName = this.getClass().getName(); // Full class name<br />

// This block configure the logger with hand<strong>le</strong>r and formatter<br />

//fh = new Fi<strong>le</strong>Hand<strong>le</strong>r("C:\\Imaging\\ImageJ\\plugins\\Innotep_\\"+classNameMethodName+".log", true);<br />

fh = new Fi<strong>le</strong>Hand<strong>le</strong>r(directory+classNameMethodName+".log", true);<br />

logger.addHand<strong>le</strong>r(fh);<br />

logger.setLevel(Level.ALL);<br />

Simp<strong>le</strong>Formatter formatter = new Simp<strong>le</strong>Formatter();<br />

//fh.setFormatter(new XMLFormatter());<br />

fh.setFormatter(formatter);<br />

// the following statem<strong>en</strong>t is used to log any messages<br />

logger.log(Level.WARNING,"My log");<br />

} catch (SecurityException e) {<br />

e.printStackTrace();<br />

} catch (IOException e) {<br />

e.printStackTrace();<br />

}<br />

logger.severe("my severe message");<br />

-17


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\PLU_RGB_Avg_v3_.java jeudi 22 juil<strong>le</strong>t 2010 16:22<br />

}<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

logger.warning("my warning message");<br />

logger.info("my info message");<br />

public void initParameters(ImagePlus imp) {<br />

width = imp.getWidth();<br />

height = imp.getHeight();<br />

}<br />

-18


in2p3-00530281, version 1 - 28 Oct 2010<br />

Annexe E<br />

Listing de la Macro d’analyse<br />

« Macro_GM_CCQ_v9 »<br />

Cette macro simplifie la tache de comptage des foci <strong>par</strong> noyau et de mesure des caractéristiques<br />

des foci dans des cellu<strong>le</strong>s marquées au DAPI et au H2AX <strong>par</strong> l'analyse des images de cellu<strong>le</strong>s de<br />

fibroblaste irradiées à l'ESRF<br />

Les images des masques, <strong>le</strong>s ROI et des foci repérés sont stockés dans une pi<strong>le</strong>. Une boite de<br />

dialogue demande un dossier cont<strong>en</strong>ant deux sous-dossiers obligatoirem<strong>en</strong>t nommés DAPI et H2AX<br />

pour automatiser <strong>le</strong>s traitem<strong>en</strong>ts et répéter <strong>le</strong>s mesures.<br />

Les images Tiff, (DAPI et H2AX), à analyser doiv<strong>en</strong>t être triées dans <strong>le</strong> même ordre pour<br />

être ap<strong>par</strong>iées correctem<strong>en</strong>t lors de l'analyse,<br />

On exécute la macro <strong>par</strong> la touche [g] ou dans "Plugins>Macros>Run",<br />

El<strong>le</strong> bouc<strong>le</strong> sur l'<strong>en</strong>semb<strong>le</strong> des images des deux répertoires,<br />

La macro propose automatiquem<strong>en</strong>t une sé<strong>le</strong>ction pour chaque noyau analysé: l’opérateur<br />

doit accepter ou rejeter la sé<strong>le</strong>ction. ==> 'Yes' ajoute la sé<strong>le</strong>ction au « ROI manager », 'No'<br />

la supprime.<br />

Les sé<strong>le</strong>ctions sont r<strong>en</strong>ommées (préfixe "Cell_"),<br />

En fin d'analyse, <strong>le</strong>s résultats sont sauvés dans <strong>le</strong> répertoire <strong>par</strong><strong>en</strong>t:<br />

- Les sé<strong>le</strong>ctions (ROI) sont sauvegardées dans <strong>le</strong>s fichiers de type « zip » (Qu’el<strong>le</strong>s<br />

soi<strong>en</strong>t multip<strong>le</strong>s ou unique).<br />

- Les résultats des analyses des foci <strong>par</strong> noyau (mesures de surface, périmètre,<br />

position…) sont placés dans <strong>le</strong>s fichiers de type « xls »<br />

- Les pi<strong>le</strong>s <strong>d'images</strong> mémoris<strong>en</strong>t <strong>le</strong>s masques ayant servis à la quantification.<br />

Page 44


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

// Macro_GM_CCQ_v7.txt<br />

// Macro_convex_hull_distribution.txt (video)<br />

// Last uUpdate : 21/07/2010<br />

/**<br />

*Cette macro simplifie la tache de comptage des focis <strong>par</strong> noyau et de mesure<br />

*des caracteristiques des focis dans des cellu<strong>le</strong>s marques au DAPI et au H2AX.<br />

*Les images de masque, <strong>le</strong>s ROI et des focis reperes sont stockes dans une stack.<br />

*Une boite de dialogue demande un dossier cont<strong>en</strong>ant deux sous-dossiers *obligatoirem<strong>en</strong>t*<br />

*nommes DAPI et H2AX pour automatiser <strong>le</strong>s traitem<strong>en</strong>ts et repeter <strong>le</strong>s mesures.<br />

*<br />

* @auteurs Frederic Chandez &G Montarou<br />

*/<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

macro "Macro_GM_CCQ_v9" {<br />

// Realise l'analyse (surface, position, <strong>en</strong> pixels) des images de cellu<strong>le</strong>s de fibroblaste irradiées à l'ESRF<br />

// Instructions:<br />

// - Dans un repertoire quelconque, creer 2 dossiers appe<strong>le</strong>s 'DAPI' et 'H2AX' cont<strong>en</strong>ant <strong>le</strong>s images à analyser.<br />

// - Les images Tiff, (DAPI et H2AX), à analyser doiv<strong>en</strong>t etre triees dans <strong>le</strong> meme ordre pour etre ap<strong>par</strong>iees correctem<strong>en</strong>t lors de l'analyse<br />

// - Lancer la macro <strong>par</strong> la touche [g] ou dans "Plugins>Macros>Run".<br />

// El<strong>le</strong> bouc<strong>le</strong> sur l'<strong>en</strong>semb<strong>le</strong> des images des deux repertoires.<br />

// - La macro propose automatiquem<strong>en</strong>t une se<strong>le</strong>ction pour chaque noyau analysé:<br />

// . Accepter ou rejeter la se<strong>le</strong>ction. ==> 'Yes' ajoute la se<strong>le</strong>ction au ROI manager, 'No' la supprime.<br />

// . Les se<strong>le</strong>ctions sont r<strong>en</strong>ommees (prefixe "Cell_")<br />

// - En fin d'analyse, <strong>le</strong>s resultats sont sauvés dans <strong>le</strong> repertoire <strong>par</strong><strong>en</strong>t:<br />

// . Les se<strong>le</strong>ctions (ROI) sont sauvees dans <strong>le</strong>s fichiers termines <strong>en</strong> '.zip'. (qu'el<strong>le</strong>s soi<strong>en</strong>t multip<strong>le</strong> ou unique).<br />

// . Les resultats des analyses (mesures de surface, perimetre, position et ratio divers) des focis <strong>par</strong> noyau sont places dans <strong>le</strong>s fichiers .xls<br />

// . Les stack <strong>d'images</strong> memoris<strong>en</strong>t <strong>le</strong>s masques ayant servis à la quantification.<br />

requires("1.44c");<br />

version = "9";<br />

FS = Fi<strong>le</strong>.se<strong>par</strong>ator();<br />

print("\\C<strong>le</strong>ar");<br />

// Définition des repertoires de travail (images DAPI et H2AX)<br />

dir = getDirectory("Choisir <strong>le</strong> repertoire racine de ss-repertoires DAPI et H2AX :");<br />

working_path = dir;<br />

print("\nRepertoire de travail:\n " + working_path);<br />

// Definition du chemin du sous repertoire des images DAPI<br />

DAPI_path = working_path + "DAPI" + FS; print("Dossier image DAPI:\n " + DAPI_path);<br />

// Extraction des fichiers prés<strong>en</strong>ts dans <strong>le</strong> repertoire DAPI<br />

fi<strong>le</strong>ListDAPI = getFi<strong>le</strong>List(DAPI_path);<br />

// Definition du chemin du directory H2AX<br />

H2AX_path = working_path + "H2AX" + FS; print("Dossier image H2AX:\n " + H2AX_path);<br />

// Extraction des fichiers prés<strong>en</strong>ts dans <strong>le</strong> repertoire H2AX<br />

fi<strong>le</strong>ListH2AX = getFi<strong>le</strong>List(H2AX_path);<br />

// Test de la longueur des pi<strong>le</strong>s <strong>d'images</strong> DAPI et H2AX<br />

// Si nombre de fichiers DAPI et H2AX differ<strong>en</strong>ts ==> erreur<br />

if (fi<strong>le</strong>ListDAPI.<strong>le</strong>ngth != fi<strong>le</strong>ListH2AX.<strong>le</strong>ngth) {<br />

showMessage("Cette macro necessite des coup<strong>le</strong>s <strong>d'images</strong>",<br />

-1


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

}<br />

exit();<br />

"Nombre de fichiers DAPI et H2AX differ<strong>en</strong>ts!");<br />

// Definition des <strong>par</strong>ametres <strong>par</strong> default pour la recherche des noyaux et des foci<br />

MIN_DAPI_THRESH = 10000; // tail<strong>le</strong> minimum noyau ==> <strong>en</strong> pixel<br />

COUNT_DAPI_THRESH = 0.00; // circularite minimum de la forme des noyaux<br />

MIN_FOCI_THRESH = 10; // tail<strong>le</strong> minimum foci ==> <strong>en</strong> pixel<br />

COUNT_FOCI_THRESH = 0.00; // circularite minimum de la forme des foci<br />

msg = ""+fi<strong>le</strong>ListDAPI.<strong>le</strong>ngth+" coup<strong>le</strong>(s) <strong>d'images</strong> Dapi/H2ax a analyser...";<br />

// Ouverture <strong>d'un</strong>e boite de dialogue ImageJ permettant d'afficher <strong>le</strong>s <strong>par</strong>ametres de se<strong>le</strong>ction<br />

// des zones de noyau <strong>en</strong> DAPI et des focis <strong>en</strong> H2AX<br />

Dialog.create("<strong>Analyse</strong> de cellu<strong>le</strong>s fibroblaste V."+version);<br />

Dialog.addMessage("Choix des <strong>par</strong>ametres 'Analyze <strong>par</strong>tic<strong>le</strong>s'");<br />

Dialog.addNumber("Tail<strong>le</strong> minimum du noyau (<strong>en</strong> pixel):", MIN_DAPI_THRESH);<br />

Dialog.addNumber("Circularite minimum du noyau:", COUNT_DAPI_THRESH);<br />

Dialog.addNumber("Tail<strong>le</strong> minimum <strong>d'un</strong> foci (<strong>en</strong> pixel):", MIN_FOCI_THRESH);<br />

Dialog.addNumber("Circularite minimum <strong>d'un</strong> foci:", COUNT_FOCI_THRESH);<br />

Dialog.addMessage(msg);<br />

Dialog.addHelp("http://<strong>imagej</strong>docu.tudor.lu/doku.php?id=macro:roi_color_coder");<br />

Dialog.show();<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

// Saisie des différ<strong>en</strong>ts <strong>par</strong>amètres de se<strong>le</strong>ction<br />

MIN_DAPI_THRESH = Dialog.getNumber();<br />

COUNT_DAPI_THRESH = Dialog.getNumber();<br />

MIN_FOCI_THRESH = Dialog.getNumber();<br />

COUNT_FOCI_THRESH = Dialog.getNumber();<br />

// Initialisation des <strong>par</strong>ametres pour l'histogramme des frequ<strong>en</strong>ces de foci <strong>par</strong> noyau<br />

maxFociByNuc<strong>le</strong>i=500;<br />

cumFreq = newArray(maxFociByNuc<strong>le</strong>i);<br />

nbTotalNuc<strong>le</strong>i=0; // Stocke <strong>le</strong> nombre total de noyaux ret<strong>en</strong>u<br />

print("");<br />

print("Tail<strong>le</strong> minimum noyau : "+MIN_DAPI_THRESH+"-infini");<br />

print("Circularite minimum : "+COUNT_DAPI_THRESH+"-1.00");<br />

print("Tail<strong>le</strong> minimum foci : "+MIN_FOCI_THRESH+"-infini");<br />

print("Circularite minimum : "+COUNT_FOCI_THRESH+"-1.00");<br />

// Nombre de coup<strong>le</strong> <strong>d'images</strong> DAPI et H2AX associées<br />

num_of_associations = fi<strong>le</strong>ListDAPI.<strong>le</strong>ngth;<br />

// Bouc<strong>le</strong> principa<strong>le</strong> sur <strong>le</strong>s coup<strong>le</strong>s <strong>d'images</strong><br />

for (i=0; i


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

// Ouverture Image DAPI<br />

op<strong>en</strong>(DAPI_path+fi<strong>le</strong>DAPI);<br />

fi<strong>le</strong> = getTit<strong>le</strong>();<br />

print("Ouverture du fichier DAPI: "+fi<strong>le</strong>);<br />

run("Duplicate...", "tit<strong>le</strong>=DAPI");<br />

// Convertion <strong>en</strong> 8 bits ==> passage <strong>en</strong> mode gris =0.299red+0.587gre<strong>en</strong>+0.114blue<br />

se<strong>le</strong>ctWindow("DAPI");<br />

run("8-bit");<br />

// Reglage du seuil de definition des masques des noyaux<br />

// Reglage automatique des niveaux haut et bas <strong>par</strong> une methode de la classe "ImageProcessor" d'ImageJ<br />

// La definition des seuils est basé sur l'analyse de l'histogramme de l'image sé<strong>le</strong>ctionnée (image DAPI)<br />

setAutoThreshold();<br />

// Le seuillage pour obt<strong>en</strong>ir <strong>le</strong>s masques est appliqué <strong>par</strong> la commande "Convert to Mask" sur l'image DAPI sé<strong>le</strong>ctionnée<br />

run("Convert to Mask");<br />

// Definition des mesures effectuées sur <strong>le</strong>s masques definissant <strong>le</strong>s noyaux dans l'image DAPI se<strong>le</strong>ctionnée<br />

// Ces mesures sont:<br />

// - l'aire sé<strong>le</strong>ctionnée <strong>en</strong> pixels carré,<br />

// - int<strong>en</strong>sité moy<strong>en</strong>ne, du gris dans l'aire sé<strong>le</strong>ctionnée<br />

// - position du c<strong>en</strong>tre de la se<strong>le</strong>ction,<br />

// - la circularité et <strong>le</strong> perimetre<br />

// L'image sé<strong>le</strong>ctionnée <strong>par</strong> l'argum<strong>en</strong>t redirect="+fi<strong>le</strong>DAPI+" est utilisée comme cib<strong>le</strong> de l'analyse<br />

// l'<strong>en</strong>semb<strong>le</strong> des données sont stockées dans un fichier excel<br />

run("Set Measurem<strong>en</strong>ts...", "area mean c<strong>en</strong>troid redirect="+fi<strong>le</strong>DAPI+" decimal=3<br />

circularity perimeter fit");<br />

Manager<br />

// Se<strong>le</strong>ction des masques ==> La commande "<strong>Analyse</strong> Partic<strong>le</strong>" compte et mesure <strong>le</strong>s objets dans l'image seuillée et ajoute <strong>le</strong>s ROI au ROI<br />

// On ne reti<strong>en</strong>t que <strong>le</strong>s masques qui rempliss<strong>en</strong>t un certain nombre de criteres:<br />

// - size ==> <strong>le</strong>s objets hors de la gamme spécifiée sont ignorés; c'est à dire non compris <strong>en</strong>tre MIN_DAPI_THRESH et "infinity"<br />

// - circularity ==> <strong>le</strong>s objets hors de la gamme spécifiée sont ignorés; c'est à dire non compris <strong>en</strong>tre COUNT_DAPI_THRESH et 1<br />

// 0 correspond à un polygone infinim<strong>en</strong>t allongé et 1 a une cerc<strong>le</strong> <strong>par</strong>fait<br />

// l'option "Show" spécifie quel<strong>le</strong> image ImageJ doit afficher aprés l'analyse :<br />

// Masks ==> image binaire 8-bits cont<strong>en</strong>ant <strong>le</strong>s zones remplies des objets mesurés<br />

// exclude ==> <strong>le</strong>s objets mesurés touchant <strong>le</strong> bord sont annulés<br />

// include ==> <strong>le</strong>s trous internes des objets mesurés sont inclus<br />

// add ==> <strong>le</strong>s objets sé<strong>le</strong>ctionnés sont ajoutés au ROI Manager<br />

run("Analyze Partic<strong>le</strong>s...", "size="+MIN_DAPI_THRESH+"-Infinity pixel circularity="+<br />

COUNT_DAPI_THRESH+"-1.00 show=Masks exclude include add");<br />

// Sauvegarde de l'image des objets sé<strong>le</strong>ctionnés (masques)<br />

run("Duplicate...", "tit<strong>le</strong>=Mask_kernels.tif");<br />

// Extraction du nombre de masques sé<strong>le</strong>ctionnés dans <strong>le</strong> ROI Manager<br />

roi_size = roiManager("count");<br />

// Initialisation des pi<strong>le</strong>s des noms des masques ret<strong>en</strong>us (full path fi<strong>le</strong>name)<br />

Cell_se<strong>le</strong>ction_names = newArray(roi_size);<br />

// Initialisation des pi<strong>le</strong>s des flags des masques ret<strong>en</strong>us<br />

sel_names = newArray(roi_size);<br />

-3


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

// A ce stade, <strong>le</strong> ROI Manager conti<strong>en</strong>t <strong>le</strong>s masques pot<strong>en</strong>tiels que l'utilisateur peut accepter ou rejeter<br />

// <strong>le</strong>s ROI sont rangées dans une pi<strong>le</strong>, on va extraire <strong>en</strong> tete de pi<strong>le</strong> chaque ROI,<br />

// l'afficher sur l'image DAPI, la valider ou pas.<br />

// Si el<strong>le</strong> est validée, el<strong>le</strong> est rangée <strong>en</strong> queue de la pi<strong>le</strong> du ROI Manager <strong>en</strong> <strong>le</strong> r<strong>en</strong>omant, alors que la ROI<br />

// originel<strong>le</strong>, <strong>en</strong> debut de pi<strong>le</strong> est effacée<br />

// On bouc<strong>le</strong> sur <strong>le</strong>s masques pot<strong>en</strong>tiels des noyaux (ROI)<br />

for (roi = 0; roi on se<strong>le</strong>ctionne <strong>le</strong> premier de la liste<br />

roiManager("Se<strong>le</strong>ct", 0);<br />

// on efface ce qui est a l'exterieur de la ROI<br />

run("C<strong>le</strong>ar Outside");<br />

// On remplace <strong>le</strong> polygone de la se<strong>le</strong>ction courante <strong>par</strong> son <strong>en</strong>velloppe convexe<br />

run("Convex Hull");<br />

// on ajoute cette ROI <strong>en</strong> fond de liste du ROI MAnager<br />

roiManager("Add");<br />

// On update <strong>le</strong>s modifs du ROI Manager<br />

roiManager("Update");<br />

// on se<strong>le</strong>ctionne la derniere ROI <strong>en</strong> fin de ROI Manager<br />

roiManager("Se<strong>le</strong>ct", roiManager("count")-1);<br />

// on la r<strong>en</strong>ome<br />

roiManager("R<strong>en</strong>ame", "Cell_"+roi);<br />

// on repr<strong>en</strong>d l'image DAPI dans <strong>le</strong> windows manager<br />

se<strong>le</strong>ctImage(fi<strong>le</strong>DAPI);<br />

// on se<strong>le</strong>ctionne la derniere ROI <strong>en</strong> fin de ROI Manager (Cell_x )<br />

roiManager("Se<strong>le</strong>ct", roiManager("count")-1);<br />

roiManager("Update");<br />

// on a l'image dapi <strong>avec</strong> la ROI autour du noyau correspondant<br />

// et l'on va demander à l 'utilisateur de valider cette ROI<br />

msg = "Etes-vous d'accord <strong>avec</strong> <strong>le</strong> masque du noyau?";<br />

if (getBoo<strong>le</strong>an(msg) == true) {<br />

}<br />

else {<br />

}<br />

// mise a jour la tab<strong>le</strong> des etats de validation des ROI<br />

sel_names[roi]=true;<br />

// On crée une nouvel<strong>le</strong> image 8-bit appelé "Mask"<br />

// <strong>le</strong>s pixels pr<strong>en</strong>n<strong>en</strong>t la va<strong>le</strong>ur [255] à l'intérieur et [0] à l'extérieur<br />

run("Create Mask");<br />

// On se<strong>le</strong>ctionne <strong>le</strong> masque dans <strong>le</strong> windows manager<br />

se<strong>le</strong>ctImage("Mask");<br />

// On increm<strong>en</strong>te <strong>le</strong> nombre total de noyaux ret<strong>en</strong>u<br />

nbTotalNuc<strong>le</strong>i++;<br />

// mise a jour la tab<strong>le</strong> des etats de validation des ROI<br />

sel_names[roi]=false;<br />

// On se<strong>le</strong>ctionne la derniere ROI <strong>en</strong> fin de ROI Manager (Cell_x )<br />

roiManager("Se<strong>le</strong>ct", roiManager("count")-1);<br />

// On de<strong>le</strong>te cette ROI portant <strong>le</strong> nom Cell_x qui n'est pas acceptée<br />

roiManager("De<strong>le</strong>te");<br />

// On se<strong>le</strong>ctionne la premiere ROI <strong>en</strong> debut du ROI Manager (xxxx-yyyy)<br />

// Cette ROI est la ROI courante de la bouc<strong>le</strong>, c'est cel<strong>le</strong> qui a servi de base<br />

-4


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

}<br />

// pour la validation<br />

roiManager("Se<strong>le</strong>ct", 0);<br />

// On de<strong>le</strong>te la ROI courante de la bouc<strong>le</strong> du ROI Manager<br />

roiManager("De<strong>le</strong>te");<br />

// A la sortie de la bouc<strong>le</strong>, l'<strong>en</strong>semb<strong>le</strong> des ROI on ete tour a tour se<strong>le</strong>ctionnées<br />

// dans la pi<strong>le</strong> du ROI Manager, <strong>en</strong> <strong>par</strong>tant de la premiere, remplacée ou pas<br />

// <strong>en</strong> queue de la pi<strong>le</strong>, puis effacée ==> il ne reste plus dans la pi<strong>le</strong> du ROI Manager<br />

// que <strong>le</strong>s ROI validées et r<strong>en</strong>ommées sous la forme Cell_X<br />

// Sauvegarde de l'<strong>en</strong>semb<strong>le</strong> des masques des noyaux ret<strong>en</strong>us pour une image<br />

// Fichiers de type zip <strong>avec</strong> pour ext<strong>en</strong>sion tif_ROIs<br />

roiCellNames = working_path+fi<strong>le</strong>H2AX+"_ROIs.zip";<br />

// Extraction du nombre de masque dans la liste du ROI manager<br />

ROI_Manager_Cell_size = roiManager("count");<br />

// Test si <strong>le</strong> ROI MAnager courant conti<strong>en</strong>t au moins un masque<br />

if (ROI_Manager_Cell_size>0) {<br />

se<strong>le</strong>ctWindow("ROI Manager");<br />

roiManager("Save", roiCellNames);<br />

}<br />

// Sauvegarde de chaque masque ret<strong>en</strong>u <strong>par</strong> image<br />

// Fichiers de type zip <strong>avec</strong> pour ext<strong>en</strong>sion tif_ROIs_Cell_x (x numero noyau dans image)<br />

for (roi = 0; roi


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

//c<strong>le</strong>anup<br />

se<strong>le</strong>ctImage("Mask_kernels.tif"); close();<br />

se<strong>le</strong>ctWindow(fi<strong>le</strong>DAPI); close();<br />

se<strong>le</strong>ctWindow("DAPI"); close();<br />

// A ce stade, <strong>le</strong> ROI Manager ne conti<strong>en</strong>t plus ri<strong>en</strong>!<br />

// Les masques correspondants à chaque noyau ret<strong>en</strong>us "Cell_x"<br />

// sont sauvegardés individuel<strong>le</strong>m<strong>en</strong>t dans des fichiers<br />

// Passage au traitem<strong>en</strong>t des Images H2AX<br />

if (ROI_Manager_Cell_size>0) { // Seu<strong>le</strong>m<strong>en</strong>t s'il y a au moins un masque ret<strong>en</strong>u<br />

// Ouverture du fichier H2AX<br />

print("Ouverture du fichier H2AX:"+H2AX_path+fi<strong>le</strong>ListH2AX[i]);<br />

op<strong>en</strong>(H2AX_path+fi<strong>le</strong>ListH2AX[i]);<br />

// Se<strong>le</strong>ction f<strong>en</strong>etre<br />

se<strong>le</strong>ctWindow(fi<strong>le</strong>H2AX);<br />

// Convertion <strong>en</strong> 8 bits ==> passage <strong>en</strong> mode gris =0.299red+0.587gre<strong>en</strong>+0.114blue<br />

run("8-bit");<br />

// On duplique l'image H2AX sur laquel<strong>le</strong> on va appliquer un seuillage automatique<br />

// Cette nouvel<strong>le</strong> image va dev<strong>en</strong>ir l'image de masque des foci (on anticipe donc<br />

// <strong>en</strong> la nommant "Mask_foci_)<br />

run("Duplicate...", "tit<strong>le</strong>=Mask_foci_"+fi<strong>le</strong>H2AX);<br />

// Fixation var. Mask_foci sur Summary tab<strong>le</strong><br />

//Mask_foci = "Mask_foci.tif"; // fi<strong>le</strong>ListH2AX[i]<br />

// Reglage du seuil de definition des masques des foci<br />

// Reglage automatique des niveaux haut et bas <strong>par</strong> une methode de la classe "ImageProcessor" d'ImageJ<br />

// La definition des seuils est basé sur l'analyse de l'histogramme de l'image sé<strong>le</strong>ctionnée (image H2AX)<br />

setAutoThreshold();<br />

// Le seuillage pour obt<strong>en</strong>ir <strong>le</strong>s masques est appliqué <strong>par</strong> la<br />

// commande "Convert to Mask" sur l'image H2AX sé<strong>le</strong>ctionnée<br />

run("Convert to Mask");<br />

// Definition des mesures effectuées sur <strong>le</strong>s masques definissant <strong>le</strong>s noyaux dans l'image DAPI se<strong>le</strong>ctionnée<br />

// Ces mesures sont:<br />

// - l'aire sé<strong>le</strong>ctionnée <strong>en</strong> pixels carré,<br />

// - int<strong>en</strong>sité moy<strong>en</strong>ne, du gris dans l'aire sé<strong>le</strong>ctionnée<br />

// - position du c<strong>en</strong>tre de la se<strong>le</strong>ction,<br />

// - la circularité et <strong>le</strong> perimetre<br />

// L'image sé<strong>le</strong>ctionnée <strong>par</strong> l'argum<strong>en</strong>t redirect="+fi<strong>le</strong>H2AX+" est utilisée comme cib<strong>le</strong> de l'analyse<br />

// l'<strong>en</strong>semb<strong>le</strong> des données sont stockées dans un fichier excel<br />

run("Set Measurem<strong>en</strong>ts...", "area mean c<strong>en</strong>troid redirect="+fi<strong>le</strong>H2AX+" decimal=3<br />

circularity perimeter fit");<br />

// On vide <strong>le</strong> tab<strong>le</strong>au des mesures <strong>par</strong> "<strong>Analyse</strong>" des masques<br />

run("C<strong>le</strong>ar Results");<br />

// Bouc<strong>le</strong> sur <strong>le</strong>s masques des noyaux ret<strong>en</strong>us lors du traitem<strong>en</strong>t de l'image DAPI<br />

roiManager("reset");<br />

for(j=0; j


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

{<br />

// ouverture du fichier cont<strong>en</strong>ant la ROI <strong>d'un</strong> des noyaux dans un fichier zip<br />

op<strong>en</strong>(Cell_se<strong>le</strong>ction_names[j]); // Cell se<strong>le</strong>ction<br />

// On recharge <strong>le</strong> masque du noyau courant<br />

roiCurr<strong>en</strong>tName = call("ij.plugin.frame.RoiManager.getName", 0);<br />

// On test si <strong>le</strong> fichier existe<br />

if (!startsWith(roiCurr<strong>en</strong>tName, "Cell_")) {<br />

showMessage("Summary loop", "Unexpected cell name '"+roiCurr<strong>en</strong>tName+"'");<br />

exit("No Cell se<strong>le</strong>ction");<br />

}<br />

// On reactive l'image depuis <strong>le</strong> Windows manager<br />

//se<strong>le</strong>ctImage("Mask_foci.tif");<br />

se<strong>le</strong>ctImage("Mask_foci_"+fi<strong>le</strong>H2AX);<br />

// On active la ROI sur l'image courante<br />

roiManager("Se<strong>le</strong>ct", 0);<br />

// Recherche des focis a l'interieur de la ROI <strong>par</strong> la commande run("Analyze Partic<strong>le</strong>s..)<br />

// Le tab<strong>le</strong>au "result" est rempli a <strong>par</strong>tir de l'analyse de l'imahge H2AX dans la ROI du noyau<br />

run("Analyze Partic<strong>le</strong>s...",<br />

"display results size="+MIN_FOCI_THRESH+"-Infinity pixel circularity="+<br />

COUNT_FOCI_THRESH+"-1.00 exclude include add summarize");<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

"tit<strong>le</strong>=<br />

}<br />

}<br />

// On dese<strong>le</strong>ct la ROI courante correspondant au noyau<br />

// pour sauvegarder l'<strong>en</strong>semb<strong>le</strong> du ROI manager (<strong>le</strong> ROI Cell_x et <strong>le</strong>(s) ROI foci)<br />

roiManager("Dese<strong>le</strong>ct");<br />

// Sauvegarde des ROIs du manager (masque <strong>d'un</strong> noyau) augm<strong>en</strong>té des ROIs de foci<br />

roiManager("Save", Cell_se<strong>le</strong>ction_names[j]);<br />

roiManager("reset");<br />

// Sauvegarde Measurem<strong>en</strong>ts des foci du noyau courant dans un fichier résultat excel<br />

se<strong>le</strong>ctWindow("Results");<br />

path = working_path+fi<strong>le</strong>H2AX+"_"+roiCurr<strong>en</strong>tName+".xls";<br />

saveAs("Measurem<strong>en</strong>ts", path);<br />

// On print <strong>le</strong> resultat de l'analyse<br />

print("<strong>le</strong> noyau n°"+(j)+" compte "+nResults+" foci");<br />

// On upgrade l'histogramme du nombre de foci <strong>par</strong> noyau<br />

cumFreq[nResults]++; // increm<strong>en</strong>te compteur<br />

// Efface la tab<strong>le</strong> des resultats<br />

run("C<strong>le</strong>ar Results");<br />

// O ferme <strong>le</strong> maximum de f<strong>en</strong>etres<br />

//if (isOp<strong>en</strong>("Mask_foci.tif")) { se<strong>le</strong>ctImage("Mask_foci.tif"); close();<br />

if (isOp<strong>en</strong>("Mask_foci_"+fi<strong>le</strong>H2AX)) { se<strong>le</strong>ctImage("Mask_foci_"+fi<strong>le</strong>H2AX); close();<br />

}<br />

// Fermeture des masques<br />

if (isOp<strong>en</strong>("Mask of DAPI")) { se<strong>le</strong>ctWindow("Mask of DAPI"); close(); }<br />

if (isOp<strong>en</strong>("Mask")) {se<strong>le</strong>ctImage("Mask"); close(); }<br />

if (ROI_Manager_Cell_size > 0) {<br />

//Espace réservé pour des Sauvegarde utilisateurs<br />

-7


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

}<br />

else {<br />

showMessage("<strong>Analyse</strong> avortee", "Pas de se<strong>le</strong>ction dans l'image DAPI, donc pas de<br />

foci...");<br />

print("Aucune se<strong>le</strong>ction de noyau dans l'image");<br />

}<br />

// Fermeture image H2AX<br />

if (isOp<strong>en</strong>(fi<strong>le</strong>H2AX)) { se<strong>le</strong>ctWindow(fi<strong>le</strong>H2AX); close(); }<br />

} // Fin de bouc<strong>le</strong> principa<strong>le</strong> sur <strong>le</strong>s coup<strong>le</strong>s <strong>d'images</strong> DAPI/H2AX<br />

//se<strong>le</strong>ct Log-window<br />

se<strong>le</strong>ctWindow("Log");<br />

// Save log fi<strong>le</strong><br />

path = working_path+fi<strong>le</strong>H2AX+"_log"+".txt";<br />

saveAs("Text", path);<br />

// Summary (Recapitulatif de toutes <strong>le</strong>s mesures sur foci <strong>par</strong> noyau)<br />

//<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

// 'Analyze Partic<strong>le</strong>s' recapitu<strong>le</strong> dans une tab<strong>le</strong> 'Summary':<br />

// - Slice : Nom de l'image H2AX cib<strong>le</strong><br />

// - Count : Nb de foci <strong>en</strong>umeres dans l'image<br />

// - Total Area : Cumul de l'aire de tous <strong>le</strong>s foci<br />

// - ...<br />

// Sortie des resultats pour chaque noyau dans un fichier summary de type .txt<br />

se<strong>le</strong>ctWindow("Summary");<br />

path = working_path+"Summary.txt";<br />

saveAs("Text", path);<br />

//------------------------------------------------------------------<br />

// P<strong>lot</strong> de verification ==> histogramme du nombre de foci <strong>par</strong> noyau<br />

//------------------------------------------------------------------<br />

// Tri des noyaux <strong>par</strong> nb de focis<br />

print("\nRecapitulatif (max:" + maxFociByNuc<strong>le</strong>i+")");<br />

xLimit=yLimit=0;<br />

xMinLimit=yMinLimit=0;<br />

nBins=0;<br />

for (n=0; n0) {<br />

print("cumFreq["+n+"] = "+cumFreq[n]);<br />

nBins++;<br />

print(cumFreq[n]+" noyau de "+n+" foci");<br />

if (cumFreq[n]>yLimit) {yLimit = cumFreq[n];}<br />

if (n>xLimit) {xLimit = n;}<br />

if (xMinLimit==0) {xMinLimit = n;}<br />

}<br />

}<br />

print("");<br />

print("Noyaux ret<strong>en</strong>us = ", nbTotalNuc<strong>le</strong>i);<br />

print("yLimit = ", yLimit);<br />

print("xLimit = ", xLimit);<br />

print("xMinLimit = ", xMinLimit);<br />

print("\nP<strong>lot</strong> graph");<br />

-8


C:\Docum<strong>en</strong>ts and Settings\montarou\Bureau\correction\chandez\Macro_GM_CCQ_v9.txt jeudi 22 juil<strong>le</strong>t 2010 16:08<br />

// P<strong>lot</strong> graph<br />

run("Profi<strong>le</strong> P<strong>lot</strong> Options...", "width=500 height=500 "); // remove default gridlines<br />

P<strong>lot</strong>.create("Distribution du nombre de foci <strong>par</strong> noyau", "X(nb de foci)", "Y(nb de noyau<br />

candidat)");<br />

P<strong>lot</strong>.setLimits(xMinLimit-1, xLimit+1, yMinLimit, yLimit+1);<br />

P<strong>lot</strong>.addText("Nb total de noyaux ret<strong>en</strong>us: "+nbTotalNuc<strong>le</strong>i, 0.02, 0.05);<br />

P<strong>lot</strong>.setColor("blue");<br />

for (n=0; n0) {<br />

P<strong>lot</strong>.setColor("blue");<br />

P<strong>lot</strong>.setLineWidth(2);<br />

P<strong>lot</strong>.drawLine(n, 0, n, cumFreq[n]);<br />

in2p3-00530281, version 1 - 28 Oct 2010<br />

label=""+n;<br />

P<strong>lot</strong>.addText(label, ((n-(xMinLimit-1))/(xLimit-xMinLimit+2))-0.02, 0.99);<br />

// // Grid lines<br />

P<strong>lot</strong>.setColor("lightGray");<br />

P<strong>lot</strong>.setLineWidth(1);<br />

// Left Y axis<br />

P<strong>lot</strong>.setJustification("<strong>le</strong>f");<br />

P<strong>lot</strong>.addText(" "+d2s(cumFreq[n],0), 0, 1-(cumFreq[n]/(yLimit+1)));<br />

P<strong>lot</strong>.drawLine(0, cumFreq[n], xLimit+1, cumFreq[n]);<br />

}<br />

}<br />

print("\nFin p<strong>lot</strong> graph");<br />

P<strong>lot</strong>.show;<br />

showMessage("Macro_GM_CCQ_v4.txt", "Fin d'analyse de la pi<strong>le</strong>");<br />

print("\nFin d'analyse de la pi<strong>le</strong>");<br />

// c<strong>le</strong>ar memory usage<br />

call("java.lang.System.gc");<br />

-9

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!