金魚亭日常

読書,ガジェット,競技プログラミング

ImageJ の Prefs.blackBackground

ImageJ の Analyze Particle をマクロでやるとき,こういう感じで書いていたのだけれど, 別のPCで実行したら白黒反転してカウントされることに気づいた. つまり,対象物が白,背景が黒としてカウントされる.

"threshold 255-255 が正しくない" みたいなこの辺のエラーメッセージが出る.

https://github.com/imagej/ImageJA/blob/ac7c554675133443b9e3d3883c5d727049c9d857/src/main/java/ij/plugin/filter/ParticleAnalyzer.java#L1060

threshold は 0-0 にならないといけないはずなので,見ていくと,

line 764 の boolean setThresholdLevels(ImagePlus imp, ImageProcessor ip){...}ってとこで,

  1. ip.getMinThreshold() == ImageProcessor.NO_THRESHOLDTrue
  2. imageType!=BYTEFalse
  3. Prefs.blackBackground が True => threshold255 の真偽が反転
  4. threshold255 = imp.isInvertedLut()False だったので,True になる
  5. threshold255True
  6. range が 255-255 に

という流れだった.

Prefs.blackBackground というのは IJ.Prefs を import すると使えて,ユーザーごとの設定値を参照したり変更したりできる.

ちなみに,ユーザーごとの設定値は ~/.imagej/IJ_Prefs.txt にあって,開始時に読んで終了時に保存,という感じらしい.

ということで,

  1. 開始時に Prefs.blackBackground の値をいったん保存
  2. Prefs.blackBackground = False
  3. 元に戻す

って感じにしたらうまくいった.

 import java.lang.Float as JFloat
 
-from ij import IJ, ImagePlus
+from ij import IJ, ImagePlus, Prefs
 from ij.process import ImageProcessor, ImageConverter
 from ij.plugin.filter import ParticleAnalyzer as PA
 from ij.measure import ResultsTable
 
 from fiji.threshold import Auto_Threshold
 
+bb = Prefs.blackBackground
+Prefs.blackBackground = False
+
 imp = IJ.getImage()
 
 ImageConverter(imp).convertToGray8() 
@@ -26,3 +29,5 @@
 pa.analyze(imp)
 
 rt.show("Result")
+
+Prefs.blackBackground = bb