【发布时间】: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