SetName()

时间:2018-06-16 13:48:45

标签: dm-script

我在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() 

1 个答案:

答案 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()