如何将图像拆分为子图像?

How to split an image into subimages?

我想将一张图片分成一系列 256x256 像素的图片。

我想到的唯一编码方法是在图像上绘制256x256 ROI,然后create/crop从ROI区域绘制新图像。 (请参阅下面的代码。)

Number size_x, size_y
image img 
img := GetFrontImage()
getsize( img, size_x, size_y )
showimage( img )

number x, y
For( y=0; y+256<size_y; y+=256 )
{
    For ( x=0; x+256<size_x; x+=256 )
    {
         ROI EMROI = NewROI()
         EMROI.ROISetRectangle( x, y, 256, 256 )
         img.ImageGetImageDisplay(0).ImageDisplayAddROI( EMROI )
         image cropped=img[]
         showimage(cropped)
    }
}

但有两个错误:脚本只绘制 X 方向的 ROI,而不是 Y 方向,并且它总是只从第一个 ROI 创建新图像。 有没有更好的分割DM图片的方法?或者我应该如何更改我的代码来实现它?

此 post 正在回答您关于您想要实现的目标(图像的拆分)的问题。

是的,有更好的方法来做到这一点。您可以使用 [ t, l, b, r ] 符号直接寻址数据的任何“子部分”,在该符号中您使用 4 个数字指定区域。 t 顶部,l 左侧,b 底部,r,右侧,如:

或者,您可以使用 slice 命令使用起点寻址子部分,然后为每个输出维度指定一个三元组,指定 方向、长度、步幅 如:


您想要的脚本可能是以下脚本的变体

// Create TestImage
number sx = 1024
number sy = 1024
image img := RealImage( "Test", 4, sx, sy )
img = itheta * sin( (iradius+icol)/iwidth * 50 * pi() )
img.ShowImage()

// Split up into N x M images
// Optional: Perform check for integer-values using mod-division (% operator)
number n = 2
number m = 4
number notExact = ( sx % n != 0 ) || ( sy % m != 0 ) 
if ( notExact ) 
    if ( !OKCancelDialog( "The image split is not an integer division. Continue?" ) ) 
        exit(0)

number bx = sx/n
number by = sy/m

for( number row = 0; row < m; row++ )
    for( number col= 0; col< n; col++ )
        {
            // We want the sub-rect. We could use [t,l,b,r] notation, but I prefer slice2()
            number x0 = col * bx
            number y0 = row * by
            image sub := img.Slice2( x0,y0,0, 0,bx,1, 1,by,1 ).ImageClone() // CLONE the referenced data to create a copy
            sub.SetName( img.GetName() + "__"+col+"_"+row )
            sub.ShowImage()
        }

如有不明之处请追问!

这是关于您的脚本有什么问题的答案:

You use the command ROISetRectangle incorrectly.

命令的参数不是 X,Y,height,width 而是相同的 top / left / bottom / right 我在另一个答案中描述的符号 [ t,l,b,r] 表示法。

如果您将这一行替换为:

,您的脚本将真正起作用

EMROI.ROISetRectangle( y, x, y + 256, x + 256 )

There is no need to use "visual" ROIs for what you want. (see )

代替[]使用指定视觉ROI,您可以使用[t,l,b,r]直接指定区域。请注意,您还可以通过一个简单的命令添加您添加的投资回报率:

img.SetSelection( t, l, b, r )

与t,l,b,r同义

您使用的 ImageDisplay 和 ROI 命令是 "lower level" 命令,可以做更多的事情。你可以正确地使用它们,但你并不总是需要使用它们,如果你可以用更简单的命令来完成事情的话。

It is usually a better syntax to define the variables used in a for loop within the for-loop and not outside of it. This will make them local and prevents unwanted potential bugs.

而不是

number x
for( x=0; x<10; x++ )
{
}

使用

for( number x=0; x<10; x++ )
{
}

Careful when copying images. the = operator will only copy the values. You can use the := operator to address any data or sub-data (no addtional memory) and then use the command ImageClone() to create an exact copy, including meta-data such as calibrations or tags.

所以在你的脚本中你可能想要使用

image cropped := ImageClone( img[] )