【问题标题】:Mathematical Operations on an Image Stack in ImageJ (Fiji)ImageJ(斐济)中图像堆栈的数学运算
【发布时间】:2014-07-31 15:46:20
【问题描述】:

我正在使用 Eclipse 中的 pydev 插件在 Jython 中编写一个 imageJ/Fiji 插件。该插件将是一个名为 CANDLE 的现有去噪软件的 ImageJ 版本,该软件以 matlab 程序编写。在 matlab 中更改图像的每个像素(体素)的值是微不足道的:

InputImage = 2 * sqrt(InputImage + (3/8));
Median3DFilteredImage = 2 * sqrt(Median3DFiltered + (3/8));

这里的“InputImage”和“Median3DFilteredImage”是 3D 矩阵,最后一个维度是时间(切片)。为了在 ImageJ 图像上重现以下操作,我必须使用两个 for 循环,一个循环遍历图像切片(第 3 维),另一个循环遍历特定切片中的所有像素:

medFiltStack = medianFilteredImage.getStack()   
newMedFiltStack = ImageStack(medianFilteredImage.width, medianFilteredImage.height)

InputStack = InputImage.getStack() 
newInputStack = ImageStack(InputImage.width, InputImage.height)

for i in xrange(1 , medianFilteredImage.getNSlices() + 1):

 ip = medFiltStack.getProcessor(i).convertToFloat()
 ip2 = InputStack.getProcessor(i).convertToFloat()

 pixels = ip.getPixels()
 pixels2 = ip2.getPixels()

 for j in xrange (len(pixels)):

     pixels[j] = 2 * javaMath.sqrt(pixels[j] + (3.0/8.0)  )
     pixels2[j] = 2 * javaMath.sqrt(pixels2[j] + (3.0/8.0)  )

 newMedFiltStack.addSlice(ip)
 newInputStack.addSlice(ip2)    

medianFilteredImage = ImagePlus("MedianFiltered-Image", newMedFiltStack)
InputImage = ImagePlus("Input-Image", newInputStack)

我的问题如下:有没有一种方法可以对图像堆栈,即图像堆栈中的每个像素(体素)执行数学运算,而无需编写显式访问图像每个切片中的每个像素的代码,即for循环。这似乎是一种非常原始的处理方式,我想知道是否没有进行此操作的最佳方式。我还必须使用副本,然后为新图像赋予与以前相同的名称,而不是使用原始图像并直接编辑它们。那么有没有办法编辑原始图像的像素值而不是图像的副本?任何帮助将不胜感激,因为我必须执行更多的数学运算。找到一种在代码量方面以及在可能的情况下在速度方面以最佳方式对图像进行数学运算的方法将非常有用。

【问题讨论】:

  • 您的具体问题是什么?
  • @Paul R 有没有一种方法可以对图像堆栈,即图像堆栈中的每个像素(体素)执行数学运算,而无需编写显式访问每个切片中的每个像素的代码图像,即for循环。这似乎是一种非常原始的方式。这是否使它更清楚?还有一种方法可以编辑原始图像的像素值而不是副本吗?谢谢
  • 请编辑您的问题以包含此说明,因为它目前非常含糊,您可能会因为目前“不清楚您在问什么”而关闭它。
  • @Paul R 我在上面。谢谢

标签: image-processing jython imagej


【解决方案1】:

在纯粹的ImageJ 1.x 中,答案是:,除了访问每个切片并获取其ImageProcessor 之外别无他法。这就是 ImageJ1 处理其有限数量的维度(z、时间、通道)的方式,你总是有一个二维平面的 (Hyper-)Stack。

然而,还有一种更强大的方法来处理 n 维图像,称为ImgLib,它与ImageJ2 一起包含在斐济中。

为避免重新发明轮子,您应该看看 Jean-Yves Tinevez 的出色插件 Image Expression Parser。在斐济使用headlessly,或者看看它的source code(虽然它使用以前的版本,ImgLib1,但想法是一样的:你避免使用 Java 泛型对维度进行硬编码),参见例如对于sqrt function

public final <R extends RealType<R>> float evaluate(final R alpha) {
    return (float) Math.sqrt(alpha.getRealDouble());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多