如果您的输入/输出数组大小在维度上不匹配(这样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] 已经用于子区域。