Применить формулу коррекции для каждого канала для 5D изображения
Я совершенно новичок в Groovy и имею только ограниченный опыт написания макросов ImageJ, так что это может быть действительно легко исправить, но здесь идет речь:
У меня есть 5D гиперстек (3 канала, 3 среза, ~100 позиций сцены), которые страдают от очень неравномерного освещения. Я нашел довольно простую формулу для исправления этого. Формула
где 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)
Любая помощь очень ценится!
1 ответ
Я могу просто объяснить ошибку Groovy, с которой вы сталкиваетесь, а не как исправить реализацию формулы коррекции. Это говорит о том, что FloatProcessor не имеет метода с подписью ниже. Ни свои, ни наследуемые, ни через другие Groovy-механизмы, например MOP, AST или Extensions
divide(ij.CompositeImage img)
Исходный код ImageJ подтверждает, что ни FloatProcessor, ни его суперкласс ImageProcessor не имеют такого метода.