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 轴旋转了某个角度 theta。确定某个点 (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. 比较一个。如果 d 2小于 1,则该点位于椭圆内,如果恰好为 1,则该点在椭圆上,如果大于 1,则该点在椭圆外。

于 2012-06-14T22:07:30.703 回答
0

我不确定这是问题,但线

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

看起来不正确。标准距离公式使用两个增量而不是一个。这意味着该行应如下所示:

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

请注意,第二部分c-d不是c+d

于 2012-06-14T21:50:26.177 回答
0

尽管本文中的解决方案仅用于确定一个点是否位于椭圆内、椭圆内或椭圆外,肯定过于昂贵,但它仍可能帮助那些使用 google 到这里的人,被标题的第一部分误导。(和我一样)

于 2013-02-12T07:42:47.650 回答