将STEM数据多维数据集乘以图像

时间:2018-07-31 14:50:25

标签: image-processing multidimensional-array indexing dm-script

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

2 个答案:

答案 0 :(得分:1)

有不同的方法可以做到这一点。以下脚本为以下创建两个测试图像:

xtree

变种1

要将两者相乘,实际上可以使用与编写的表达式非常相似的表达式。固有变量< 1.5MBImage 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

变种2

您还可以使用切片并遍历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()