5

画像内のすべてのピクセル座標から楕円までの距離を見つけたいと思います。

距離を見つけるために、次の式を使用しています。ここで、p はピクセルの点、h は楕円です。x,y はピクセル座標、x(c),y(c) は楕円の中心、theta は楕円の角度、alpha と beta はそれぞれ楕円の長軸と短軸です。

ここに画像の説明を入力

楕円までのすべての点の距離を決定するコードを以下に示します。距離が D < 1 の場合、点が楕円の内側にあることを意味します。この場合、点を灰色にします。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;}

これは私が得る出力です。灰色の領域はピンクの楕円の中にあるはずです。 ここに画像の説明を入力

4

3 に答える 3

4

どういうわけか私の距離計算は正しいと思います

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

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

編集
以下のコメントに基づいて、私の答えは OP が望むものと直交しています。

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

  1. (x,y) 座標を (u,v) に変換して、原点を中心とし、長軸が u 軸に沿って、短軸が v 軸に沿った楕円を作成します。

    u = cos(θ) (xx c ) + sin(θ) (yy c )
    v = -sin(θ) (xx c ) + cos(θ) (yy c )

  2. メトリックを計算する

    d 2 = (u/α) 2 + (v/β) 2

  3. 1つと比較してください。点は、d 2が 1 未満の場合は楕円の内側にあり、ちょうど 1 の場合は楕円上にあり、1 より大きい場合は外側にあります。

于 2012-06-14T22:07:30.703 に答える
0

このホワイト ペーパーのソリューションは、点が楕円の内側、楕円の外側、または外側にあるかどうかを判断するだけでもコストがかかりすぎますが、ヘッダーの最初の部分に惑わされて、Google を使用してここにたどり着いた人々の助けになる可能性があります。(私のように)

于 2013-02-12T07:42:47.650 に答える
0

これが問題かどうかはわかりませんが、行

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

正しく見えません。標準距離式は、1 つではなく 2 つのデルタを使用します。これは、行が次のようになることを意味します。

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

2番目の部分はc-d代わりにあることに注意してくださいc+d

于 2012-06-14T21:50:26.177 に答える