快速累积和?

Fast Cumulative Sum?

菜单命令“音量 > 投影 > 沿 Z 方向投影”与脚本(即使使用内部变量)相比非常快。 z 方向上 512x512x200 的 3D 图像体积的累积和(投影)需要 <0.5 秒。与 >8 秒相比。通过使用脚本。除了使用 ChooseMenuItem() 之外,是否可以直接访问此脚本函数?

显示差异的脚本示例:

// create an image of 512x512x200, assign random numbers
image img := exprsize(512, 512, 200, random());
img.SetName( "test" );
img.ShowImage();
//
number start_tick, end_tick, calc_time;

// do volume projectin with menu command : Volume>Project>Project Along Z
start_tick = GetHighResTickCount();
    ChooseMenuItem( "Volume", "Project", "Project Along Z");    // do z-projection
end_tick = GetHighResTickCount();
// calculate execution time 
calc_time = CalcHighResSecondsBetween( start_tick, end_tick );

// display result image
Image img_projZ1 := GetFrontImage();
img_projZ1.SetName( "Z-proj.#1 (" + calc_time.format("%.2fs") + ")");
img_projZ1.ShowImage();

// do volume project in z-direction (using intrinsic variable iplane)
image img_projZ2 := exprsize(512, 512, 0.0);

start_tick = GetHighResTickCount();
    img_projZ2[icol, irow, iplane] += img;  // do z-projection
end_tick = GetHighResTickCount();

// calculate execution time 
calc_time = CalcHighResSecondsBetween( start_tick, end_tick );

// display result image
img_projZ2.SetName( "Z-projection#1 (" + calc_time.format("%.2fs") + ")");
img_projZ2.ShowImage();

使用内部变量不是在编写脚本时最快的方法。 (它曾经在很久以前的 GMS 1 中。)

事实上,如果您将它作为切片上的 for 循环来执行,您会比使用命令菜单更快 - 很可能是由于调用该命令的开销和标记结果。

// create an image of 512x512x200, assign random numbers
number sx = 512
number sy = 512
number sz = 200

image img := RealImage("",8,sx,sy,sz)
img = random();
img.SetName( "test" );
img.ShowImage();

number start_tick, end_tick, calc_time;

// do volume projectin with menu command : Volume>Project>Project Along Z
start_tick = GetHighResTickCount();
ChooseMenuItem( "Volume", "Project", "Project Along Z");    // do z-projection
end_tick = GetHighResTickCount();

// calculate execution time 
calc_time = CalcHighResSecondsBetween( start_tick, end_tick );

// display result image
Image img_projZ1 := GetFrontImage();
img_projZ1.SetName( "Z-proj.#1 (" + calc_time.format("%.2fs") + ")");
img_projZ1.ShowImage();

// do volume project in z-direction (using intrinsic variable iplane)
image img_projZ2 := img_projZ1.ImageClone()
img_projZ2 = 0
start_tick = GetHighResTickCount();
for(number i=0; i<sz; i++)
    img_projZ2 += img.slice2(0,0,i,0,sx,1,1,sy,1)
end_tick = GetHighResTickCount();

// calculate execution time 
calc_time = CalcHighResSecondsBetween( start_tick, end_tick );

// display result image
img_projZ2.SetName( "Z-projection#1 (" + calc_time.format("%.2fs") + ")");
img_projZ2.ShowImage();

However, to answer your questions for a command: GMS 3.4 has a command called:

RealImage Project( BasicImage img, Number axis )
RealImage Project( BasicImage img, Number axis, Boolean rescale )
void Project( BasicImage img, BasicImage dst, Number axis )
void Project( BasicImage img, BasicImage dst, Number axis, Boolean rescale )

But this command is not officially documented, so it might be renamed/removed at any time.