将校正公式应用于5D图像的每个通道

时间:2019-01-23 09:51:44

标签: java groovy imagej imagej-macro

我对groovy完全陌生,并且在编写ImageJ宏方面经验有限,因此,这可能是一个很容易解决的问题,但是这里有:

我有一个5D超级堆栈(3个通道,3个切片,〜100个舞台位置),它们的照明高度不均匀。我发现了一个相当简单的公式可以对此进行更正。公式是

C = (R-D)*m/(F-D)

其中C是校正后的图像,R是原始图像,D是暗场图像,F是平场图像,m是(F-D)的图像平均值。

对于单通道3D图像(x,y,p),这相对简单,不需要任何宏脚本,但是对于多通道,多切片5D图像,我至少必须在将校正公式应用于每个通道,然后重新组合它们之前,将图像分为多个通道。我一直在尝试使用groovy编写一个宏来为我处理这个问题(我之所以选择groovy是因为有人告诉我它更易于使用,因此我愿意接受其他建议),但是我似乎无法使其运行。目前,我有下面的代码(由于在获取过程中已经对此图像进行了校正,因此我将暗视野留在了外面):

import ij.*
import ij.plugin.filter.ImageMath
import ij.process.*
import ij.gui.*
import java.awt.*
import ij.plugin.*

class My_Plugin implements PlugIn {

    void run(java.lang.String arg) {
        ImagePlus flatfield = WindowManager.getImage("flatfield.tif")
        ImagePlus rawstack = WindowManager.getImage("Untitled.tif")
        ImagePlus correctedstack = IJ.createImage("HyperStack", "32-bit composite-mode", 512, 512, 3, rawstack.z, 1)
        float m;
        for (c in flatfield.c) {
            flatfield.setC(c)
            rawstack.setC(c)
            correctedstack.setC(c)
            m = flatfield.getStatistics().mean
            rawstack.z.each { z ->
                rawstack.setZ(z)
                correctedstack.setZ(z)
                if (m > 0) {
                    rawstack.processor.multiply(m)
                    correctedstack.processor.divide(flatfield)
                }
            }
        }
        correctedstack.show()
    }

}

new My_Plugin().run()

此代码当前由于以下异常而失败(但我怀疑代码本身通常编写得不好):

groovy.lang.MissingMethodException: No signature of method: ij.process.FloatProcessor.divide() is applicable for argument types: (ij.CompositeImage) values: [img["flatfield.tif" (-274), 8-bit, 512x512x3x3x1]] Possible solutions: dilate(), dilate(), erode(), erode(), find(), noise(double)

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我只能解释您遇到的Groovy错误,而不是如何解决更正公式的实现。它说FloatProcessor没有带有以下签名的方法。它既不是自己的也不是继承的,也不是通过其他Groovy机制(例如MOP,AST或扩展程序

divide(ij.CompositeImage img)

ImageJ的源代码确认FloatProcessor或其超类ImageProcessor都没有这种方法。