【发布时间】:2021-01-07 05:35:46
【问题描述】:
我知道如何在前面显示的单个图像中添加箭头,但现在我需要在图像堆栈的每一帧上添加箭头注释以指示对比度变化位置并使用 GSM“切片播放器”显示它们。怎么做?
【问题讨论】:
-
我猜“GSM 'slice player'”需要堆栈图像作为一个整体,是吗?否则,您可以将箭头注释 (
NewArrowAnnotation()) 添加到堆栈中每个图像的图像显示中。
标签: dm-script
我知道如何在前面显示的单个图像中添加箭头,但现在我需要在图像堆栈的每一帧上添加箭头注释以指示对比度变化位置并使用 GSM“切片播放器”显示它们。怎么做?
【问题讨论】:
NewArrowAnnotation()) 添加到堆栈中每个图像的图像显示中。
标签: dm-script
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)
【讨论】: