问题描述
我编写了一个通过焦点的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",width,height )
img1.ShowImage()
imageID = img1.ImageGetID() // use displayed image
DSSetParametersSignal( paramID,signalIndex,imageID )
signalIndex = 1
dataType = 2 // 2 byte data
selected = 1 // acquire this signal
image img2 := IntegerImage( "Signal 1",height )
img2.Showimage()
imageID = img2.ImageGetID() // use displayed image
DSSetParametersSignal( paramID,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,nplanes)
stack1.SetName("Signal 1 (stack)")
stack1.ShowImage()
image stack2 := img2.ImageClone()
stack2.ImageResize(3,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,i,1,1) = img1
stack2.slice2(0,1) = img2
}
DSDeleteParameters( paramID ) // remove parameters from memory
但是,这将在每帧重新开始新的Digiscan采集。您可能希望通过连续采集和图像侦听器来完成此操作。
根据速度的不同,Digiscan采集将每帧更新几次图像,因此您需要检查一下是否是帧结束。
执行此操作的一种方法是使用 data_value_changed 事件,然后检查图像中的最后一个像素是否已更改值。另一种选择是使用 tags_changed 事件,因为显然采集图像的标签每帧更新一次。不过,这两个选项都有一些潜在的问题。
另请参阅与此主题相关的最新问题:Fastest way to see which pixel has changed when using a listener