2012-06-14 116 views
5

我想查找圖像中每個像素座標與橢圓的距離。找到一個點到橢圓的距離,其橢圓的內部或外部

要找到距離,我使用下面的公式,其中p是像素的點,h是橢圓。 x,y是像素座標,x(c),y(c)是橢圓中心,theta是橢圓角,alpha和beta分別是橢圓的長軸和短軸。

enter image description here

的代碼,以確定每一個點的橢圓的距離如下所示。如果距離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;} 

這是我得到的輸出。灰色區域應該在粉紅色的橢圓中。 enter image description here

+0

什麼是你的橢圓的「角度」(θ)?也許你對度/弧度感到困惑? – anatolyg

+0

歡迎來到SO! 「cos」,「sin」和「PI」的聲明是什麼? –

+2

我仍然在看你的問題,但首先得到一個快速建議。平方根很昂貴,特別是當你做這些很多時。如果要檢查sqrt(X) Sniggerfardimungus

回答

3

出於某種原因,我認爲我的距離計算是正確的

不是。某點與橢圓之間的距離是超越方程。它不能通過基本技術來解決(這是你所做的)。你需要使用根查找技術。

Google是你的朋友。這裏有一個PDF文件,提供一個算法並提供代碼來實現它:http://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf

編輯
基於下面的評論,我的回答是垂直於OP想要什麼。

lexma,你的橢圓看起來不正確的原因是因爲你對橢圓的錯誤方程是相對於x軸旋轉了某個角度theta。確定某個點(x,y)是否在橢圓內部或外部的問題相當簡單。

  1. 轉換你的(X,Y)座標(U,V),使原點和沿U軸主軸,沿V軸未成年中心的橢圓形。

    U = COS(θ)(XX Ç)+ SIN(θ)(YY Ç
    V = -sin(θ)(XX Ç)+ COS(θ)(YY ç

  2. 計算所述度量

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

  3. 比較一個。如果d小於1,則該點位於橢圓內部,如果橢圓正好是1,則位於橢圓內部;如果大於1,則位於橢圓外部。

+0

看來*找到一個點到橢圓的距離*對於OP來說並不重要;它的內部或外部橢圓*是需要的 – anatolyg

+0

@David感謝您的鏈接,我在閱讀該文章之前發佈在此網站上。我不太瞭解。這次我嘗試了代碼,我得到了很大的值,例如200到800之間。我不確定它是否給我我需要的東西。 – lexma

+0

@anatolyg是的,這是我需要的。給定一個二值圖像中的白色像素,我想知道它是在橢圓的內部還是外部。我正在關注這篇論文,** A.A。 Argyros,M.I.A. Lourakis,「歐洲視覺計算機會議(ECCV'04)」,斯普林格出版社,vol。 3,第368-379頁,2004年5月11 - 14日,布拉格,切赫共和國**,需要做他所做的事情。這裏是我到目前爲止的鏈接,[鏈接](http://www.cs.uwc.ac.za/~iachmed/geometric_tools.cpp)。 – lexma

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

+0

我試着改變你的建議,我至少有一個輪換時間。它仍然是不正確的。我得到了這些結果,[image1](http://www.cs.uwc.ac.za/~iachmed/22.jpg)[image2](http://www.cs.uwc.ac.za/~ iachmed/27.jpg) – lexma

0

雖然this paper的解決方案肯定是太貴只是爲了確定是否點位於內部,或外面的橢圓,它仍可能會幫助誰得到這裏使用谷歌的人,通過的第一部分誤導頭。 (像我一樣)