2012-06-14 10 views
5

Chciałbym znaleźć odległość każdej współrzędnej piksela w obrazie do elipsy.Znaleźć odległość punktu do elipsy, należy umieścić wewnątrz lub na zewnątrz elipsy

Aby znaleźć odległość, używam następującej formuły, w której p jest punktem piksela, a h - elipsą. x, y jest współrzędną pikselową, x (c), y (c) jest środkiem elipsy, theta jest kątem elipsy, alfa i beta to odpowiednio oś główna i pomocnicza elipsy.

enter image description here

Kod dla określenia odległości każdego miejsca do elipsy jest pokazany poniżej. Jeśli odległość, D < 1, oznacza to, że punkt znajduje się wewnątrz elipsy, w którym to przypadku sprawię, że będzie szary. Jeśli D> 1, oznacza to, że punkt znajduje się poza elipsą, w takim przypadku pozostawiam go takim, jaki jest. Poniżej znajduje się również wyjściowy obraz, który otrzymuję. Z jakiegoś powodu uważam, że moje obliczenia odległości są prawidłowe, ale mam problem z rotacją. Dla mnie wszystko wygląda dobrze, nie widzę problemu. Proszę pomóż. Potrzebuję tylko, aby wszystkie piksele w elipsie były szare, ale dla mnie szary obszar tworzy elipsę, ale wydaje mi się, że mam gdzieś obrót.

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

To jest wynik, który otrzymuję. Szary obszar powinien znajdować się w różowej elipsie. enter image description here

+0

Co to jest "kąt" (theta) twojej elipsy? Może masz pomieszanie z stopniami/radianami? – anatolyg

+0

Witamy w SO! Jakie są deklaracje 'cos',' sin' i 'PI'? –

+2

Wciąż patrzę na twój problem, ale szybkie pierwsze zalecenie. Korzenie kwadratowe są drogie, zwłaszcza gdy robisz tak wiele z nich. Jeśli chcesz sprawdzić, czy sqrt (X) Sniggerfardimungus

Odpowiedz

3

Z jakiegoś powodu myślę, że moja obliczanie odległości jest tuż

Nie jest. Odległość między pewnym punktem a elipsą jest równaniem transcendentalnym. Nie można go rozwiązać za pomocą elementarnych technik (tak właśnie zrobiliście). Musisz użyć technik odnajdywania rootów.

Google jest twoim przyjacielem. Oto plik PDF, który dostarcza algorytm i dostarcza kod do jego implementacji: http://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf.

Edit
oparciu o komentarzach poniżej, moja odpowiedź jest prostopadła do co PO chce.

lexma, powód, dla którego twoja elipsa nie wygląda dobrze, jest taka, że ​​masz błędne równanie dla elipsy obróconej o pewien kąt teta w stosunku do osi x. Problem określenia, czy jakiś punkt (x, y) znajduje się wewnątrz elipsy lub poza nią, jest dość prosty.

  1. Konwersja (x, y) współrzędnych (u, v), aby elipsę wyśrodkowane pochodzenia i o osi głównej wzdłuż osi u, v mniejszej wzdłuż osi.

    U = cos (θ) (XX C) + sin (θ) (YY C)
    V = -sin (θ) (XX C) + cos (θ) (yY C)

  2. Oblicz metryka

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

  3. Porównaj z jednym. Punkt jest wewnątrz elipsy, jeśli d jest mniejszy niż jeden, na elipsie, jeśli jest dokładnie jeden, a na zewnątrz, jeśli jest większy niż jeden.

+0

Wygląda na to, że * Znalezienie odległości punktu do elipsy * nie jest w ogóle istotne dla PO; to raczej * zwilż jego wewnętrzną lub zewnętrzną elipsę *, która jest potrzebna. – anatolyg

+0

@ Dziękuję za link, przeczytałem ten artykuł przed opublikowaniem na tej stronie. Nie zrozumiałem zbyt wiele. Tym razem wypróbowałem kod i osiągałem duże wartości, między 200 a 800. Nie jestem pewien, czy daje mi to, czego potrzebuję. – lexma

+0

@anatolyg Tak, tego właśnie potrzebuję. Biorąc pod uwagę biały piksel na obrazie binarnym, chciałbym dowiedzieć się, czy jest on wewnątrz czy na zewnątrz elipsy. Śledzę ten artykuł, ** A.A. Argyros, M.I.A. Lourakis, "Śledzenie w czasie rzeczywistym wielu obiektów o kolorze skóry z potencjalnie ruchomym aparatem", w ramach Europejskiej Konferencji Komputerowej Wizji (ECCV'04), Springer-Verlag, tom. 3, s. 368-379, 11-14 maja 2004 r., Praga, Czechy) i musi robić to, co robi. Oto link do tego, co mam do tej pory, [link] (http://www.cs.uwc.ac.za/~iachmed/geometric_tools.cpp). – lexma

0

Nie jestem pewien, jest to problem, ale linia

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

nie wygląda poprawne. Standardowa formuła odległości używa dwóch delt, a nie jednego. Oznacza to, że linia powinna wyglądać następująco:

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

Zauważ, że druga część jest c-d zamiast c+d

+0

Próbowałem zmienić, jak sugerujesz, a przynajmniej uzyskałem rotację czas. Nadal nie jest poprawne. Otrzymuję te wyniki, [image1] (http://www.cs.uwc.ac.za/~iachmed/22.jpg) [image2] (http://www.cs.uwc.ac.za/~ iachmed/27.jpg) – lexma

0

Chociaż rozwiązanie w this paper jest zdecydowanie zbyt drogie, żeby ustalić, czy punkt leży wewnątrz lub na zewnątrz elipsy, to może jeszcze pomóc tych ludzi, którzy znaleźli się tutaj używając google, wprowadzać w błąd przez pierwszą część nagłówek. (jak ja)

Powiązane problemy