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