1

画像内のオブジェクトの境界トレースのアルゴリズムを開発しました。このアルゴリズムは、画像内のすべてのオブジェクトをトレースして結果を返すことができるため、複数のオブジェクトを含む画像をスライスしてアルゴリズムで使用する必要はありません。

したがって、基本的には、しきい値を見つけることから始め、次にしきい値の後にバイナリ イメージを取得し、それに対してアルゴリズムを実行します。

アルゴリズムは以下です。

  1. 任意のオブジェクトに属する最初のピクセルを見つけます。
  2. そのオブジェクトをトレースします (独自のアルゴリズムを持っています)
  3. そのオブジェクトを含む正方形の最小面積を取得します
  4. その正方形のすべてのピクセルを 0 としてマークします (バイナリ イメージから消去します)。
  5. オブジェクトがなくなるまで 1 から繰り返します。

このアルゴリズムは、互いに離れたオブジェクトで完全に機能しましたが、画像を添付して試してみると、結果も添付されました。

問題は、正方形が円の近くにあり、その一部がオブジェクトを含む正方形にあるため、プログラムが最初のオブジェクトの一部であると見なすため、この部分が削除されることです。

誰かがこの問題の解決策を持っていれば幸いです。

ありがとう!ここに画像の説明を入力

4

2 に答える 2

1

手っ取り早い方法は、形状を消去する前に境界ボックスを領域ごとに昇順にソートすることです。そうすれば、小さな形状が最初に削除され、重なり合うオブジェクトの数が減ります。凸形状のみの場合はこれで十分です。

擬似コード:

calculate all bounding boxes of shapes
sort boxes by area (smallest area first)
foreach box in list:
    foreach pixel in box:
        set pixel to 0

任意の形状で機能することが保証されている方法は、オブジェクトのマスクを使用してボックスを塗りつぶすことです。既にバイナリ イメージを作成しているので、これをマスクとして使用できます。

擬似コード:

foreach box in list:
    foreach pixel in box:
        if (pixel in mask == white): set pixel to 0
于 2013-07-16T19:31:30.387 に答える