Применить формулу коррекции для каждого канала для 5D изображения - PullRequest
0 голосов
/ 23 января 2019

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

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

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

, где 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)

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 25 января 2019

Я могу просто объяснить ошибку Groovy, с которой вы сталкиваетесь, а не как исправить реализацию формулы коррекции.Это говорит о том, что FloatProcessor не имеет метода с подписью ниже.Ни его собственный, ни наследуемый, ни через другие механизмы Groovy, например MOP, AST или Extensions

divide(ij.CompositeImage img)

Исходный код ImageJ не подтверждает, что ни FloatProcessor , ни его суперкласс ImageProcessor У меня нет такого метода.

...