我在DM脚本中使用SetName时发现了一个奇怪的问题。示例代码如下。不知何故,输出图像无法正确重命名。一种可能的解决方案是我使用" ="而不是":="分配我处理过的图像。但是,所有标签都会丢失。
有人知道原因吗?
提前致谢
image IMG := RealImage("",4,1024,1024,11)
number sizeX, sizeY, sizeZ
IMG.Get3DSize(sizeX, sizeY, sizeZ)
number sizeZ1 = (sizeZ+1)/2
image subIMG := IMG.Slice3(0,0,0,0,sizeX,1,1,sizeY,1,2,sizeZ1,2)
subIMG.SetName("Sub-volume of a Stack")
subIMG.ShowImage()
答案 0 :(得分:0)
当您使用:=
来协助图像变量时,您只是提供对内存位置的引用。
因此,使用
image subIMG := IMG.Slice3(0,0,0,0,sizeX,1,1,sizeY,1,2,sizeZ1,2)
根本不创建图像,而只是(以聪明的方式)指向IMG
保存其数据的同一内存。实质上,您现在有两个指向同一内存的变量。你可以通过
Image full := RealImage("Full image",4, 200, 200 )
full = icol
full.ShowImage()
Image sub := full.Slice2(50,50,0, 0,20,3, 1,20,3 )
sub = sub *-1
并注意到full
的值已发生变化!
因为'subIMG'本身并不是一个图像,所以忽略设置它的名称的命令。 (注意,使用ShowImage
不会改变这一点。可以在相同的数据上创建多个显示 - 实际上有时非常有用。)
现在,如果您希望 subIMG
成为自己的图像,那么您实际上需要将(子采样的)数据复制到新的内存位置。根据您的建议,使用=
会自动执行此操作,但仅针对值而不是任何元数据。
要从映像复制值和元数据,您需要使用命令ImageClone
。所以在上面的脚本中,你想要做的是:
image IMG := RealImage("",4,1024,1024,11)
number sizeX, sizeY, sizeZ
IMG.Get3DSize(sizeX, sizeY, sizeZ)
number sizeZ1 = (sizeZ+1)/2
image subIMG := IMG.Slice3(0,0,0,0,sizeX,1,1,sizeY,1,2,sizeZ1,2).ImageClone()
subIMG.SetName("Sub-volume of a Stack")
subIMG.ShowImage()