0

私は次の問題を解決しようとしています:

たとえば、

0000000000000000
0011111111110000
0011111111110000
0011111111110000
0000000000000000
0000000111111110
0000000111111110
0000000000000000

フィールド内のすべての長方形の幅と高さを見つける必要があります。入力は実際には一度に1つの列であり(スキャナーが左から右に移動するように考えてください)、プログラムの期間中は継続します(つまり、スキャン列は移動しませんが、長方形はその上を移動します)。

この例では、「長方形が始まるのを待つ」(つまり、ゼロが1に変わるのを待つ)、次にそれが終わるのを見る(1がゼロに戻る)のを見て、「グリッド単位」でピースを測定できます。これは、上記の単純なケースでは問題なく機能しますが、長方形が斜めに傾いている場合は失敗します。次に例を示します。

0000000000000000
0000011000000000
0000111100000000
0001111111000000
0000111111100000
0000011111110000
0000000111100000
0000000011000000

私は当初、次の質問が当てはまると思っていました。

動的計画法-最大の正方形のブロック

でも今はよくわかりません。

回帰または回帰テストの経験はほとんどまたはまったくありませんが、これを8つの変数の入力として表すことができると思います。

正直なところ、これをどのように行うかはまったくわかりません。コードのこの部分が抽出するサイズは、既知のサイズの長方形(つまり、データベースから)に適合させる必要があります。

当初は、既知のデータをトレーニング演習として提供し、陽性のテスト結果を保存できると思っていましたが、ここからどこに行けばよいのかよくわかりません。

あなたが持っているかもしれないアドバイスをありがとう。

4

3 に答える 3

2

スキャン中に遷移点 (1 から 0、またはその逆) を収集し、そこから直接、または各オブジェクトの凸包から長さと幅を計算します。

長方形が重なる可能性がある場合は、より大きな問題が発生します。

于 2010-07-30T15:15:31.667 に答える
1

次の手順を実行します。

  1. すべての列をマトリックスにまとめます(これは適切なフィルタリングに必要です)
  2. 次に、フィルターを適用して(少しグーグルする必要があります)、エッジとコーナーをシャープにします
  3. 次のステップのためにデータを保持するための構造を作成します(これには多くの異なるソリューションがあり、お気に入りのソリューションや最適なソリューションを選択できます)
  4. 垂直方向に(列ごとに)スキャンし、列で見つかった結果の「1」の各セグメント(セグメントは、開始、終了、終了のy座標を見つけたことを意味します)を実行します。
    1. このセグメントが前の列の一部のセグメントと重複していることを確認してください
    2. そうでない場合は、これを新しいrectと見なしてください。長方形オブジェクトを作成し、そのハンドルをセグメントに割り当てます。新しいrectの場合update it's metrics(この操作はセグメントの座標のみを取ります- 、、、、xおよび後で説明します)yminymax
    3. もしそうなら、これが同じrectであると仮定し、rectのハンドルを取り、このハンドルを現在のセグメントに割り当ててから、そのハンドルによってrectを取得します。update it's metrics

それはかなりそれです。この後、それぞれがそのコーナーの4つの座標を持つrectオブジェクトのプールができます。rectの幅と高さを概算するために、いくつかの原始的な計算を行います。では、魔法
はどこにあるのでしょうか?まあ、それはすべてルーチンで起こります。update rect metrics

各rectには、13のメトリックがあります。

  • min X => ymin1、ymax1
  • max X => ymin2、ymax2
  • 最小Y=>xmin1、xmax1
  • 最大Y=>xmin2、xmax2
  • 垂直セグメントの平均の長さ

まず最初に、このrectがスキャングリッド内で適切に位置合わせされているかどうかを判断する必要があります。これを行うために、値average vertical segment lengthとを比較しますmax Y - min Y。それらが同じである場合(97%前後のしきい値を選択し、それを調整して最良の結果を得る)、rectに対して次の座標を想定します。

  1. (最小X、最大Y)
  2. (最小X、最小Y)
  3. (最大X、最大Y)
  4. (最大X、最小Y)。

その他の場合、out rectは回転され、この場合、次のように座標を取得します。

  1. (最小X、(ymin1 + ymax1)/ 2)
  2. ((xmin1 + xmax1)/ 2、最小Y)
  3. (最大X、(ymin2 + ymax2)/ 2)
  4. ((xmin2 + xmax2)/ 2、最大Y)
于 2010-07-30T17:01:57.137 に答える
0

この質問を友人に投げかけたところ、彼は次のように提案しました。

  1. 1 を初めて見たときは、新しい形として保存します。右側を塗りつぶし、それらのポイントを同じ形状に追加します。
  2. 形状に含まれていない入力ピクセルはすべて、新しい形状になります。同じ塗りつぶしを行います。
  3. 次の入力列で、元の形状ポイントから再び塗りつぶします。対応する形状に新しいピクセルを追加します
  4. 塗りつぶしが 2 つの連続する列に新しいピクセルを追加しない場合、形状は完成しています。先に進み、その寸法を決定してみてください

これにより、分離した形状の寸法を取得することができます (例 2 のように)。

このために、次のことを考えました。

  1. 形状の左端のピクセル数が列あたりの平均ピクセル数を下回っている場合、ピースはおそらく回転しています。したがって、最も外側のピクセルを取得してコーナーを見つけます。それらすべての間の距離式を使用します。最大 = 斜辺、その他 = 幅または高さ。
  2. それ以外の場合、このピースはおそらく完全に位置合わせされているため、コーナーはおそらく左上のピクセル、右下のピクセルなどになります。

皆さんはどう思いますか?

于 2010-07-30T15:27:09.397 に答える