首页 > 解决方案 > 将校正公式应用于 5D 图像的每个通道

问题描述

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

我有一个 5D 超堆栈(3 个通道、3 个切片、约 100 个舞台位置),它受到高度不均匀照明的影响。我找到了一个相当简单的公式来纠正这个问题。公式是

C = (RD)*m/(FD)

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

对于单通道 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)

任何帮助是极大的赞赏!

标签: javagroovyimagejimagej-macro

解决方案


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

divide(ij.CompositeImage img)

ImageJ 的源代码确认FloatProcessor和它的超类ImageProcessor都没有这样的方法。


推荐阅读