2011-11-16 23 views
12

私は画像から輪郭を取り出し、輪郭内の画素を特に操作したいと思っています。輪郭内のピクセル値の合計(領域ではない)を見つける必要があります。 OpenCVは四角形のROIだけをサポートしているので、どうやってこれを行うのか分かりません。また、cvSumは完全な画像のみを受け取り、マスクオプションを持たないので、処理方法が少し失われています。特定の輪郭内の画素の値の合計を見つける方法については、誰にも提案はありますか?輪郭(OpenCV)のピクセルを扱う?

+0

輪郭表現とは何ですか?ピクセル座標?画像/マスク?なぜピクセルをループすることはできませんか? –

+0

申し訳ありませんが、私は本当にその質問を理解していません。輪郭は、特定の領域を囲む一連の点で構成されています。どのようにピクセルをループすることができないのか分かりません。輪郭はどのような形状でもかまいません - 人体の輪郭から犬の輪郭まで - 固定された形状の欠如私は本当に "ループ"できません – fdh

+0

輪郭のピクセルがある配列の座標として与えられると、配列をループし、そこから座標を取り出し、それらの座標を持つ画像ピクセルを見ます。輪郭がイメージ内にあり、そのピクセルが他のものと区別できる特定の色(または範囲)を持っている場合は、イメージピクセルをループし、その色を見て、それらが輪郭ピクセルであるかどうかを確認します。座標がなく、輪郭ピクセルに特定の色範囲がない場合は、別の種類の問題です。難しくなります。あなたはその表現を指定しなかった。だからこそ私はそれについて尋ねた –

答えて

5

最初にすべての輪郭線を取得します。この情報を使用して、白い部分が輪郭の輪郭および領域であるバイナリイメージを作成します。 2つのイメージに対してAND演算を実行します。結果は、黒い背景上の等高線と領域になります。次に、この画像内のすべてのピクセルを合計します。

+0

まず、あなたが示唆していることは、すべての輪郭の合計を私に与えるでしょう。私はそれぞれの金額を別々にしたいと思っています。第二に、私は私の質問で言ったように、私は輪郭の面積を計算するのではなく、輪郭の中で既に黒ではないピクセルの値を計算したい。あなたのメソッドは、輪郭内のすべてのピクセルを白くして、アプリケーションのポイントを完全に無視します。 – fdh

+1

バイナリイメージと元のイメージをANDで結ぶと、孤立したイメージが得られます。すべての白いイメージを取得しません。一度に1つずつ必要な場合は、バイナリマスクを作成し、2つの画像と1つずつANDを作成することができます。 – scord

+0

私は自分自身をよく説明していない場合は申し訳ありません。しかし、私は成功して自分自身で似たようなことをしました。 – scord

3

私が正しく理解していれば、輪郭の内側にある灰色の画像からすべてのピクセル強度を合計したいと思います。もしそうなら、私が考えている方法は、空白のイメージにその輪郭を描き、それを埋めることで、自分自身をマスクにすることです。あなたは中間画像にすることができ、この後

CvRect cvBoundingRect(CvArr* points, int update=0); 

:それはプロセスを最適化するために、後にまた有する輪郭の境界矩形を計算することができる値0を使用して

void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL); 

を、マスクが得られ輪郭から、ROIとして前に境界矩形を設定します。

この後、結果の画像の合計は少し速くなります。

+0

ありがとうございます。私が理解しているところから、あなたは基本的にマスクを使って輪郭の内容を分離しています。私はそれがどのように動作するかを見ていますが、境界矩形の目的を実際に理解していません。輪郭の内容が分離されている場合、ROIを持つ点は何ですか? – fdh

+0

画像内のすべてのピクセルをトラフすることを含む、合計または他の操作を計算するときは、より小さな領域で作業することが重要です。 – Adrian

0

輪郭のポイントにアクセスするには、個別のコードに従ってください

vector<vector<Point> > contours; 
... 
printf("\n Contours pixels \n"); 
for(int a=0; a< contours.size(); a++) 
{ 
    printf("\nThe contour NO = %d size = %d \n",a, contours[a].size()); 
    for(int b = 0; b < contours[a].size(); b++) 
    { 
     printf(" [%d, %d] ",contours[a][b].x, contours[a][b].y); 
    } 
} 
+0

これは、輪郭の端に沿った点のみになります。内部のピクセルではありません。 – David