10

こんにちは、みなさん。私はこれでロジックを理解するのに本当に苦労していて、あなたが私を助けてくれることを望んでいました. 先に進む前に、私はアマチュア プログラマーであり、正式なコンピューター サイエンスのトレーニングを受けていない初心者であることをお伝えしたいと思います。ご容赦ください。:D また、私は Python を使用していますが、Java などを使用することもできます。

とにかく、初歩的な Drawbot で使用する Region Growing の実装を検討しています。地域の拡大に関する記事は次のとおりです: http://en.wikipedia.org/wiki/Region_growing

私が思い描く方法では、抽選の基になる画像は次の基準を満たします。

  • 画像は、任意の色深度で最大 3x3 インチのサイズになります

  • 画像は、白い背景に黒い連続した形になります

  • 形状は、背景のどこにでも配置できます。

この問題に対する次の解決策を検討しました。ある程度機能するものもありますが、それぞれのパフォーマンスまたは実現可能性にかなりの欠陥があります (少なくとも、私には実行可能ではないようです)。さらに、これは Drawbot であるため、これは 1 つの連続した線で行う必要があります。ただし、これは後戻りできないという意味ではなく、複数の開始点 (シード) の可能性を排除するだけです。

考慮されるアプローチ:

ランダムウォーク:

この問題をランダム ウォークで解決することは、私の最初の本能でした。これを実現するランダム ウォーク プログラムは、次のようになると思います。

疑似パイソン...

Cells To Visit = Number of Black Cells
Cells Visited = 0
MarkColor = red
While Cells Visited < Cells To Visit:
    if currentcell is black:
        Mark Current Cell As Visited #change pixel to red
        Cells Visited +=1
    neighbors = Get_Adjacent_Cells() #returns cells either black or red
    next cell = random.choose(neighbors)
    currentCell = next cell

これは実現可能だと思いますが、非常に効果がないように思われ、良い結果を保証するものではありませんが、実際に何かを成し遂げるために、これを試すことになるかもしれません...疑似コードの私のロジックは漠然と正しいですか? ?

掃引パターン:

私には、この方法が最も簡単に実装できるように思えました。ここでの私の考えは、形状の 1 つの極値 (たとえば、一番左の一番下の点) で開始点を選択できるということです。そこから右に描画し、白いピクセルに到達するまで x 軸上でのみ移動します。ここから、y 軸で 1 ピクセル上に移動し、次に x 軸で白いピクセルに到達するまで左に移動します。真上のピクセルがたまたま白だった場合は、その上に黒いピクセルが見つかるまで x 軸をバックトラックします。

さらに調べてみると、この方法にはいくつかの大きな欠点があります。このような形状に直面した場合:

図1

結果は次のようになります。

図2

そして、しばらくしてからスイープを開始するように指示しても、中足はまだ見落とされます。

4/8 コネクテッド ネイバーフッド:

http://en.wikipedia.org/wiki/8-connected_neighborhood

この方法は私には最も強力で効果的であるように見えますが、現時点では完全には理解できません。

すべてのセルで、隣接する黒いセルを見て、どのセルを最初に訪問するかをランク付けする方法を考案し、それらすべてを訪問し、すべてのセルがカバーされるまでプロセスを繰り返します。

ここで見られる問題は、まず、これを達成するために必要なデータ構造を処理することと、その背後にあるロジックを理解することです。


これらは私が考えることができた最良の解決策です。時間を割いて読んでいただきありがとうございます。長いことは承知していますが、できるだけ明確にする必要があると思いました。すべての提案は大歓迎です...ありがとう!

編集:

迷路の生成と解決のアルゴリズムも調べましたが、ここでそれを実装する方法がわかりませんでした。迷路を解くアルゴリズムについての私の理解では、それらは迷路の通路が同じ幅であることに依存しているということです。もちろん、私はそれについて間違っている可能性があります。

4

4 に答える 4

5

疑似コードでの基本的な領域の成長は次のようになります。

seed_point // starting point
visited // boolean array/matrix, same size as image
point_queue // empty queue

point_queue.enqueue( seed_point )
visited( seed_point ) = true

while( point_queue is not empty ) {
    this_point = point_queue.dequeue()
    for each neighbour of this_point {
        if not visited( neighbour ) and neighbour is black/red/whatever
            point_queue.enqueue( neighbour )
            visited( neighbour ) = true
    }
}

// we are done. the "visited" matrix tells
// us which pixels are in the region

あなたが言及したランキングがどこに来るのかわかりません。何か不足していますか?

于 2011-05-01T21:01:41.750 に答える
2

非常に長い質問で混乱しています。

フラッド フィルを実行しようとしているだけではありませんか?

于 2011-05-01T23:23:58.273 に答える
1

これは、再帰的な迷路ソルバーの作成に関する非常に優れた小さなスクリーンキャストです: http://thinkcode.tv/catalog/amazing-python/

解決しようとしている問題のヒントが得られると思います。

また、スクリーンキャストhttp://pastie.org/1854582を見た後に書いた、再帰的な迷路を解くスクリプトも少しあります。等幅の通路は必要ありません。必要なのは、オープン スペース、壁、およびある種の終了条件 (この場合は迷路の終わりを見つけること) だけです。

再帰的にしたくない場合は、「バックトラッキング」メソッドを使用することもできます。このページの迷路のランダム生成で使用されている小さな例を見ることができます: http://weblog.jamisbuck.org/2011/2/7/maze-generation-algorithm-recap (ページの最初の例) .

これは関連しているように聞こえますか?もしそうなら、もっと詳しく説明してほしいことがあれば教えてください。

編集:

これは、python http://www.daniweb.com/software-development/python/threads/148874でフラッド フィルを行うことに関する非常に良い議論のようです。

于 2011-05-01T21:32:17.323 に答える
1

迷路の問題を解決するのに役立つ単純なテクニック (片手を壁に置いておく) が役立つ場合があります。

ただし、ランダムな出発点を選択した場合、そこからどの方向に移動しても、一部を遮断する点を選択する可能性があることに注意してください。つまり、砂時計の形の真ん中から始めた場合、半分しか埋めることができません。

于 2011-05-01T20:51:17.040 に答える