1

少数 (1 ~ 3 個) のブロブを含むしきい値処理された画像が与えられた場合、中心に最も近いブロブを選択したいと思います。これは数字であると予想されます。

前 後

赤い四角形を別のマットとして抽出したいと思います。これは、中心 (緑の点) に最も近いためです。私の最初の考えは、画像内のすべてのブロブを繰り返し処理し、その重心から画像の中心までの距離がピクセル単位で最小のものを取得することです。しかし、私は OpenCV 関数の大部分に精通していません (そして、それらはたくさんあります!) ので、より良い方法があるかどうか疑問に思っています。

ただし、これにはすでにいくつかの問題があります。

  1. 外側のボックスが 3 つまたは 4 つの側面を覆っている場合、ボックス自体が中心に近くなくても、重心は中心に近い可能性があります。高次のモーメントを使用して、中心から離れたポイントにより多くの重みを与えるべきでしょうか?
  2. OpenCV には、私が知っている統合されたブロブ検索 (または接続コンポーネントのラベル付け) ライブラリはありません。等高線の検索を使用できますが、これは内部部分のある 6、8、9 などの数字では不正確になる可能性があります。
4

6 に答える 6

2
  1. findContoursでblobを検索する
  2. boundingRectを使用して境界矩形を取得します
  3. この時点で、あなたはあなたがしたいことをすることができます
于 2012-09-25T01:18:13.700 に答える
1

サンプル画像では、他の領域の図心が6の図心よりも画像の中心に近いため、図心は機能しません。代わりに、画像の中心に最も近いピクセルを含む領域を探す必要があります。

私はそれを次のように分解します:

  1. 領域のラベル付けを行います。高速なユニオン検索データ構造とウィキペディアで説明されている2パスアルゴリズムを使用して手動でコーディングするのは簡単です(そして楽しいです!) 。MatOpenCVインターフェースを介して画像にアクセスできます。
  2. 中心に最も近い非ゼロピクセルの位置を見つけます。単純な全数検索から始めます...それが遅すぎる場合にのみ最適化を調べます。
  3. 領域ラベル付き画像でこのピクセルの領域を検索します。

これが十分でない場合は、画像の中心に近いピクセルの重みが重い、ある種の重み付き重心を調べることができます。

于 2012-09-24T18:00:48.600 に答える
0
  1. 連結成分のラベル付けを行うクラスを作成します。これがwikiリンクです。それが機能するためには、互いに素な集合クラスを作成する必要があります
  2. ブロブの重心を見つける代わりに、ピクセルから画像の中心までの距離の平均合計を求めます。sum(pixel_i-center)/total_num_pixel_in_the_blob。
于 2012-10-02T06:38:25.100 に答える
0

重心が特定の点に最も近いブロブを見つけるための OpenCV 関数はありません。とにかく、1 ~ 3 個の BLOB の場合、それらすべてをループすると高速な操作になります。

于 2012-09-24T16:49:02.150 に答える
0

連結成分を抽出し、穴を含む領域で findContour/drawContour を使用してラベル イメージを計算できます。速度が問題になる場合は、専用のメソッドを実装できますが、ドキュメントには正確にそれを行うコード サンプルがあります。

画像の中心に最も近い CC を見つけるには、領域が複雑な形状であるため、重心に頼るべきではありません。ラベル イメージを中心から徐々に距離をとってスキャンし、どの連結成分に最初に到達するかを確認できます。

于 2012-09-25T21:38:05.513 に答える
0
  1. 次のブロブ カウント ライブラリのいずれかを使用します... cvBlobslib または cvBlob を使用します... 2 つのいずれかは、単一スキャン ラベル付けアルゴリズムに基づいています..とても高速です
  2. コンポーネントのラベル付けに加えて、バウンディング ボックス、等高線、適合する楕円、ブロブのサイズに応じたブロブ フィルタリング、ブロブの加算と減算などを取得できます。
于 2012-09-25T00:59:42.343 に答える