将 STEM 数据立方体乘以图像

Multiply a STEM datacube by an image

我想将 EELS 数据立方体的强度与厚度图相乘。我尝试使用简单的数学命令,但我只获得了第一个切片的结果。我认为计算就像执行 Result(x,y,E) = SI(x,y,E) * Thickness(x,y) 和在 x 和 y 上循环一样简单,但我不知道如何使用 DM 脚本执行此操作。 谢谢 此致

有多种方法可以做到这一点。以下脚本为下面创建了两个测试图像:

Image SIStack := RealImage( "Stack", 4, 32,32,64)
SIStack = iplane + 1 + random()
Image Map2D := RealImage( "Map", 4, 32, 32 )
Map2D = iradius * sin( irow/iwidth * pi() * 4 )

SIStack.ShowImage()
Map2D.ShowImage()

变体 1

将两者相乘,确实可以使用与您所写的非常相似的表达式。内在变量 icolirowiplane (或更一般地 iindex(n) )被 X、Y 和 Z 的相应像素索引替换(第一个索引从 0 开始, 提个醒!)。您可以将它们用作表达式中的 "running variables"。所以下面会做你想做的事:

Image ResultStack := RealImage( "RStack", 4, 32,32,64)
ResultStack = SIStack[icol,irow,iplane] * Map2D[icol,irow]
ResultStack.ShowImage()

以上是 1:1 对你的等式的翻译,我把它打出来是为了让它更清楚。请注意,在这种类型的表达式中,至少有一部分需要 "static" 大小,即不被索引。这将定义 icol/irow/iplane 索引将 运行 的范围。在上面的例子中,左边的 ResultStack 提供了这个,所以 icol0 变成了 size-x of ResultStack minus 1

顺便说一句:如果 Map2D 小于 运行ning 变量,这甚至有效!任何索引 "out of bounds" 都将被视为最后一个可用索引,本质上是外推 "border" 值。

现在上面的脚本可以写得更紧凑(并且没有附加的 'ResultsStack')为:

SIStack *= Map2D[icol,irow]

变体 2

您还可以在 z 维度上使用切片和迭代:

for( number i = 0; i<64; i++ )
    SIStack.Slice2(0,0,i, 0,32,1 ,1,32,1 ) *= Map2D

有关任一变体的更多详细信息,您可能需要查看

谢谢。 这是我写的脚本。唯一的问题是创建的数据立方体未被识别为 EELS 数据立方体。

image thick, si, res, out
number width, height, xsize, ysize, zsize,i
//select images
string title = "Image Selection Dialog"
string prompt = "Please select two images."
string label_si = "SI :"
string label_thick = "Thickness map:"
if ( !GetTwoLabeledImagesWithPrompt( prompt, title, label_si, si, label_thick, thick ) )
 Throw( "User pressed cancel." )
res=si
ImageCopyCalibrationFrom(res, si)
// size of the different images
thick.GetSize(width, height)
si.Get3DSize(xsize, ysize, zsize)
Result("width="+width+" pixels"+", height="+height+" pixels\n")
Result("SI xsize:"+xsize+" ysize:"+ysize+" Nb Energy channels:"+zsize+"\n")
for(number i=0; i<zsize; i++)
{
  res.Slice2(0,0,i,0,xsize,1,1,ysize,1) *= thick  
}
res.ShowImage()