【问题标题】:How to append a n-dimension image to the end of a (n+1)-dimension image?如何将 n 维图像附加到 (n+1) 维图像的末尾?
【发布时间】:2018-03-22 17:19:39
【问题描述】:

我有一个尺寸为 4D 的数据集,例如 100(宽度)x 100(高度)x 2048(能量通道)x 20(帧)。 有没有什么功能或方法可以将相同宽度、高度和能量通道的 3D 数据立方体(帧)附加到 4D 数据集的末尾? 最后4D数据集应该是100*100*2048*21。

【问题讨论】:

    标签: dm-script


    【解决方案1】:

    没有以这种方式扩展图像对象的命令。

    您必须将其作为手动副本执行。 (不幸的是,这需要额外的内存。)

    number sx = 100
    number sy = 100
    number sz = 100
    number sf = 10
    
    image before := RealImage( "Before", 4, sx, sy, sz, sf )
    before = icol
    image addFrame := RealImage( "Frame", 4, sx, sy, sz )
    addFrame = irow
    
    image after := RealImage( "After", 4, sx, sy, sz, sf + 1)
    after.SliceN( 4,4, 0,0,0,0, 0,sx,1, 1,sy,1, 2,sz,1, 3,sf,1 ) = before
    after.SliceN( 4,4, 0,0,0,sf, 0,sx,1, 1,sy,1, 2,sz,1, 3,1,1 ) = addFrame
    before.showimage()
    after.ShowImage()
    

    如果这是一个问题,您也可以使用流式传输命令将数据(仅值,无元数据)直接流式传输到缓冲存储器或硬盘上。只有在最后,您才会将该数据流式传输到适当大小的图像变量中。

    最后,根据您的应用程序,您可能会考虑将新数据作为标签组添加到标签列表(可以附加)。您可以将“图像”存储为标签(TagGroupSetTagAsArray())。同样,您可以在稍后的时间点从这些信息中创建一个“完整的”图像。

    number sx = 100
    number sy = 100
    number sz = 100
    number sf = 10
    
    tagGroup FrameTags = NewTagGroup()
    tagGroup FrameList = FrameTags.TagGroupGetOrCreateTagList( "frames" )
    FrameTags.TagGroupSetTagAsLong( "X Size", sx )
    FrameTags.TagGroupSetTagAsLong( "Y Size", sy )
    FrameTags.TagGroupSetTagAsLong( "Z Size", sz )
    // Add frames whenever you need .....
    for( number f = 0; f < sf; f++ )
    {
        image addFrame := RealImage( "Frame", 4, sx, sy, sz )
        addFrame = random()
        FrameList.TagGroupInsertTagAsArray( f, addFrame )
    }
    // Handle taggroup as you want. (Add to global tags, add to image, store to disc... )
    FrameTags.TagGroupOpenBrowserWindow( "frames", 0 )
    
    // Whenever needed, reconstruct image from frames
    number nsx, nsy, nsz
    FrameTags.TagGroupGetTagAsLong( "X Size", nsx )
    FrameTags.TagGroupGetTagAsLong( "Y Size", nsy )
    FrameTags.TagGroupGetTagAsLong( "Z Size", nsz )
    TagGroup nFrameList
    FrameTags.TagGroupGetTagAsTagGroup( "frames", nFrameList )
    number nsf = nFrameList.TagGroupCountTags()
    
    image after := RealImage( "After", 4, nsx, nsy, nsz, nsf )
    for( number f = 0; f < nsf; f++ )
    {
        image addFrame := RealImage( "Frame", 4, sx, sy, sz )
        FrameList.TagGroupGetIndexedTagAsArray( f, addFrame )
        after.SliceN( 4,4, 0,0,0,f, 0,sx,1, 1,sy,1, 2,sz,1, 3,1,1) = addFrame
    }
    
    after.ShowImage()
    

    【讨论】:

    • 感谢您的详细教程。一个附加问题:由于这些 4D 数据可能非常庞大且非常稀疏(许多零),是否有任何简单的方法来压缩数据(但针对访问进行了优化)?实际上,我的目的是从 Velox 读取多帧 EDX 数据立方体,并以自动方式逐帧评估数据。
    • 不,我不知道。当然不是在 DM 中打开时,因为需要“扩展”数据以进行切片和其他操作。实际上,我使用“保存工作区”功能来存储 STEM SI 数据,因为它执行可选的 ZIP 压缩。
    • 我不知道 Velox 格式。你能用它输入(二进制)吗?如果是这样,那可能是一个不错的选择 - 流入“你需要的”进行处理 - 并流出结果。
    • Velox 使用非常紧凑的 Stream Event 方法将 4D SI 存储为 1D:stream 中的数字表示 EDX-event 的通道,如果数字为 65535(最大 2byte),则表示'转到下一个像素'。扫描沿 X(快方向)和 Y(慢方向)进行,X 线末端没有标记,因此帧的大小为宽度 * 高度 + 事件数。这样,100*100*2048*10 数据,典型的每像素 5 个事件导致数据大小为 100*100*(5+1)*10 * 2byte = 1.14MB。但是在 DM 中将是 100*100*2048*10 * 2byte = 390 MB!顺便说一句,需要元数据来重建流。
    • @w4m 感谢您的信息!当然,存储“小”的东西相对容易。当一个人想要对数据进行操作时(例如,使用选择器工具或切片工具),就会出现问题,因为您要么需要一种复杂的访问方法(慢),要么需要内存来保存东西。无论如何,没有什么能阻止您使用相同的算法存储 DM EDS 数据,只需使用流命令。就个人而言,我发现 DM4 文件的简单 ZIP(或类似文件)也可以很方便地完成此操作。
    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2013-07-26
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多