2011-06-10 638 views
5

使用霍夫變換,我如何檢測並得到二維空間中橢圓的(x0,y0)和「a」和「b」的座標?使用霍夫變換的橢圓檢測

這是ellipse01.bmp:

ellipse image

I = imread('ellipse01.bmp'); 
[m n] = size(I); 
c=0; 
for i=1:m 
    for j=1:n 
     if I(i,j)==1 
     c=c+1; 
     p(c,1)=i; 
     p(c,2)=j; 
     end 
    end 
end 
Edges=transpose(p); 
Size_Ellipse = size(Edges); 
B = 1:ceil(Size_Ellipse(1)/2); 
Acc = zeros(length(B),1); 
a1=0;a2=0;b1=0;b2=0; 
Ellipse_Minor=[];Ellipse_Major=[];Ellipse_X0 = [];Ellipse_Y0 = []; 
Global_Threshold = ceil(Size_Ellipse(2)/6);%Used for Major Axis Comparison 
Local_Threshold = ceil(Size_Ellipse(1)/25);%Used for Minor Axis Comparison 
[Y,X]=find(Edges); 
Limit=numel(Y); 
Thresh = 150; 
Para=[]; 

for Count_01 =1:(Limit-1) 
    for Count_02 =(Count_01+1):Limit 
    if ((Count_02>Limit) || (Count_01>Limit)) 
     continue 
    end 
    a1=Y(Count_01);b1=X(Count_01); 
    a2=Y(Count_02);b2=X(Count_02); 
    Dist_01 = (sqrt((a1-a2)^2+(b1-b2)^2)); 
    if (Dist_01 >Global_Threshold) 
     Center_X0 = (b1+b2)/2;Center_Y0 = (a1+a2)/2; 
     Major = Dist_01/2.0;Alpha = atan((a2-a1)/(b2-b1)); 
     if(Alpha == 0) 
     for Count_03 = 1:Limit 
      if((Count_03 ~= Count_01) || (Count_03 ~= Count_02)) 
      a3=Y(Count_03);b3=X(Count_03); 
      Dist_02 = (sqrt((a3 - Center_Y0)^2+(b3 - Center_X0)^2)); 
      if(Dist_02 > Local_Threshold) 
       Cos_Tau = ((Major)^2 + (Dist_02)^2 - (a3-a2)^2 - (b3-b2)^2)/(2*Major*Dist_02); 
       Sin_Tau = 1 - (Cos_Tau)^2; 
       Minor_Temp = ((Major*Dist_02*Sin_Tau)^2)/(Major^2 - ((Dist_02*Cos_Tau)^2)); 
       if((Minor_Temp>1) && (Minor_Temp<B(end))) 
       Acc(round(Minor_Temp)) = Acc(round(Minor_Temp))+1; 
       end 
      end 
      end 
     end 
     end 
     Minor = find(Acc == max(Acc(:))); 
     if(Acc(Minor)>Thresh) 
     Ellipse_Minor(end+1)=Minor(1);Ellipse_Major(end+1)=Major; 
     Ellipse_X0(end+1) = Center_X0;Ellipse_Y0(end+1) = Center_Y0; 
     for Count = 1:numel(X) 
      Para_X = ((X(Count)-Ellipse_X0(end))^2)/(Ellipse_Major(end)^2); 
      Para_Y = ((Y(Count)-Ellipse_Y0(end))^2)/(Ellipse_Minor(end)^2); 
      if (((Para_X + Para_Y)>=-2)&&((Para_X + Para_Y)<=2)) 
      Edges(X(Count),Y(Count))=0; 
      end 
     end 
     end 
     Acc = zeros(size(Acc)); 
    end 
    end 
end 
+0

?http://en.wikipedia.org/wiki/Hough_transform#Implementation_of_an_Efficient_Ellipse_Detection_Algorithm – 2011-06-11 05:20:01

+0

我試圖用MATLAB實現該算法,但是它不能正常工作。我想我沒有正確實施它。 請再次檢查問題。 – Ata 2011-06-11 08:40:29

+0

此實現從http://en.wikipedia.org/wiki/Hough_transform# – Ata 2011-06-11 09:06:30

回答

2

如果使用圓粗變換被給定爲= X COS(THETA)+ Y SIN(THETA) 對於RHO橢圓因爲它是enter image description here

您可以將方程轉換爲 rho = a x cos(theta)+ b y sin(theta) 儘管我不確定您是否使用標準Hough變換,但對於橢圓形變換,您可以操作第一個給定函數。

+0

複製如您所知,我們有一個圖像,其中只有一個沒有任何信息的橢圓。 (我們不知道「a」,「b」和「(x0,y0)」)。我們應該使用Hough變換來找出這些參數。 – Ata 2011-06-10 19:08:45

0

如果您知道橢圓的'a'和'b',那麼您可以在一個方向上按a/b因子重新縮放圖像並查找圓。我仍然在考慮a和b未知時該怎麼做。

如果你知道它是圓的,那麼使用Hough變換來表示圓。這裏是一個示例代碼:

int accomulatorResolution = 1; // for each pixel 
    int minDistBetweenCircles = 10; // In pixels 
    int cannyThresh   = 20; 
    int accomulatorThresh  = 5*_accT+1; 
    int minCircleRadius  = 0; 
    int maxCircleRadius  = _maxR*10; 
    cvClearMemStorage(storage); 
    circles = cvHoughCircles(gryImage, storage, 
           CV_HOUGH_GRADIENT, accomulatorResolution, 
           minDistBetweenCircles, 
           cannyThresh , accomulatorThresh, 
           minCircleRadius,maxCircleRadius);  
    // Draw circles 
    for (int i = 0; i < circles->total; i++){ 
     float* p = (float*)cvGetSeqElem(circles,i); 
     // Draw center 
     cvCircle(dstImage, cvPoint(cvRound(p[0]),cvRound(p[1])), 
          1, CV_RGB(0,255,0), -1, 8, 0); 
     // Draw circle 
     cvCircle(dstImage, cvPoint(cvRound(p[0]),cvRound(p[1])), 
          cvRound(p[2]),CV_RGB(255,0,0), 1, 8, 0); 
    }  
+0

其實我們不知道'a'和'b'。但現在,讓我們假設它是一個圓圈(a = b)。我們應該遵循哪個算法來找出半徑和(x0,y0)? – Ata 2011-06-10 19:27:55

+0

我在我的上一個答案中添加了一個代碼示例 – DanielHsH 2011-06-12 19:40:03

1

雖然這是一個老問題,也許我發現可以幫助某人。

使用正常Hough變換檢測橢圓的主要問題是蓄能器的尺寸,因爲我們需要把票投給5個變量(方程式解釋here):

ellipse equation

有是一個非常不錯的algorithm,其中累加器可以是一個簡單的一維數組,例如,並且運行在O3。如果你想看代碼,你可以看看here(用於測試的圖像是上面公佈的)。

1

如果您提供的橢圓是一個真正的橢圓而不是嘈雜的點樣本; 搜索兩個最遠點給出長軸的末端, 搜索最近的兩個點給出短軸的末端, 這些線的交點(你可以檢查它是一個直角)發生在中央。