SetName()命令中的一个奇怪问题

A strange issue in the commad of SetName()

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

这里没什么奇怪,只是使用 := 运算符

的逻辑结果

当您使用 := 分配给图像变量时,您只是在提供对内存位置的引用。 因此,使用

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