Image processing 将STEM数据立方体与图像相乘

Image processing 将STEM数据立方体与图像相乘,image-processing,multidimensional-array,indexing,dm-script,Image Processing,Multidimensional Array,Indexing,Dm Script,我想用厚度图乘以EELS数据立方体的强度。我尝试使用简单的数学命令,但只得到第一个切片的结果。我认为计算非常简单,只需执行结果(x,y,E)=SI(x,y,E)*厚度(x,y)并在x和y上循环,但我不知道如何使用DM脚本执行此操作。 非常感谢。 关于有不同的方法可以做到这一点。以下脚本为以下内容创建两个测试图像: Image SIStack := RealImage( "Stack", 4, 32,32,64) SIStack = iplane + 1 + random() Image Map2

我想用厚度图乘以EELS数据立方体的强度。我尝试使用简单的数学命令,但只得到第一个切片的结果。我认为计算非常简单,只需执行
结果(x,y,E)=SI(x,y,E)*厚度(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 要将两者相乘,您确实可以使用与您所写内容非常相似的表达式。内部变量
icol
irow
iplane
(或者更一般地说
iindex(n)
)被X、Y和Z各自的像素索引所取代(请注意,第一个索引从0开始!)。可以将它们用作表达式中的“运行变量”。因此,以下内容将满足您的要求:

Image ResultStack := RealImage( "RStack", 4, 32,32,64)
ResultStack = SIStack[icol,irow,iplane] * Map2D[icol,irow]
ResultStack.ShowImage()
上面是你的方程式的1:1翻译,我把它打出来让它更清楚。请注意,在这种类型的表达式中,至少有一部分需要是“静态”大小,即不被索引。这将定义icol/irow/iplane索引将在哪个范围内运行。在上面的示例中,左侧的
ResultStack
提供了这一点,因此
icol
0
变为
ResultStack的size-x减去1

作为辅助:如果
Map2D
小于正在运行的变量,这甚至可以工作!任何“超出边界”的索引都将被视为最后可用的索引,基本上是对“边界”值的外推

现在,可以更简洁地编写上面的脚本(并且不使用附加的“ResultsStack”),如下所示:

变式2 也可以在z维度上使用切片和迭代:

for( number i = 0; i<64; i++ )
    SIStack.Slice2(0,0,i, 0,32,1 ,1,32,1 ) *= Map2D
(数字i=0;i谢谢。 这是我写的脚本。唯一的问题是,创建的datacube没有被识别为EELS datacube

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()
图像厚、si、res、out
数字宽度、高度、xsize、ysize、zsize、i
//选择图像
string title=“图像选择对话框”
string prompt=“请选择两个图像。”
字符串标签\u si=“si:”
字符串标签\u thick=“厚度贴图:”
if(!GetTwoLabeledImagesWithPrompt(提示、标题、标签_-si、si、标签_-thick、thick))
抛出(“用户按下取消”)
res=si
ImageCopyCalibrationFrom(分辨率,si)
//不同图像的大小
厚度。GetSize(宽度、高度)
si.Get3DSize(xsize、ysize、zsize)
结果(“width=“+width+”像素“+”,height=“+height+”像素\n”)
结果(“SI xsize:+xsize+”ysize:+ysize+”Nb能量通道:“+zsize+”\n”)

对于(数字i=0;ii在您的等式中,您实际上需要在所有三个变量(x、y和E)上循环,因为E的每个值代表一个“图像切片”下面答案中的第一个变量正是这样做的。如果它只针对一个单一的E值,你只需要将两个图像像素相乘,这在DM脚本中与
a*=B
一样简单,这就是第二个变量所做的(在E上迭代)。谢谢。我的脚本如下所示:这是因为
image=image
只是复制值,SI信息存储在元数据中。通常最好使用
image img:=sourceImg.imageClone()创建一个正确的(深层)克隆
您也不需要复制任何校准。因此,只需在上面的脚本中使用
res:=si.imageClone()
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()