我想找到图像中每个像素坐标到椭圆的距离.
为了找到距离,我使用下面的公式,其中p是像素的点,h是椭圆.x,y是像素坐标,x(c),y(c)是椭圆中心,θ是椭圆角,α和β分别是椭圆的长轴和短轴.
确定每个点到椭圆的距离的代码如下所示.如果距离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;}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出.灰色区域应为粉红色椭圆.

\n\n\n出于某种原因,我认为我的距离计算是正确的
\n
它不是。某点与椭圆之间的距离是超越方程。它无法通过基本技术解决(这就是你所做的)。您需要使用寻根技术。
\n\n谷歌是你的朋友。这是一个 PDF 文件,它提供了算法并提供了实现该算法的代码:http://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf。
\n\n编辑
\n根据下面的评论,我的答案与OP想要的正交。
lexma,您的椭圆看起来不正确的原因是因为您对相对于 x 轴旋转某个角度 theta 的椭圆有错误的方程。确定某个点 (x,y) 是在椭圆内部还是外部的问题相当简单。
\n\n将 (x,y) 坐标转换为 (u,v) 以使椭圆以原点为中心,长轴沿 u 轴,短轴沿 v 轴。
\n\nu = cos(\xce\xb8) (xx c ) + sin(\xce\xb8) (yy c )
\nv = -sin(\xce\xb8) (xx c ) + cos(\xce\xb8) (yy C)
计算指标
\n\nd 2 = (u/\xce\xb1) 2 + (v/\xce\xb2) 2
与一比较。如果 d 2小于 1,则该点在椭圆内部;如果 d 2 恰好为 1,则在椭圆上;如果大于 1,则在椭圆外部。
| 归档时间: |
|
| 查看次数: |
5073 次 |
| 最近记录: |