我有一个尺寸为1024 * 1024的图像存储在HDF5文件中,该文件被视为切片厚度为1的数据立方体(因此存储的尺寸为1024 * 1024 * 1)。我使用Niermann HDF5插件(https://github.com/niermann/gms_plugin_hdf5)来导入数据。导入后,数据立方体变为1 * 1024 * 1024,显示为1像素宽,1024像素高和1024张图像。
在考虑重新实现插件之前,我想问一下,有没有办法“重塑”数据(比如“Numpy.reshape”),这样可以正确处理尺寸?< / p>
谢谢!
答案 0 :(得分:1)
如果您的输入/输出数组大小尺寸不匹配(这样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()
这里的技巧是,您可以使用方括号来处理图像表达式中的单个值。在[X,Y,Z]的3D图像中,在[X,Y]的2D图像中,在[X,0]的1D图像中。 [*]
内部变量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]已用于子区域。
答案 1 :(得分:1)
如果你不喜欢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()
答案 2 :(得分:0)
在使用&#34; DM脚本手册&#34;中的示例进行了几次试验之后,找到了一种方法:
image out = in.slice2(0,0,0, 1,1024,1, 2,1024,1)
也就是说,x-y中的输出2d图像使用Slice2()命令获取输入图像的y-z平面投影。