4

わかりました、1 つの重要なことを除いて、できることはすべて実行したと思います。それは、形状の抽出です。私はすでにこれをかなり単純な方法でかなり行っていますが、実際にめちゃくちゃになる場合があります。私がこれを行う方法は次のとおりです。

  • 境界長方形を生成し、左上に最も近い点 (点 p) を選択することにより、アウトライン リスト内の点を選択します。
  • 新しい Shape オブジェクトを作成し、形状のアウトラインに p を追加します。
  • メイン画像にテストできる点がなくなった場合は、単純に形状オブジェクトを返します。
  • p から最も近い点を取得し、closer に格納します。
  • 最も近い点から p 点までの距離 が 10
    以下である間
  • ----アウトラインに追加
  • ----マスターポイントリストから削除
  • ----p を最も近い値に設定
  • ----最も近い点から別の最も近い点を取得する
  • - - 繰り返す
  • シェイプのアウトラインに 10 個以下のポイントがある場合は、null オブジェクトを返します (小さなシェイプはすべて無視します)。
  • それ以外の場合は、形状オブジェクトを返します。

要点リストが空になるまで、このプロセスを繰り返します。これは、すべての形状を抽出したことを意味します。

今、私は形状を数回結合します。|、 --- 、および | がある場合、これはそうなります。互いに隣り合って、結合して長方形を作成します。私の言いたいことが分かりますか?円があるとしましょう。上記の抽出コードは、円の半分が 1 つの形状であり、残りの半分が別の形状であると言う場合があります。だから形を組み合わせると一つの円になる。

はあ、私も写真を投稿することはできず、これをアップロード サイト以外にアップロードすることはできません。これにはいくつかの問題があります。以下を見てください。

ここに画像の説明を入力

左の絵がスタート絵で、右の絵が輪郭点です。次に、形状の決定ボタンをクリックします。画像内で最も支配的な形状 (輪郭に最も多くの点を含む形状オブジェクト) の形状を決定します。

ここに画像の説明を入力

今、これは四角形であると正しく言っていますが、間違った理由があります. 形状の組み合わせ (長方形の形状を取得するために行う必要がありました。そうしないと、ある形状では小さな線になり、別の形状では別の小さな線になります)、テストに指の輪郭が追加されました。

したがって、1 つの形状全体 (2 番目の図の右側の黒い輪郭) がテストされます。「長方形」の部分だけでなく、その写真のすべてがテストされます。このことをきれいにして、指を含める代わりに長方形の部分だけを抽出する方法を考えてもらえますか? これにはA*のバリエーションを考えていたのですが、この写真のような場合はループしません。では、A* がすべてのポイントを訪れたらどうすればよいでしょうか (出発点に戻ることはできないため)。私は何をしますか?

これを理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

1

コードの次の部分はあまり賢明ではないと思います。

    int iSelected = selected.ToArgb();
    int iNextRight = nextRight.ToArgb();
    if (Math.Abs(iSelected - iNextRight) > alpha)

結果は、画像でアルファを使用しないと仮定して、ほぼ赤色のみと比較するためです(他の色はあまり重要でないバイトに保存されます)。

より良い結果を得るには、Canny Edge Detector を使用するか、少なくともその処理手順を確認してください。

他のオプションは、魔法の杖に似た機能を使用して、メイン オブジェクトを背景から分離し、後でそのエッジを抽出することです。その目的のために、たとえばポッツ モデルを使用できます。

もっと簡単にしたい場合は、エッジを検出するのと同じように行いますが、すべてのカラー チャネルの差の合計を使用します。次に、中央の点が検索されたオブジェクトの一部であると想定し、絵筆のように最も近いエッジ間の形状を塗りつぶします。適切なしきい値を選択すると、それらの指がなくなります。

がんばって。

于 2011-04-12T22:10:01.003 に答える