Применить формулу коррекции для каждого канала для 5D изображения

Я совершенно новичок в Groovy и имею только ограниченный опыт написания макросов ImageJ, так что это может быть действительно легко исправить, но здесь идет речь:

У меня есть 5D гиперстек (3 канала, 3 среза, ~100 позиций сцены), которые страдают от очень неравномерного освещения. Я нашел довольно простую формулу для исправления этого. Формула

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

где 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 не имеют такого метода.

Другие вопросы по тегам