我想将图像分成一系列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图像?或者我应该如何更改代码来实现它?
答案 0 :(得分:1)
这篇文章正在回答你关于你想要实现的事情的问题(分裂和图像)。
是的,有更好的方法可以做到这一点。你可以解决任何&#34;小节&#34;通过使用[ t, l, b, r ]
表示法直接使用4个数字来指定区域的数据。 t
顶部,l
左侧,b
底部,r
,右侧如下:
或者,或者,您可以使用slice
命令使用起点来解决子部分,然后为每个输出维度指定一个三元组,指定方向,长度,步幅,如: / p>
// 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[] )