0

次の画像が示すように、画像に連結成分があるとします: imagehttp: //dl.dropbox.com/u/92688392/ellipse.jpg

私の質問は、連結成分の境界楕円(画像の赤い楕円)をどのように計算できるかです。私はMATLAB関数regionpropsをチェックし、MATLABがそれを行う方法を理解しました。また、OpencvにはCBlob :: GetEllipse()と同様の関数があることにも気づきました。しかし、コードを読んでどのように結果が得られるかは理解できますが、その背後にある基本的な理論はまだはっきりしていません。したがって、私はその仕事をするためのいくつかの標準的なアルゴリズムがあるかどうか疑問に思っています。ありがとう!

編集:

コメントに基づいて、私は私の質問を再編成しました:画像の瞬間ウィキペディアでは、最長軸角度の計算式は次のとおりです。

方式

ただし、MATLAB関数regionpropsでは、コードは次のとおりです。

    % Calculate orientation.
    if (uyy > uxx)
        num = uyy - uxx + sqrt((uyy - uxx)^2 + 4*uxy^2);
        den = 2*uxy;
    else
        num = 2*uxy;
        den = uxx - uyy + sqrt((uxx - uyy)^2 + 4*uxy^2);
    end

この実装は、ウィキペディアの式と矛盾しています。どちらが正しいのか気になりました。

4

3 に答える 3

2

OpenCV の実装を探している場合は、私が提供できます。アルゴリズムは次のとおりです。

  1. 画像を1ビット(白黒)に変換
  2. すべての輪郭を見つける
  3. 作成された等高線からすべての点を含む等高線を作成します
  4. この輪郭の凸包を計算する
  5. 前のステップで計算された輪郭を含む最小の正方形で回転した楕円 (長方形) を見つけます

コードは次のとおりです。

Mat src = imread("ellipse.jpg"), tmp;
vector<Vec4i> hierarchy;
vector<vector<Point> > contours;
vector<Point> bigContour, hull;
RotatedRect ell;

//step 1
cvtColor(src, tmp, CV_BGR2GRAY);
threshold(tmp, tmp, 100, 255, THRESH_BINARY);

//step 2
findContours(tmp, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

//step 3
for (size_t i=0; i<contours.size(); i++)
{
    for (size_t j=0; j<contours[i].size(); j++)
    {
        bigContour.push_back(contours[i][j]);
    }
}

//step 4
convexHull(bigContour, hull);

//step 5
ell = fitEllipse(hull);

//drawing result
ellipse(src, ell, Scalar(0,0,255), 2);

imshow("result", src);
waitKey();

これは入力です:

入力

結果は次のとおりです。

結果イメージ

于 2012-08-01T17:17:20.620 に答える
1

その背後にあるアルゴリズムが何であるかを調べようとしていたので、独自の実装を書くことができました。mathworks のブログ投稿で見つけました。コメントの1つで、著者は次のように述べています。

regionprops は、問題のオブジェクトの 2 次モーメントを計算し、同じ 2 次モーメントを持つ楕円の測定値を返します。

そして後で:

使用される方程式は、Haralick と Shapiro の Computer and Robot Vision vol. 1、付録 A、Addison-Wesley 1992。長軸の長さ = 100、短軸の長さ = 50 の楕円を含む画像を作成して健全性チェックを行ったところ、regionprops は正しい測定値を返しました。

私はその本を持っていませんが、コピーを入手する必要があるようです。

于 2012-09-17T23:43:24.253 に答える
0

matlab または opencv がどのように楕円体を計算するのかわかりません。しかし、その背後にある数学に興味がある場合は、Löwner-John ellipsoidと呼ばれる非常に優れた最適化アプローチがあります。この方法の詳細については、Stanford Convex Optimizationコースを参照してください。それが役立つことを願っています...

于 2012-08-01T11:22:26.040 に答える