我想将EELS数据立方体的强度乘以厚度图。我尝试使用简单的数学命令,但仅获得第一个切片的结果。我认为计算就像完成Result(x,y,E) = SI(x,y,E) * Thickness(x,y)
一样简单,并且可以在x和y上循环,但是我不知道如何使用DM脚本执行此操作。
谢谢
问候
答案 0 :(得分:1)
有不同的方法可以做到这一点。以下脚本为以下创建两个测试图像:
xtree
要将两者相乘,实际上可以使用与编写的表达式非常相似的表达式。固有变量< 1.5MB
,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()
和icol
(或更常见的是irow
)分别由X,Y和Z的像素索引代替(第一个索引从0开始, 提个醒!)。您可以将它们用作表达式中的“运行变量”。因此,以下将满足您的要求:
iplane
上面是您的等式的1:1翻译,为清楚起见,我进行了键入。注意,在这种类型的表达式中,它的至少一部分需要具有“静态”大小,即不被索引。这将定义icol / irow / iplane索引将在哪个范围内运行。在上面的示例中,左侧的iindex(n)
提供了此功能,因此Image ResultStack := RealImage( "RStack", 4, 32,32,64)
ResultStack = SIStack[icol,irow,iplane] * Map2D[icol,irow]
ResultStack.ShowImage()
从ResultStack
变为icol
。
顺便说一句:即使0
小于运行变量,这也可以使用!任何超出范围的索引都将被视为最后一个可用索引,本质上是将“边界”值外推。
现在,上面的脚本可以更紧凑地编写(并且没有附加的“ ResultsStack”),如下所示:
size-x of ResultStack minus 1
您还可以使用切片并遍历z维:
Map2D
有关任一变体的更多详细信息,您可能需要查看this answer
答案 1 :(得分:0)
谢谢。 这是我写的脚本。唯一的问题是,创建的数据多维数据集未被识别为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()