捕获“边界之外的像素”例外?

时间:2017-05-29 07:51:40

标签: exception pixel dm-script

我的图像中有定期排列的原子。

我正在尝试编写一个脚本,通过在左上角的原子上指定ROI来计算在第一列中排列的原子数,然后让脚本从左到右扫描(列)按列)。我的想法是,通过使用从左到右扫描的ROI,以及点击超出边界的像素(这意味着它已经不在图像中),该脚本返回一行中的原子数,而不是给出一个错误输出,说“已经引用了图像边界之外的像素”。

有没有办法让上述案例可以用脚本编写?

谢谢。

2 个答案:

答案 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帮助中找到:

enter image description here

脚本采用最前面的图像,上面只有一个选择。 然后,它从左上角开始迭代选择(以给定的步长),并输出区域的和值。最后,您可以选择将已用区域绘制为新的ROI。

enter image description here enter image description here

  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();
}