我对groovy完全陌生,并且在编写ImageJ宏方面经验有限,因此,这可能是一个很容易解决的问题,但是这里有:
我有一个5D超级堆栈(3个通道,3个切片,〜100个舞台位置),它们的照明高度不均匀。我发现了一个相当简单的公式可以对此进行更正。公式是
其中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)
非常感谢您的帮助!
答案 0 :(得分:0)
我只能解释您遇到的Groovy错误,而不是如何解决更正公式的实现。它说FloatProcessor没有带有以下签名的方法。它既不是自己的也不是继承的,也不是通过其他Groovy机制(例如MOP,AST或扩展程序
divide(ij.CompositeImage img)
ImageJ的源代码确认FloatProcessor或其超类ImageProcessor都没有这种方法。