【问题标题】:How to add annotation information in each frame of a stack image?如何在堆栈图像的每一帧中添加注释信息?
【发布时间】:2021-01-07 05:35:46
【问题描述】:

我知道如何在前面显示的单个图像中添加箭头,但现在我需要在图像堆栈的每一帧上添加箭头注释以指示对比度变化位置并使用 GSM“切片播放器”显示它们。怎么做?

【问题讨论】:

  • 我猜“GSM 'slice player'”需要堆栈图像作为一个整体,是吗?否则,您可以将箭头注释 (NewArrowAnnotation()) 添加到堆栈中每个图像的图像显示中。

标签: dm-script


【解决方案1】:

DigitalMicrograph 中的 2D 图像和 3D 堆栈之间没有区别。两者都只是维度数据。因此,堆栈中的“切片”既没有单独的标签也没有注释——只有一个 imageTagGroup 和一个 imageDisplays。

因此,要实现您想要的,您需要一种不同的方法。每当显示更新为显示不同的切片时,您都需要移动注释。

为此,您需要在图像显示中添加一个显示侦听器,并对 slice_property_changed 事件采取行动。

一个基本的示例脚本:

Class CStackAnno
{
    ImageDisplay    disp
    Component       arrow
    Number          ListenerID
        
    // This method is called whenever the imagedisplay fires the slice update event
    void OnSlicePropChanged( object self, Number disp_flags, ImageDisplay disp, Number flags1, Number flags2, object slice_id_beg, object slice_id_end )
    {
        image img := disp.ImageDisplayGetImage()
        if ( 3 != img.ImageGetNumDimensions() ) return
        if ( !arrow.ComponentIsValid() ) return
        
        number sx = img.imageGetDimensionsize(0)
        number sy = img.imageGetDimensionsize(1)
        number sz = img.imageGetDimensionsize(2)
        number start, end
        disp.ImageDisplayGetDisplayedLayers( start, end )
        number kLineEndPoint = 2
        arrow.ComponentSetControlPoint( kLineEndPoint, sx/sz * start, sx/sz * start, 0 )
    }
        
    Object Launch( object self, image Img ) 
    {
        if ( !img.ImageIsValid() ) Throw( "Invalid input image." )
        if ( 3 != img.ImageGetNumDimensions() ) Throw( "This script only supports 3D images." )
        disp = img.ImageGetImageDisplay(0)
        
        // Register DisplayListener to catch when it updates
        ListenerID  = disp.ImageDisplayAddEventListener( self, "slice_property_changed:OnSlicePropChanged" )
        
        // Add the annotation
        arrow = NewArrowAnnotation( img.ImageGetDimensionSize(1)/5, img.ImageGetDimensionSize(0)*4/5, 0, 0 )        
        arrow.ComponentSetForegroundColor( 0, 0.5 , 1 )
        arrow.ComponentSetBackgroundColor( 0, 0.8 , 1 )
        arrow.ComponentSetDrawingMode( 1 )
        disp.ComponentAddChildAtEnd( arrow )

        return self
    }
    
}

//Main call
image fImg
GetFrontImage(fImg)
Alloc(CStackAnno).Launch(fImg)

【讨论】:

  • 哇哦!这似乎太酷了,但我需要时间来理解它! :) 顺便说一句,我可以在每个股权切片上添加箭头或文本注释,并按照您在另一个问题中建议的方式分别使用“ImageDisplaySetDisplayedLayers()”将它们导出为彩色图像所以我可以将它们组合成一个堆栈再次通过导入系列或使用这些单独的图像制作电影。
  • @YuanYao 是的,是的。
猜你喜欢
  • 2012-04-13
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多