2012-06-14 44 views
5

Me gustaría encontrar la distancia de cada coordenada de píxel en una imagen a una elipse.Encontrar la distancia de un punto a una elipse, ya sea dentro o fuera de la elipse

Para encontrar la distancia, estoy usando la siguiente fórmula donde p es el punto del píxel y h es la elipse. x, y es la coordenada de píxel, x (c), y (c) es el centro de la elipse, theta es el ángulo de la elipse, alfa y beta son los ejes mayor y menor de la elipse, respectivamente.

enter image description here

El código para determinar la distancia de cada punto a una elipse se muestra a continuación. Si la distancia, D < 1, significa que el punto está dentro de la elipse, en cuyo caso lo hago gris. Si D> 1 significa que el punto está fuera de la elipse, en cuyo caso lo dejo tal como está. Debajo está también la imagen de salida que obtengo. Por alguna razón, creo que mi cálculo de distancia es correcto, pero tengo un problema con mi rotación. Para mí, todo se ve bien, no puedo ver el problema. Por favor ayuda. Lo que necesito es que todos los píxeles de la elipse sean grises, pero para mí el área gris forma una elipse, pero parece que me estoy equivocando con la rotación en alguna parte.

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;} 

Esta es la salida que obtengo. El área gris debe estar en la elipse rosa. enter image description here

+0

¿Cuál es el 'ángulo '(theta) de su elipse? Tal vez tienes confusión con grados/radianes? – anatolyg

+0

¡Bienvenido a SO! ¿Cuáles son las declaraciones de 'cos',' sin' y 'PI'? –

+2

Todavía estoy viendo su problema, pero una primera recomendación rápida. Las raíces cuadradas son caras, especialmente cuando haces esto muchas de ellas. Si desea verificar si sqrt (X) Sniggerfardimungus

Respuesta

3

Por alguna razón creo que mi cálculo de la distancia es correcta

No lo es. La distancia entre un punto y una elipse es una ecuación trascendental. No puede ser resuelto por técnicas elementales (que es lo que hiciste). Necesita usar técnicas de búsqueda de raíz.

Google es tu amigo. Aquí hay un archivo PDF que proporciona un algoritmo y proporciona un código para implementarlo: http://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf.

Editar
Basándose en los comentarios de abajo, mi respuesta es ortogonal a lo que el PO quiere.

lexma, la razón por la que su elipse no se ve bien se debe a que tiene la ecuación incorrecta para una elipse que gira por algún ángulo theta con respecto al eje x. El problema de determinar si algún punto (x, y) está dentro o fuera de la elipse es bastante simple.

  1. Convertir su (x, y) las coordenadas a (u, v) para hacer la elipse con centro en el origen y con el eje mayor a lo largo del eje U, menor a lo largo del eje v.

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

  2. Compute la métrica

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

  3. Comparar con uno. El punto está dentro de la elipse si d es menor que uno, en la elipse si es exactamente uno, y afuera si es mayor que uno.

+0

Parece que * Encontrar la distancia de un punto a una elipse * no es importante en absoluto para el OP; es más bien * si está dentro o fuera de la elipse * que se necesita – anatolyg

+0

@David gracias por el enlace, leí ese artículo antes de publicarlo en este sitio. No entendí mucho. Probé el código esta vez y obtuve grandes valores, como entre 200 y 800. No estoy seguro de que me esté dando lo que necesito. – lexma

+0

@anatolyg Sí, eso es lo que necesito. Dado un píxel blanco en una imagen binaria, me gustaría encontrar si está dentro o fuera de la elipse. Estoy siguiendo este artículo, ** A.A. Argyros, M.I.A. Lourakis, "Seguimiento en tiempo real de múltiples objetos de color de piel con una cámara en movimiento", en los procedimientos de la Conferencia Europea de Visión por Computador (ECCV'04), Springer-Verlag, vol. 3, pp. 368-379, 11-14 de mayo de 2004, Praga, Chech Republic ** y necesita hacer lo que hace. Aquí hay un enlace a lo que tengo hasta ahora, [link] (http://www.cs.uwc.ac.za/~iachmed/geometric_tools.cpp). – lexma

0

No estoy seguro de que este es el problema, pero la línea

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

no parece correcto. La fórmula de distancia estándar usa dos deltas y no uno. Esto significa que la línea debería tener este aspecto:

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

en cuenta que la segunda parte es c-d en lugar de c+d

+0

Traté de cambiar como sugeriste y al menos obtuve una rotación de este hora. Todavía no es correcto. Obtengo estos resultados, [image1] (http://www.cs.uwc.ac.za/~iachmed/22.jpg) [image2] (http://www.cs.uwc.ac.za/~ iachmed/27.jpg) – lexma

0

Aunque la solución en this paper es definitivamente demasiado caro sólo para determinar si un punto se encuentra en el interior, dentro o fuera de la elipse, aún podría ayudar a aquellas personas que recibieron aquí a través de Google, engañar por la primera parte de la encabezamiento. (como yo)

Cuestiones relacionadas