ImageJの明るさとコントラストの画像のスタック
-
11-10-2019 - |
質問
ImageJ(.tif画像のスタック、約130フレームのスタック)のデータセットセットを調べていますが、データセットに問題があります。これは一連の顕微鏡画像で、各フレームは前のフレームの上/下3〜4マイクロメートルの平面です。データセットの奥深くに進むと、光散乱により背景が明るくなります。そのため、標本の主な機能は調光器です。
ただし、ImageJの明るさとコントラスト機能は、 全体 画像のスタック。スタックの奥深くにある画像で「自動」と「リセット」をクリックすると、結果として得られるコントラストが完璧です。すべての機能は非常によく点灯します。ただし、スタックの開始時に戻って、ほとんどの機能が飽和状態になりました。
スタック内のさまざまなポイントからいくつかの画像を手動で抽出し、それぞれに輝度とコントラストで自動リセットを実行し、その後スタックに再変換しようとしましたが、その後は本当にしっかりしています。スタック全体のプログラムで(例えばプラグインを使用して)これを行うにはどうすればよいですか?関連するAPI呼び出しは何ですか?
解決
このようなスクリプトを書き始める良い方法は、ImageJのマクロレコーダーを使用することです。 Plugins > Macros > Record ...
. 。この例では、あなたが切り替えたと仮定しています Record:
オプションボックスに JavaScript
, 、しかし、ImageJマクロ言語やJavaのプラグインを書くことに精通している場合、他の1つがより良い選択かもしれません。画像を開いて使用する場合 Image > Stacks > Set Slice ...
そして、(たとえば)スライス20を選択してください。
imp.setSlice(20);
...レコーダーに表示されます。今実行する場合 Image > Adjust > Brightness/Contrast...
選択します Auto
, 、レコーダーでは、それが実行に相当することを確認する必要があります Enhance Contrast
0.35%の飽和ピクセルを維持します。これに関する問題は、ご承知のとおり、スライスではなく、スタック全体の最小値と最大値を調整することです。ただし、実行できます Enhance Contrast
実行することでさまざまなオプションがあります Process > Enhance Contrast
. 。そのオプションのセクション ImageJドキュメントWiki スタックの最小値と最大値を設定するのではなく、ピクセル値を変更する場合は、「正規化」オプションを選択する必要があることを説明しています。代わりにそれを行うことを選択した場合、Macro Recorder Records:
imp.setSlice(20);
IJ.run(imp, "Enhance Contrast", "saturated=0.35 normalize");
...そして、スライス20のみが変更されていることがわかります。次に、それをすべてのスライスで同じ強化を実行するループでラップできます。
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");
}
(フィジーを使用している場合、スクリプトエディター(例: File > New > Script
)そのようなスクリプトを試す簡単な方法です。)
もちろん、正規化オプションを使用すると、ピクセル値が変更されます。この場合、情報が失われているため、定量的な結果に結果のスタックを使用しません。
それがいくつかの使用であることを願っています。
他のヒント
また、使用を検討することもできます CellProfiler 画像を処理します。 CPが直接やろうとしていることを正確に実行できなくても、CPからImageJコマンド、プラグイン、マクロを実際に実行できます。
最も簡単なことに、LoadimagesとRunimageJを備えたCPパイプラインを作成できます。
受け入れられた答えはOPの質問に最適ですが、小さなバリアントは、特定のデータのスライスの関数として明るさ/コントラストを変更する場合です。
私の場合、私はしきい値効果を持ちたいと思っていましたが、スタックの各スライスでしきい値が変化していました。いくつかの異なるスライスに行き、しきい値を手動で見つけました。次に、次のように、スライスの関数としてしきい値(TV)のおおよその関数を見つけました。
Tv=4000/s-17
したがって、私のスクリプトは次のようになります。
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");
}