2012-06-14 19 views
5

画像内のすべてのピクセル座標の距離を楕円にしたいと考えています。楕円の内側または外側にある楕円との距離を求める

距離を見つけるには、次の式を使用します.pはピクセルのポイント、hは楕円です。 x(y)はピクセル座標、x(c)、y(c)は楕円の中心、thetaは楕円の角度、betaは楕円の長軸と短軸です。

enter image description here

楕円に全ての点の距離を決定するためのコードを以下に示します。距離がD <ならば、その点が楕円の内側にあることを意味します。その場合、灰色になります。 D> 1の場合は、その点が楕円の外側にあることを意味します。その場合はそのままにします。以下は私が得る出力イメージです。何らかの理由で私の距離計算が正しいと思うが、私は自分のローテーションに問題がある。私にはすべてが正しいように見えますが、私は問題を見ることができません。助けてください。私が必要とするのは、楕円のすべてのピクセルが灰色である必要がありますが、私には灰色の領域は楕円形を形成しますが、回転のどこかで間違っているように見えます。

Mat distance2ellipse(Mat image, RotatedRect ellipse){ 
float distance = 2.0f; 
float angle = ellipse.angle; 
Point ellipse_center = ellipse.center; 
float major_axis = ellipse.height; 
    float minor_axis = ellipse.width; 
Point pixel; 
float a,b,c,d; 

for(int x = 0; x < image.cols; x++) 
{ 
    for(int y = 0; y < image.rows; y++) 
    { 
     Scalar intensity = image.at<uchar>(Point(x, y)); 
     pixel.x=x; 
     pixel.y=y; 
     a = (cos(angle*PI/180)*(pixel.x-ellipse_center.x))/(major_axis); 
     b = (sin(angle*PI/180)*(pixel.y-ellipse_center.y))/(minor_axis); 
     c = (sin(angle*PI/180)*(pixel.x-ellipse_center.x))/(major_axis); 
     d = (cos(angle*PI/180)*(pixel.y-ellipse_center.y))/(minor_axis); 

     distance = sqrt(pow((a-b),2)+pow((c+d),2)); 

     if(distance<1) 
     { 
       image.at<uchar>(Point(x,y)) = 140; 
     } 
    } 
} 
return image;} 

これは私が得る出力です。灰色の領域はピンクの楕円形でなければなりません。 enter image description here

+0

あなたの楕円の「角度」(シータ)とは何ですか?おそらく度/ラジアンと混同しているのでしょうか? – anatolyg

+0

ようこそ! 'cos'、' sin''、 '' PI''の宣言は何ですか? –

+2

私はあなたの問題をまだ見ていますが、最初にすばやくお勧めします。正方形の根は高価です、特にあなたがこれらの多くをしているとき。 sqrt(X) Sniggerfardimungus

答えて

3

c+d

そうではありません。ある点と楕円の間の距離は超越方程式です。それは基本的なテクニック(これはあなたがやったことです)で解決することはできません。ルート検索技術を使用する必要があります。

Googleはあなたの友人です。アルゴリズムを提供し、それを実装するコードを提供するPDFファイルです:http://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf

編集
以下のコメントに基づいて、私の答えはOPが望むものと正反対です。

lexma、あなたの楕円が正しく表示されない理由は、x軸に対してある角度θだけ回転した楕円の方程式が間違っているためです。ある点(x、y)が楕円の内側か外側かを判断する問題はかなり簡単です。

  1. あなたの(x、y)を変換するために、座標(u、v)が原点であり、v軸に沿ってマイナーu軸に沿って長軸と中心に楕円を作ります。

    U = COS(θ)(XX C)+ SIN(θ)(C YY
    V = -sin(θ)(XX C
    )+ COS(θ)(YY C

  2. 計算メトリック

    D =(U /α) +(v /β)

  3. 1と比較してください。 d が1より小さい場合は楕円の内側にあり、楕円の場合は楕円であり、1より大きい場合は外側です。

+0

これは、次のように思われます。*点の楕円への距離を求めることは、OPにとっては重要ではありません。それはむしろ内側または外側の楕円形*が必要です。 – anatolyg

+0

@Davidのリンクをありがとう、私はこのサイトに投稿する前にその記事を読んでいます。私はあまり理解していませんでした。今回はコードを試してみましたが、200〜800のような大きな値を得ていました。私に必要なものが与えられているかどうかはわかりません。 – lexma

+0

@anatolygはい、それは私が必要なものです。バイナリイメージの中に白いピクセルがあると、それが楕円の内側か外側かを調べたいと思います。私はこの論文に従っています、** A.A。 Argyros、M.I.A. Lourakis、「コンピュータビジョンに関する欧州会議(ECCV'04)、Springer-Verlag、vol。」の議事で、「可能性のある移動カメラによる複数の肌色の物体のリアルタイム追跡」。 3、pp。368-379、2004年5月11-14日、プラハ、チェコ共和国**そして彼が何をする必要がある。ここに私がこれまで持っているものへのリンクがあります。[link](http://www.cs.uwc.ac.za/~iachmed/geometric_tools.cpp)。 – lexma

0

私はこれが問題であるが、ライン

distance = sqrt(pow((a-b),2)+pow((c+d),2)); 

が正しく表示されません確かではありませんよ。標準的な距離の式では、1つではなく2つのデルタが使用されます。 これは、行は次のようになりますことを意味します

distance = sqrt(pow((a-b),2)+pow((c-d),2)); 

お知らせを第二部であることをc-d代わりに、私は私の距離計算が正しいと思い何らかの理由

+0

あなたが示唆したように私は変えようとしました。時間。それでも正しいわけではありません。私はこれらの結果を得ています。[image1](http://www.cs.uwc.ac.za/~iachmed/22.jpg)[image2](http://www.cs.uwc.ac.za/~ iachmed/27.jpg) – lexma

0

this paper内の溶液は、ポイントが楕円上または外に、内側にある場合だけで判断するために、間違いなくあまりにも高価ではあるが、それはまだの最初の部分で誤解、グーグルを使用してここに来たそれらの人々を助けるかもしれませんヘッダ。 (私のような)