运行 斐济 jython 脚本中的 BackgroundSubtracter

Run BackgroundSubtracter in jython script for Fiji

我正在尝试创建一个 Imagej/Fiji 脚本来分析显微图像。作为管道的一部分,我想使用斐济提供的滚球 BackgroundSubtracter。根据 Imagej API,应该看起来像这样:

rollingBallBackground(ImageProcessor ip,
                              double radius,
                              boolean createBackground,
                              boolean lightBackground,
                              boolean useParaboloid,
                              boolean doPresmooth,
                              boolean correctCorners)

但是,如果我尝试 运行 在三通道图像的一个通道上执行此操作:

from ij import IJ, ImagePlus
from ij import WindowManager as wm
from ij.plugin import ChannelSplitter
from ij.plugin.filter import BackgroundSubtracter

imp = wm.getCurrentImage()
c1, c2, c3 = ChannelSplitter.split(imp)
c1.show() # This works
c1 = c1.getProcessor()
threshold = BackgroundSubtracter.rollingBallBackground(c1,
                                                      50.,
                                                      False,
                                                      False,
                                                      True,
                                                      False,
                                                      False)

我收到一个错误:

TypeError: rollingBallBackground(): expected 8 args; got 7

如果我附加另一个参数,比如说另一个 "False" 或“1”,我就会得到这个错误:

TypeError: rollingBallBackground(): self arg can't be coerced to ij.plugin.filter.BackgroundSubtracter

我做错了什么?

根据我使用这个 API 的经验,当我看到“Expected args+1; got args”但我肯定有正确数量的参数时,这意味着我不小心尝试调用 class 方法而不是 instance 方法(你的第二个 TypeError 暗示了这一点)。在这种情况下,没有为 BackgroundSubtracter

定义任何 class 方法

你们非常亲密;为了让它工作,你需要创建一个 BackgroundSubtracter 的实例,然后调用你展示的方法

BackgroundSubtracter().rollingBallBackground(c1,
                                             50.,
                                             False,
                                             False,
                                             True,
                                             False,
                                             False)

此外,此方法没有 return 值。如果您的代码 运行 符合预期,threshold 会是 None

我建议复习一下 Java 修饰符是什么。我对 Java 不是很熟悉,但了解修饰符的含义对于理解 Jython ImageJ 文档所说的内容至关重要,它对我帮助很大:

public void rollingBallBackground(ImageProcessor ip,
                                  double radius,
                                  boolean createBackground,
                                  boolean lightBackground,
                                  boolean useParaboloid,
                                  boolean doPresmooth,
                                  boolean correctCorners)

public 表示该方法可以在 class 之外访问,而 private 则意味着该方法不可访问。

void 表示没有 return 值。

如果单词 static 在这里,那么您就可以在 class 上调用此方法。但是它丢失了,这意味着它只能在实例上调用。