霍夫變換


  • 霍夫檢測-直線

  前提條件 – 邊緣檢測已經完成,霍夫變換解決平面空間到極坐標空間轉換。

  從霍夫空間曲線圖來看,取不同的像素點都匯聚在一個點,這表明這些個像素點都屬於同一條直線。(xi,yi).對於任意一條直線上的所有點來說變換到極坐標中,從[0~360]空間,可以得到r的大小屬於同一條直線上點在極坐標空(r, θ)必然在一個點上有最強的信號出現(如上圖),根據此反算到平面坐標中就可以得到直線上各點的像素坐標。從而得到直線。

  下圖第一張為原圖,第二張為提取邊緣,第三張為直線檢測並繪制。

  • 霍夫檢測-圓

  極坐標變換原理:

  從平面坐標到極坐標轉換三個參數C(x0,y0,r)其中(x0,y0)是圓心假設平面坐標的任意一個圓上的點,轉換到極坐標中:C(x0,y0,r)處有最大值,霍夫變換正是利用這個原理實現圓的檢測。

   霍夫圓檢測對噪聲比較敏感,所以首先要對圖像做中值濾波。

 相關函數如下:

 1 //標准的霍夫變換HoughLines從平面坐標轉換到霍夫空間,
 2 //最終輸出是表示極坐標空間霍夫變換直線概率,要自己反變換到平面空間,一般不用; 
 3 HoughLinesP(int1,out1,)最終輸出是直線的兩個點(x1,y1,x2,y2).
 4 
 5 霍夫直線檢測HoughLinesP(out1,plinel,1,CV_PI/180.0,10,0,0);
 6 // out1為要檢測的灰度圖像,plinel 為輸出的直線的兩點,類型為vector<Vec4f>plinel;
 7 // 1為生成極坐標時候的像素掃描步長,CV_PI/180.0生成極坐標時候的角度步長,一般取值CV_PI/180,10為閾值,
 8 //只有獲得足夠交點的極坐標點才被看成是直線,最小直線長度0最大間隔0;
 9 for (size_t i=0;i<plinel.size();i++)
10 {
11 Vec4f hline = plinel[i];
12 line(out2, Point(hline[0], hline[1]),
13  Point(hline[2], hline[3]), 
14 colorf3, 3, 8);
15 }
16 
17 霍夫圓檢測HoughCircles(out2, pcircle, CV_HOUGH_GRADIENT,1, 10, 100, 30,80,100); 
18 //out2為要檢測的灰度圖像,pcircle 為輸出的圓心及半徑,類型為vector<Vec3f>pcircle;    
19 //10 最短距離-可以分辨是兩個圓的,否則認為是同心圓,30為中心點累加器閾值用於確定圓心80為最小半徑100最大半徑,
20 Mat dst = Mat(in1_image.size(), in1_image.type());    
21 for (size_t i=0;i< pcircle.size();i++)    
22 {        
23 Vec3f cc = pcircle[i];
24 circle(dst,Point(cc[0], cc[0]), cc[2], colorf3,2,LINE_AA);
25 circle(dst, Point(cc[0], cc[0]), 3, colorf, 2, LINE_AA);
26 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM