Я совершенно новичок в 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)
Любая помощь очень ценится!