0

我正在尝试创建一个 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)

我收到一个错误:

类型错误:rollingBallBackground():预期 8 个参数;得到 7

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

TypeError: rollingBallBackground(): self arg 不能被强制转换为 ij.plugin.filter.BackgroundSubtracter

我究竟做错了什么?

4

1 回答 1

0

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

你超级亲密;要让它工作,你需要创建一个实例,BackgroundSubtracter然后按照你展示的那样调用该方法

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

此方法也没有返回值。threshold如果None您的代码按预期运行,那就是这样。

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

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

public意味着该方法可以在类外部访问,而不是private意味着该方法不可访问。

void表示没有返回值。

如果这个词static在这里,那么你就可以在类上调用这个方法。但它丢失了,这意味着它只能在实例上调用。

于 2020-05-19T23:56:00.360 回答