Domanda

Sto cercando attraverso una serie di dati di immagini in ImageJ (una pila di immagini .tif, circa 130 frame), e ho un problema con il set di dati. È una serie di immagini al microscopio, con ciascun frame essendo un piano circa 3-4 micrometri sopra / sotto il precedente. Come vado più in profondità nel set di dati, dispersione della luce rende per uno sfondo luminoso, in modo dalle principali caratteristiche del campione sono dimmer.

Tuttavia, caratteristica luminosità e il contrasto di ImageJ utilizza un istogramma che rappresenta la intero pila di immagini. Quando faccio clic su "Auto" e "reset" su un'immagine in profondità nella pila, il contrasto risultante è perfetto: tutte le caratteristiche illuminano davvero bene. Tuttavia, poi, di nuovo alla partenza della pila, la maggior parte delle caratteristiche sono diventati saturi.

Ho provato estrarre manualmente alcune immagini da vari punti nello stack e l'esecuzione di Auto-> Ripristina in Luminosità e contrasto su ciascuno individualmente e li ri-conversione in uno stack in seguito, e sembra davvero solido. Come posso fare questo a livello di codice (ad esempio con un plugin) per l'intero stack? Quali sono le chiamate API rilevanti?

È stato utile?

Soluzione

Un buon modo per iniziare a scrivere uno script è quello di utilizzare il registratore di macro ImageJ - si può iniziare questo con Plugins > Macros > Record .... Per questo esempio, sto supponendo che hai impostato l'casella di opzione Record: a JavaScript, ma se siete più familiarità con il linguaggio macro ImageJ o la scrittura di plug-in Java uno degli altri potrebbe essere una scelta migliore. Se quindi si apre la vostra immagine e l'uso Image > Stacks > Set Slice ... e selezionare (dire) fetta 20, si dovrebbe vedere:

imp.setSlice(20);

... appaiono nel registratore. Ora, se si esegue Image > Adjust > Brightness/Contrast... e selezionare Auto, si dovrebbe vedere nel registratore che questo è l'equivalente di esecuzione conservazione Enhance Contrast 0,35% pixel saturi. Il problema con questo, come hai notato, è che questa regola il valore minimo e massimo per l'intero stack piuttosto che solo che quella fetta. Tuttavia, è possibile eseguire Enhance Contrast con diverse opzioni eseguendo Process > Enhance Contrast. La sezione su tale opzione sul ImageJ documentazione wiki spiega che se si desidera modificare i valori dei pixel piuttosto che impostare il minimo e massimo per lo stack, è necessario selezionare l'opzione "normalizzare". Se ho scelto di fare che, invece, i record registratore di macro:

imp.setSlice(20);
IJ.run(imp, "Enhance Contrast", "saturated=0.35 normalize");

... e si dovrebbe vedere che solo il 20 fetta è stato alterato. È quindi possibile avvolgere che in un ciclo che esegue lo stesso miglioramento su ogni fetta con:

var imp = IJ.getImage();
var n = imp.getStackSize();

for( var i = 0; i < n; ++i) {
    imp.setSlice(i+1);
    IJ.run(imp, "Enhance Contrast", "saturated=4 normalize");
}

(Se stai usando Fiji, quindi Script Editor (per esempio tramite File > New > Script) è un modo semplice per sperimentare tali script.)

Naturalmente, utilizzando l'opzione di normalizzare fa risultato nei valori dei pixel non vengano modificati, il che significa in questo caso che si sta perdendo le informazioni, in modo da non utilizzare lo stack risultante per risultati quantitativi.

Spero che sia di qualche utilità.

Altri suggerimenti

Si potrebbe anche considerare l'utilizzo di CellProfiler per elaborare le immagini. Anche se CP non può fare esattamente quello che stai cercando di fare direttamente, si può effettivamente eseguire ImageJ comandi, i plugin e macro da CP.

Al molto più semplice, si potrebbe creare una pipeline CP che ha appena LoadImages e RunImageJ.

La risposta accettata è la migliore per la domanda del PO, ma una piccola variante è se si vuole modificare la luminosità / contrasto in funzione delle fette di dati specifici.

Nel mio caso ho voluto avere un effetto soglia, ma il valore di soglia stava cambiando in ogni fetta di stack. Sono andato a qualche fetta diverse e manualmente trovato il valore di soglia. Poi ho trovato una funzione approssimativa per il valore di soglia (Tv) in funzione della fetta (s) come segue:

Tv=4000/s-17

Quindi, allora il mio script diventa:

importClass(Packages.ij.IJ);

var imp = IJ.getImage();
var n = imp.getStackSize();
var miny,maxy;

for( var i = 1; i < n+1; ++i) {
    imp.setSlice(i);
    miny=parseInt(4000/i-17);
    maxy=miny+5;
    IJ.setMinAndMax(imp, miny, maxy);
    IJ.run(imp, "Apply LUT", "slice");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top