如何解决如何创建一个 3D 图像,其中每个平面都分配给一个图像而无需迭代
由于 dm-script 不允许在不同维度上做简单的数学运算。我很好奇是否有任何函数可以创建 3D 图像,其中所有平面都分配给单个图像而无需迭代。
这是迭代版本:
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 循环更快或更有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。