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

时间:2017-12-12 18:11:00

标签: image dm-script

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

我想到的唯一编码方法是在图像上绘制256x256 ROI,然后从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,并且它始终仅从第一个ROI创建新图像。 是否有更好的方法来划分DM图像?或者我应该如何更改代码来实现它?

2 个答案:

答案 0 :(得分:1)

这篇文章正在回答你关于你想要实现的事情的问题(分裂和图像)。

是的,有更好的方法可以做到这一点。你可以解决任何&#34;小节&#34;通过使用[ t, l, b, r ]表示法直接使用4个数字来指定区域的数据。 t顶部,l左侧,b底部,r,右侧如下:

Corodinates

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

Slice command

您想要的脚本可能是以下

的变体
// 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()
        }

如果有些事情仍然不清楚,请询问!

答案 1 :(得分:1)

这是关于脚本出现问题的答案:

  

您错误地使用了ROISetRectangle命令。

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

如果用以下代码替换一行,您的脚本实际上会起作用:

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

  

您无需使用“视觉”投资回报率。 (见other answer

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

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

与t,l,b,r的含义相同。

您使用的ImageDisplay和ROI命令是“较低级别”命令,可以执行更多操作。你可以使用它们,但如果你能用更简单的命令完成任务,你并不总是需要使用它们。

  

在for-loop中定义for循环中使用的变量通常是一种更好的语法,而不是在它之外。这将使他们本地并防止不必要的潜在错误。

而不是

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

使用

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

复制图像时要小心。 =运算符只会复制。您可以使用:=运算符地址任何数据或子数据(无附加内存),然后使用命令ImageClone()创建精确副本,包括元数据例如校准或标签。

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

image cropped := ImageClone( img[] )