Frage

Ich bin auf der Suche durch einen Datensatz Satz von Bildern in ImageJ (einen Stapel von .tif Bildern, etwa 130 Frames), und ich habe ein Problem mit dem Datensatz. Es ist eine Reihe von Mikroskopbildern, wobei jeder Rahmen unterhalb der vorhergehenden ein Flugzeug etwa 3-4 Mikrometer oben / werden. Als ich tiefer in den Datensatz gehen, Lichtstreuung sorgt für einen helleren Hintergrund, so dass die wichtigsten Merkmale der Probe Dimmer sind.

Allerdings verwendet ImageJ Helligkeit und Kontrast-Funktion ein Histogramm, das die gesamten Stapel von Bildern darstellt. Wenn ich „Auto“ klicken und „Reset“ auf einem Bild, tief im Stapel, ist der resultierende Kontrast perfekt: alle Funktionen wirklich gut leuchten. Doch dann wieder am Anfang des Stapels, hat die meisten Funktionen gesättigt.

Ich habe manuell versucht, ein paar Bilder von verschiedenen Punkten in dem Stapel zu extrahieren und Auto- Ausführen> Zurücksetzen in Helligkeit und Kontrast auf jedem einzeln und Wieder Umwandlung sie zu einem Stapel danach, und es sieht wirklich solide. Wie kann ich programmatisch dieses (zum Beispiel mit einem Plugin) für den gesamten Stack? Was sind die entsprechenden API-Aufrufe?

War es hilfreich?

Lösung

Eine gute Möglichkeit, zu beginnen ein solches Skript zu schreiben, ist ImageJ Makrorekorder verwenden - Sie dies mit Plugins > Macros > Record ... beginnen. In diesem Beispiel gehe ich davon aus, dass Sie die Option Record: Feld JavaScript gewechselt haben, aber wenn man mehr vertraut mit dem ImageJ Makro-Sprache oder Schreiben Plugins in Java eine der anderen sind vielleicht eine bessere Wahl sein. Wenn Sie dann Ihr Bild und Verwendung Image > Stacks > Set Slice ... öffnen und wählen Sie (sagen) Scheibe 20, sollten Sie sehen:

imp.setSlice(20);

... im Rekorder angezeigt. Nun, wenn Sie Image > Adjust > Brightness/Contrast... und wählen Sie Auto ausführen, sollten Sie in den Recorder sehen, dass das ist das Äquivalent Enhance Contrast keeping 0,35% gesättigten Pixeln ausgeführt wird. Das Problem dabei, wie Sie bemerkt haben, ist, dass dies die Minimal- und Maximalwerte für den gesamten Stapel paßt und nicht nur, dass diese Scheibe. Sie können jedoch Enhance Contrast mit verschiedenen Optionen, indem Sie Process > Enhance Contrast laufen. Der Abschnitt über diese Option auf dem ImageJ Dokumentations-Wiki erklärt, dass, wenn Sie wollen vielmehr die Pixelwerte ändern, als das Minimum und Maximum für den Stapel einstellen, müssen Sie die „Normalisieren“ Option auszuwählen. Wenn ich wählen, dass stattdessen zu tun, die Makro-Recorder Datensätze:

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

... und Sie sollten sehen, dass nur Scheibe 20 verändert wurde. Sie können dann wickeln, dass in einer Schleife, die die gleiche Verstärkung auf jeder Scheibe laufen mit:

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");
}

(Wenn Sie Fidschi verwenden, dann wird der Skript-Editor (beispielsweise über File > New > Script) ist eine einfache Möglichkeit, mit solchen Scripts zu experimentieren.)

Natürlich hat die Normalisierungs Option Ergebnis in den Pixelwerten verändert werden, was bedeutet in diesem Fall, dass Sie Informationen sind zu verlieren, so würde ich nicht den resultierenden Stapel für quantitative Ergebnisse verwendet werden.

Ich hoffe, das ist von einigem Nutzen.

Andere Tipps

Sie könnten auch erwägen mit CellProfiler die Bilder zu verarbeiten. Auch wenn CP nicht genau das tun, was Sie versuchen, direkt zu tun, können Sie tatsächlich ausführen ImageJ Befehle, Plugins und Makros von CP.

Auf der einfachsten, könnten Sie eine CP-Pipeline erstellen, die nur hat Loadimages und RunImageJ.

Die akzeptierte Antwort ist das Beste für die Frage des OP, aber eine kleine Variante ist, wenn Sie die Helligkeit / Kontrast als Funktion der Scheiben Ihrer spezifischen Daten ändern möchten.

In meinem Fall wollte ich einen Schwelleneffekt haben, aber der Schwellenwert wurde in jeder Schicht des Stapels zu ändern. Ich ging in ein paar verschiedenen Scheiben und manuell den Schwellenwert gefunden. Ich fand dann eine Näherungsfunktion für Schwellenwert (Tv) in Abhängigkeit von der Scheibe (n) wie folgt:

Tv=4000/s-17

Daher Dann mein Skript wird:

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");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top