如果您的输入/输出数组大小在维度上不匹配(这样slice 将不起作用),那么您还可以使用以下命令将数据“流式传输”进出 1D:
number sx = 4
number sy = 5
number sz = 2
image oneLine := RealImage( "1D",4, sx*sy*sz )
oneLine = icol
oneLine.ShowImage()
image reShape1Dto3D := RealImage( "1D->3D", 4, sx, sy, sz )
reShape1Dto3D = oneLine[icol + iwidth*irow + iwidth*iheight*iplane, 0 ]
reShape1Dto3D.ShowImage()
image reShape3Dto1D := RealImage( "3D->1D", 4, sx*sy*sz )
reShape3Dto1D[icol + iwidth*irow + iwidth*iheight*iplane, 0 ] = reShape1Dto3D
reShape3Dto1D.ShowImage()
这里的技巧是,您可以使用方括号来处理图像表达式中的单个值。在 3D 图像中为 [X,Y,Z],在 2D 图像中为 [X,Y],在 1D 图像中为 [X,0]。 [*]
内部变量icol、irow、iplane被计算表达式的X、Y、Z坐标替换,而iwidth、iheight和idepth被替换为尺寸大小求值的表达式。
求值表达式的大小是多少?它由该行中唯一的“已知大小”图像定义 - 左侧或右侧,因此
reShape1Dto3D = oneLine[ icol + iwidth*irow + iwidth*iheight*iplane, 0 ]
在表达式的左侧成为 reShape1Dto3D 的所有像素的 X/Y/Z 循环。对于每个三元组 (X/Y/Z),该值取自 oneLine 的计算位置。
完全一样的用在
reShape3Dto1D[ icol + iwidth*irow + iwidth*iheight*iplane, 0 ] = reShape1Dto3D
但是这里的循环再次超过了 reShape1Dto3D 的大小,因为那是行中“已知大小”的图像,即使它在右侧。
* 这种方式不支持更高维度,因为 [T,L,B,R] 已用于子区域。