0

我自己尝试过使用“直线方程之间”的方法,但我需要执行以下操作:

我有一个 n x n 矩阵,它存储 2D 直方图计数。我需要能够按顺序指定点,并让程序计算这些点之间的所有内容。

至少现在,我对一个简单的矩形最满意(但是,矩形可以旋转任意度数)。

矩阵的表示

从我的 Paint.exe 的直方图图片中,您可以看到我希望能够在蓝色框中进行计数。计算水平(右上角)矩形不是问题(将 For 循环中的边界指定为矩阵的开始/结束 bin)。

我被困在如何定义代码中的边界以在另一个(最左边的)蓝色框中进行计数。我正在使用 Igor Pro(来自 WaveMetrics)来执行此操作,因此在大多数情况下,这不是特定于语言的。

基本上,这是用于分析这些图表中感兴趣的区域。有一些工具可以分析带有“多边形/自由形式”类型的东西的图像,但它们无法准确地从该矩阵中获取计数(它们基于图像颜色而不是计数进行分析)。此外,我无法根据“此垃圾箱中是否有超过 X?”进行过滤。因为必须将相同的矩形应用于基线“噪声”矩阵。

想法?我真的坚持要了解这将如何工作的核心概念..

编辑:我的尝试似乎无法正常工作,特别是当我放入一个“盒子”时,它是空的,类似于上面右边的蓝色盒子。我也不一定能改变倾斜的矩形(因为无论如何我们都没有真正的方法来计算它..)

// Find polygon boundaries
s1 = (y2-y1)/(x2-x1)
o1 = s1==inf || s1==-inf ? 0 : y2 - (s1*x2)
s2 = (y3-y2)/(x3-x2)
o2 = s2==inf || s2==-inf ? 0 : y3 - (s2*x3)
s3 = (y4-y3)/(x4-x3)
o3 = s3==inf || s3==-inf ? 0 : y4 - (s3*x4)
s4 = (y1-y4)/(x1-x4)
o4 = s4==inf || s4==-inf ? 0 : y1 - (s4*x1)
// Get highest/lowest points (used in For loop)
maxX = max(max(max(x1, x2), x3), x4)
maxY = max(max(max(y1, y2), y3), y4)
minX = min(min(min(x1, x2), x3), x4)
minY = min(min(min(y1, y2), y3), y4)

For (i=minX; i<=maxX; i+=1) // Iterate over each X bin
        For (j=minY; j<=maxY; j+=1) // Iterate over each Y bin
            //     |                   BETWEEN LINE 1 AND LINE 3?                                |        |                        BETWEEN LINE 2 AND LINE 4?                           |
            If ( ( ((s1*i + o1) > j && j > (s3*i + o3)) || ((s1*i + o1) < j && j < (s3*i +o3)) ) && ( ((s2*i + o2) > j && j > (s4*i + o4)) || ((s2*i + o2) < j && j < (s4*i +o4)) ) )
                totalCount += matrixRef[i][j] // Add the count of this bin to the total count
            EndIf
        EndFor // End Y iteration
    EndFor // End X iteration
4

2 回答 2

2

Igor 有一个比您当前的解决方案更强大的工具

  1. 转到窗口菜单
  2. 选择帮助窗口
  3. 选择“XOP 索引.ihf”
  4. 搜索“选择掩码点”

它将解释如何在图形中定义任何形状的多边形并获得内部点的掩码。然后你可以在它们上运行你想要的任何代码。

您还可以在代码中制作/更改多边形。

于 2013-08-18T15:41:14.253 回答
0

您可以像在水平矩形中一样计算对角矩形中的值,您将有一个更复杂的循环来确定边界的位置。您可以通过循环一个水平矩形来完成此操作,该矩形包括整个对角矩形,并且仅在它们落在对角矩形内时才计算值。

如果您知道构成对角矩形角的点,那么您可以获得每个边界的方程(斜率截距方程)。从那里您可以看到点在每个边界的哪一侧。如果它们位于与矩形内部相对应的侧面,则包含它们,如果它们不是,则不包含它们。

您将不得不为您正在处理的每个点找到边界的 X 和 Y 点。如果你只检查左下角的边框,你会得到类似的东西:

for(each point in the matrix){
  if(point.x > border X value @ height Y && point.y > border Y value @ column X)
    include this point
  else
    don't include it
}

如果您有边界方程并且您知道要分析的点,您可以使用已知的 X 值(从该点)来获取边界的 Y 值(您正在查看的那一列中的高度)和已知的 Y 值(同样,从您正在分析的点开始)以获得边界的 X 值(边界在点的高度处有多远)。

对于完整的条件列表,您应该注意的是:

  • 左下边框:point.x >border.x && point.y >border.y
  • 右下边框:point.x <border.x && point.y >border.y
  • 左上边框:point.x > border.x && point.y <border.y
  • 右上边框:point.x <border.x && point.y <border.y
于 2013-02-04T18:49:52.643 回答