2017-01-23 10 views
0

私はバイナリイメージを持ち、OpenCVで次のようにしたいと考えています:点が与えられたら、その点が属する接続されたコンポーネントの面積と周囲を測定します。OpenCV接続されたコンポーネントの境界と点指定

def areaAndPerimeter(point): 
    ...do some stuff... 
    return area, perimeter 

は、私は、各連結成分の境界及び領域を見つけるためにcv2.findContours()を使用することができる知っているが、私は、入力された時点でその情報をペアリングする方法がわかりません。どの周辺と領域が接続されたコンポーネントに対応するのですpoint

+1

あなたは 'connectedComponentsWithStats()'を行い、各色のすべての点を同じ色でラベル付けすると思います。したがって、自分のポイントに対応する色(つまりラベル)を見つけて、それが属するBLOBを見つけることができます。私は絶望的に間違っているかもしれません! Matlabでは 'bwlabel()'と呼ばれています。 –

+0

ええ、私はちょうど古い '' connectedComponents() ''を使い、それぞれのコンポーネントを1ずつ抜き出し、 '' findContours() ''をそれぞれ別々に実行しているソリューションに取り掛かりました。私は '' findContours() ''を一度イメージ全体で実行し、接続されたコンポーネントをすべてスキップすることができました。 – mv3

答えて

0

この機能では、ポイントから始まる領域を増やすだけです。 Fは、前景の画素を含み、Bは、境界画素(右白いものの外側黒色のもの)が含まれ、終了時

- Define a point queue Q 
- Define a foreground point vector F 
- Define a boundary point vector B 
- Put starting point in Q 
- While Q is not empty 
     - p = Q.top 
     - if p is foreground 
      - F.push(p) 
      - Q.push(neighbors of p) 
     - else 
      - B.push(p) 
- Return size(F), size(B) 

:以下の擬似コードです。従って、size(F)は面積を与え、size(B)は周囲を与える。

+0

これらの周長と面積の良い尺度ですか?私はそれらを定義として取ることができると思いますが、これを試してみると、opencv関数の '' cv2.arcLength() ''と '' cv2.contourArea() ''の結果と一致しません。輪郭の大きさ自体は周囲の定義と一致しますが、 '' cv2.arclength() ''関数はそれと等しくなく、私が期待するものに近い結果を与えられます。 – mv3

+0

距離(ユークリッド距離とマンハッタン距離)には異なる尺度があるため、画像領域が離散的であるため、面積と円弧長は近似にも依存します。上記のコードは、「フォアグラウンドに何ピクセルありますか?境界に何ピクセルありますか? " OpenCVの近似を使用する場合は、 'B'のすべての点を使用し、' cv2.contourArea(B) 'と' cv2.arcLength(B) 'を実行します。 – ilke444

+0

私は、接続コンポーネントを見つけるために '' cv2.connectedComponents() ''を使って、私のポイントのコンポーネントを抽出してから、 '' cv2.findContours () ''と続いて '' cv2.contourArea() ''と '' cv2.arcLenth() ''を呼び出します。 – mv3

関連する問題