3

以下の画像には、いくつかの特定のパターンがあります。最初の画像で最もよく見えます。小さな円でマークされ、線で接続されたポイントがあります。彼らはいくつかのネットパターンを作ります。いくつかの点が間違っていて、パターンに適合していません(最初の画像にマークされています)。目的は、赤でマークされた長方形全体を塗りつぶすことです(長方形は極値点から作成されます-パターン座標系の極値座標を持つ点)。

問題は、長方形を点で埋め、間違った点を排除するためにどのようなアプローチを取るべきかということです。2番目の画像の状況は極端ですが、主にケースはより多くのポイントがあります。

画像は視覚化のみを目的としています。点座標のベクトルがあります。ポイントを検出する必要はありません。

解決策がわかり次第、追加します。

私の現在のアプローチは、既知のパターンオフセットで長い長方形の辺に平行な線を作成することです。次に、線の近くにデルタ距離があるポイントを探し、残りのポイントを埋めます。

4

2 に答える 2

2

全体として、最初にグリッドを決定し、そのグリッド上に何かがあるかどうかを簡単に確認できるようにします。

手順は次のとおりです。

  • 水平線と垂直線だけになるようにすべてを回転させます。

  • x 値ごとに、あなたが持っているポイント数を数えます。

  • y 値ごとに、あなたが持っているポイント数を数えます。

疑似コード:

xcount is array of int
ycount is array of int

for x=0 to width-1 do
  for y=0 to height-1 do
    foreach point do
      if point.x = x then
        xcount[x]++
      if point.y = y then
        ycount[y]++ 

最後の画像の場合、結果は次のようになります。

x-count:1,0,0,0,3,0,2,0,1,0,0,0,4,0,0,0,3,0,0,0,4
y-count:2,0,0,0,6,0,0,0,4,0,1,0,3,0,1,0,1
  • グリッドサイズを検出するには:

    match = 0 for i=1 to 10 do foreach xcount do if xcount mod i=0 then matches[i]++

これで、10 個の異なるグリッド サイズのスコア (一致するポイントの数) を含む配列ができました。次のようになります。

gridscores[] = 5,5,0,5,34,5,0,5

XgridSize = index of greatest gridSore
  • 34 は明らかに最適な一致であり、インデックス 5 にあるため、グリッド サイズは 5 です。

  • グリッド サイズがわかったので、そのグリッド上にないポイントを簡単に見つけることができます。

    foreach point do wrongpoint = (point.x mod XgridSize != 0) または (point.y mod YgridSize != 0)

これは、間違った点がたくさんある場合でも機能します。回転方法とグリッドのオフセットを見つける方法については詳しく説明しませんでしたが、これは正しい方向に進むのに役立つかもしれません。

于 2012-10-30T15:17:19.740 に答える
1

ポイントは、2 組の平行線に沿って配置されます。これらの線を検出する最も簡単な方法は、ハフ変換です。

ハフ変換を実行すると、2D ヒストグラムが得られます。1 つの次元 (列) は線の方向に対応し、他の次元 (行) は線のオフセットに対応します。同じ列の要素を合計し、結果のベクトルで 2 つの最大値を見つけます。これらの最大値の 1 つに近い列の同じ行の要素を一緒に追加し、結果のベクトルで周期的なパターンを見つけます (ここでは高速フーリエ変換が役立つ場合があります)。他の最大値についても同じことを行います。

その結果、2 組の平行線のそれぞれの方向、周期、およびオフセットが得られます。長方形を適切な点で塗りつぶすには、これらの一連の線の交点を取得するだけです。

于 2012-10-30T13:13:47.877 に答える