我的图像中有定期排列的原子。
我正在尝试编写一个脚本,通过在左上角的原子上指定ROI来计算在第一列中排列的原子数,然后让脚本从左到右扫描(列)按列)。我的想法是,通过使用从左到右扫描的ROI,以及点击超出边界的像素(这意味着它已经不在图像中),该脚本返回一行中的原子数,而不是给出一个错误输出,说“已经引用了图像边界之外的像素”。
有没有办法让上述案例可以用脚本编写?
谢谢。
答案 0 :(得分:1)
您可以捕获脚本代码抛出的任何异常,以便使用
自行处理它Try(){ }
Catch{ break; }
构造。但是,这不是解决问题的最佳解决方案。如果你知道图像的大小,你真的应该使用这些知识来阻止访问债券之外的数据。使用Try{}Catch{}
最好留给“任何意外的”可能发生的情况,并且您仍然想要处理问题。
以下是您问题的代码示例。
number boxSize = 3
number sx = 10
number sy = 10
image img := realImage( "Test", 4, sx, sy )
img = random()
// Output "sum" over scanned ROI area
// Variant 1: Just scan -- Hits an exception, as you're moving out of range
/*
for( number j=0;j<sy;j++)
for( number i=0;i<sx;i++)
{
Result("\n ScanPos: " + i +" / " + j )
Result("\t SUM: "+ sum( img[j,i,j+boxSize,i+boxSize] ) );
}
*/
// Variant 2: As above, but catch exception to just continue
for( number j=0;j<sy;j++)
for( number i=0;i<sx;i++)
{
Result("\n ScanPos: " + i +" / " + j )
Try
{
Result( "\t SUM: "+ sum( img[j,i,j+boxSize,i+boxSize] ) );
}
catch
{
Result( "\t ROI OUT OF RANGE" )
break; // Needed in scripting, or the exception is re-thrown
}
}
// Variant 3: (Better) Avoid hitting the exception by using the knowlede of data size
for( number j=0;j<sy-boxSize;j++)
for( number i=0;i<sx-boxSize;i++)
{
Result("\n ScanPos: " + i +" / " + j )
Result("\t SUM: "+ sum( img[j,i,j+boxSize,i+boxSize] ) );
}
答案 1 :(得分:1)
回答接受回答的评论中的问题: 您可以查询图像上的任何ROI /选择,并使用此信息来限制迭代。 以下示例显示了这一点。它还显示了如何正确使用ROI对象,既可以进行选择,也可以添加新的ROI。更多信息可在F1帮助中找到:
脚本采用最前面的图像,上面只有一个选择。 然后,它从左上角开始迭代选择(以给定的步长),并输出区域的和值。最后,您可以选择将已用区域绘制为新的ROI。
List<Object> products = ((IEnumerable)dgvPapers.DataSource).Cast<object>().ToList();
List<ContractPaperStepDTO> altered = new List<ContractPaperStepDTO>();
foreach (var item in products)
{
altered.Add((ContractPaperStepDTO)item);
}
altered = altered.Where(c => c.PaperName.ToLower().Contains(tbSearchContracts.Text.ToLower())).ToList();
dgvPapers.DataSource = altered;
dgvPapers.Update();
}