繁体   English   中英

如何使用脚本重塑DM中数据多维数据集的维

[英]How to reshape the dimension of data cube in DM with script

我有一个尺寸为1024 * 1024的图像存储在HDF5文件中,该文件被视为切片厚度为1的数据立方体(因此存储的尺寸为1024 * 1024 * 1)。 我使用Niermann HDF5插件( https://github.com/niermann/gms_plugin_hdf5 )导入数据。 导入后,数据立方体变为1 * 1024 * 1024,并显示为1像素宽,1024像素高和1024个切片图像。

在考虑重新实现该插件之前,我想问一下,是否有任何方法可以“重塑”数据(例如在“ Numpy.reshape”中),以便可以正确处理尺寸?

谢谢!

如果您的输入/输出数组大小在维度上不匹配(这样slice将无法工作),那么您还可以使用以下方法将数据“流”入和移出一维:

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

这里的技巧是,您可以使用方括号在图像表达式中寻址单个值。 在[X,Y,Z]的3D图像中,在[X,Y]的2D图像中,以及在[D,0]的1D图像中。 [*]

内部变量icolirowiplane由X,Y,Z所取代的评价表达的坐标,而iwidthiheightidepth由所评估的表达式的尺寸大小替换。

计算表达式的大小是多少? 它由该行中唯一的“已知大小”的图像(左侧或右侧)定义,因此

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]已用于子区域,因此不支持更高的尺寸。

如果您不喜欢icol,irow和这些表达式,那么另一个不错的解决方案是只使用流对象。

image ReShape3D( image input, number sx, number sy, number sz )
{
    // Perform testing
    number nPix=1
    for ( number d=0; d<input.ImageGetNumDimensions(); d++ )
        nPix *= input.ImageGetDimensionsize(d)

    if ( sx*sy*sz < nPix ) Throw( "Input image larger than provided shape." )
    if ( sx*sy*sz > nPix ) Throw( "Input image smaller than provided shape." )

    image reShaped := input.Imageclone()
    reShaped.ImageResize(3,sx,sy,sz)
    object dStream = NewStreamFromBuffer(0)
    ImageWriteImageDataToStream(input,dStream,0)
    dStream.StreamSetPos(0,0)
    ImageReadImageDataFromStream(reShaped,dStream,0)
    return reshaped
}

Image before := RealImage("Before",4,10,20,30)
before = random()
Image after := ReShape3D( before,20,10,30 )
before.ShowImage()
after.ShowImage()

在对“ DM脚本手册”中的示例进行了几次尝试之后,找到了一种方法:

image out = in.slice2(0,0,0, 1,1024,1, 2,1024,1)

也就是说,xy中的输出2d图像使用Slice2()命令获取了输入图像的yz平面的投影。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM