0

「線の方程式の間」アプローチを使用して自分で試しましたが、次のことを行う必要があります。

2D ヒストグラム カウントを格納する n 行 n 列の行列があります。ポイントを順番に指定し、プログラムにこれらのポイント間のすべてをカウントさせる必要があります。

少なくとも今のところ、私は単純な四角形で満足しています (ただし、四角形は何度でも回転できます)。

行列の表現

Paint.exe で作成したヒストグラムの図から、青色のボックス内でカウントできるようにしたいことがわかります。水平 (右上) の四角形を数えることは問題ではありません (行列の開始/終了ビンとして For ループ内の境界を指定します)。

コード内の境界を定義して、他の (左端の) 青いボックス内でカウントする方法に行き詰まっています。私はこれを行うために (WaveMetrics の) Igor Pro を使用しているため、ほとんどの場合、これは言語に固有のものではありません。

基本的に、これはこれらのグラフで関心のある領域を分析するためのものです。「ポリゴン/フリーフォーム内」タイプのものに付属する画像を分析するツールがありますが、このマトリックスから正確にカウントを取得することはできません (カウントではなく、画像の色に基づいて分析します)。また、「このビンには 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

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 に答える