将多个 STEM 信号读入多个数据立方体
Reading in multiple STEM signals into multiple datacubes
我编写了一个通过焦点的 STEM 采集脚本,该脚本使用 DSAcquire
函数读取图像,其中我使用 DSAcquireData(img, signalindex, etc.)
.
指定要读取的信号
上面的好处是我可以在图像不出现在屏幕上的情况下读取图像,将其复制到数据立方体中,然后获取系列中的下一个,等等。
如果我想使用两个信号而不是一个(例如 HAADF 和 BF),看起来唯一的方法是在设置 digiscan 参数后使用 DSStartAcquisition
?
我应该如何将信号复制到两个预分配的图像堆栈(stack1
、stack2
)?最好不要让数十张图片把屏幕弄得乱七八糟(但最好有一定程度的进步?)
这样做的一种方法 - 通过迭代 x 个单独的采集是 F1 帮助示例的直接扩展:
// Acquire 2 signals simultaneously, e.g. HAADF and BF detector
number paramID
number width = 512 // pixel
number height = 512 // pixel
number rotation = 0 // degree
number pixelTime= 2 // microseconds
number lSynch = 1 // activated
paramID = DSCreateParameters( width, height, rotation, pixelTime, lSynch )
number signalIndex, dataType, selected, imageID
signalIndex = 0
dataType = 2 // 2 byte data
selected = 1 // acquire this signal
image img1 := IntegerImage( "Signal 1", dataType, 0, width, height )
img1.ShowImage()
imageID = img1.ImageGetID() // use displayed image
DSSetParametersSignal( paramID, signalIndex, dataType, selected, imageID )
signalIndex = 1
dataType = 2 // 2 byte data
selected = 1 // acquire this signal
image img2 := IntegerImage( "Signal 1", dataType, 0, width, height )
img2.Showimage()
imageID = img2.ImageGetID() // use displayed image
DSSetParametersSignal( paramID, signalIndex, dataType, selected, imageID )
number continuous = 0 // 0 = single frame, 1 = continuous
number synchronous = 1 // 0 = return immediately, 1 = return when finished
// Create stack to copy data to
number nplanes = 10
image stack1 := img1.ImageClone()
stack1.ImageResize(3,width,height,nplanes)
stack1.SetName("Signal 1 (stack)")
stack1.ShowImage()
image stack2 := img2.ImageClone()
stack2.ImageResize(3,width,height,nplanes)
stack2.SetName("Signal 2 (stack)")
stack2.ShowImage()
//Quickly arrange image
EGUPerformActionWithAllShownImages("arrange")
// Iterated acquisition
for( number i=0; i<nPlanes; i++ )
{
DSStartAcquisition( paramID, continuous, synchronous )
// Copy data
stack1.slice2(0,0,i, 0,width,1, 1,height,1) = img1
stack2.slice2(0,0,i, 0,width,1, 1,height,1) = img2
}
DSDeleteParameters( paramID ) // remove parameters from memory
但是,这将在每一帧重新开始新的 Digiscan 采集。您可能更喜欢通过连续采集和图像侦听器来执行此操作。
为此,您很可能会按照 F1 帮助中的说明连接 image-listener:
Digiscan 采集 - 根据速度 - 将每帧更新图像数次,因此您需要检查它是否 end-of-frame。
执行此操作的一种方法是使用 data_value_changed 事件,然后检查图像中的最后一个像素是否已更改值。另一种选择是使用 tags_changed 事件,因为显然采集图像的标签每帧更新一次。不过,这两种选择都有一些潜在的问题。
另请参阅最近关于此主题的非常相关的问题:
我编写了一个通过焦点的 STEM 采集脚本,该脚本使用 DSAcquire
函数读取图像,其中我使用 DSAcquireData(img, signalindex, etc.)
.
上面的好处是我可以在图像不出现在屏幕上的情况下读取图像,将其复制到数据立方体中,然后获取系列中的下一个,等等。
如果我想使用两个信号而不是一个(例如 HAADF 和 BF),看起来唯一的方法是在设置 digiscan 参数后使用 DSStartAcquisition
?
我应该如何将信号复制到两个预分配的图像堆栈(stack1
、stack2
)?最好不要让数十张图片把屏幕弄得乱七八糟(但最好有一定程度的进步?)
这样做的一种方法 - 通过迭代 x 个单独的采集是 F1 帮助示例的直接扩展:
// Acquire 2 signals simultaneously, e.g. HAADF and BF detector
number paramID
number width = 512 // pixel
number height = 512 // pixel
number rotation = 0 // degree
number pixelTime= 2 // microseconds
number lSynch = 1 // activated
paramID = DSCreateParameters( width, height, rotation, pixelTime, lSynch )
number signalIndex, dataType, selected, imageID
signalIndex = 0
dataType = 2 // 2 byte data
selected = 1 // acquire this signal
image img1 := IntegerImage( "Signal 1", dataType, 0, width, height )
img1.ShowImage()
imageID = img1.ImageGetID() // use displayed image
DSSetParametersSignal( paramID, signalIndex, dataType, selected, imageID )
signalIndex = 1
dataType = 2 // 2 byte data
selected = 1 // acquire this signal
image img2 := IntegerImage( "Signal 1", dataType, 0, width, height )
img2.Showimage()
imageID = img2.ImageGetID() // use displayed image
DSSetParametersSignal( paramID, signalIndex, dataType, selected, imageID )
number continuous = 0 // 0 = single frame, 1 = continuous
number synchronous = 1 // 0 = return immediately, 1 = return when finished
// Create stack to copy data to
number nplanes = 10
image stack1 := img1.ImageClone()
stack1.ImageResize(3,width,height,nplanes)
stack1.SetName("Signal 1 (stack)")
stack1.ShowImage()
image stack2 := img2.ImageClone()
stack2.ImageResize(3,width,height,nplanes)
stack2.SetName("Signal 2 (stack)")
stack2.ShowImage()
//Quickly arrange image
EGUPerformActionWithAllShownImages("arrange")
// Iterated acquisition
for( number i=0; i<nPlanes; i++ )
{
DSStartAcquisition( paramID, continuous, synchronous )
// Copy data
stack1.slice2(0,0,i, 0,width,1, 1,height,1) = img1
stack2.slice2(0,0,i, 0,width,1, 1,height,1) = img2
}
DSDeleteParameters( paramID ) // remove parameters from memory
但是,这将在每一帧重新开始新的 Digiscan 采集。您可能更喜欢通过连续采集和图像侦听器来执行此操作。
为此,您很可能会按照 F1 帮助中的说明连接 image-listener:
Digiscan 采集 - 根据速度 - 将每帧更新图像数次,因此您需要检查它是否 end-of-frame。
执行此操作的一种方法是使用 data_value_changed 事件,然后检查图像中的最后一个像素是否已更改值。另一种选择是使用 tags_changed 事件,因为显然采集图像的标签每帧更新一次。不过,这两种选择都有一些潜在的问题。
另请参阅最近关于此主题的非常相关的问题: