如何创建一个 3D 图像,其中每个平面都分配给一个图像而无需迭代

问题描述

由于 dm-script 不允许在不同维度上做简单的数学运算。我很好奇是否有任何函数可以创建 3D 图像,其中所有平面都分配给单个图像而无需迭代。

enter image description here

这是迭代版本:

Again

解决方法

谢谢你,BmyGuest。 mask2d[icol,irow,0] 非常简单。 如果图像尺寸 (sx,sy,sz) 变大,内在变量的速度变慢。我使用 slice3() 修改了 for 循环。处理速度略有改善,但没有明显提高。

number sx = 128
number sy = 128
number sz = 1000

image mask2d := RealImage( "2D Mask",4,sx,sy )
mask2d = iradius>10 & iradius<50 ? 1 : 0
mask2d.ShowImage()

image mask3d := RealImage( "3D Mask",sz )

number t0,t1

//for loop with slice2
number i
t0=GetHighResTickCount()
for(i=0;i<sz;i++)
{
    mask3d.slice2(0,i,1,1)=mask2d
}
t1=GetHighResTickCount()
result("for loop with slice2: "+CalcHighResSecondsBetween(t0,t1)+" s\n")
//mask3d.showimage()

//icol,irow
mask3d=0 //reset
t0=GetHighResTickCount()
mask3d = mask2d[icol,0]
t1=GetHighResTickCount()
result("intrinsic variable: "+CalcHighResSecondsBetween(t0,t1)+" s\n")
//mask3d.showimage()

//for loop with slice3
mask3d=0 //reset
t0=GetHighResTickCount()
number n=0
while(2**n<sz)
{
    n=n+1
}
n=n-1

mask3d.slice2(0,1)=mask2d
for(i=0;i<n;i++)
{
    mask3d.slice3(0,2**i,2,1)=mask3d.slice3(0,1)
}
if(sz-2**n>0)
{
    mask3d.slice3(0,2**n,sz-2**n,1)
}
t1=GetHighResTickCount()
result("for loop with slice3: "+CalcHighResSecondsBetween(t0,t1)+" s\n")
mask3d.showimage()
,

我首先要重新表述您的问题:基本上,您想做:

number sx = 50
number sy = 50
number sz = 1024
image stack := RealImage( "3D Stack",sz )
stack = random()
stack.ShowImage()

image mask2d := RealImage( "2D Mask",sz )
for( number i=0; i<sz; i++ )
    mask3d.slice2(0,1) = mask2D


image stackFiltered = stack * mask3d
stackFiltered.showimage()

并且您要求一种更有效地创建 mask3d 的方法。


在我的评论中,我的问题是为什么

您无需在该帮助程序堆栈上浪费时间和内存,只需执行以下操作:

number sx = 50
number sy = 50
number sz = 1024
image stack := RealImage( "3D Stack",sy )
mask2d = iradius>10 & iradius<50 ? 1 : 0
mask2d.ShowImage()

image stackFiltered := stack.ImageClone()
for( number i=0; i<sz; i++ )
    stackFiltered.slice2(0,1) *= mask2D

stackFiltered.showimage()

现在对于您的问题:您可以将 for 循环替换为内在变量表示法:

image mask2d := RealImage( "2D Mask",sy )
mask2d = iradius>10 & iradius<50 ? 1 : 0

image mask3d := RealImage( "3D Mask",sz )
mask3d = mask2d[icol,0]

或者没有 mask3d 只需使用:

image stackFiltered = stack * mask2d[icol,0]

但是,在一般情况下,我认为这并不比 slice2 循环更快或更有效。