對於直線來說,一條直線能有引數極徑級角表示,而對圓來說我們需要三個引數來表示乙個圓
在opencv中,我們常常通過乙個叫「霍夫梯度法」的方法來解決圓變換的問題。
霍夫梯度法的原理
(1)首先對影象應用邊緣檢測,比如canny邊緣檢測
(2)然後對邊緣影象中的每乙個非零點,考慮其區域性梯度,即用sobel函式計算x和y方向的sobel一階導數得到的梯度。
(3)可用得到的梯度,有斜率指定的直線上的每個點都在累加器中累加,這裡的斜率是從乙個指定的最小值到指定的最大值得距離
(4)同時標記影象中每乙個非0畫素的位置
(5)然後從二維累加器中這些點鐘選擇候選的中心,這些中心都大於給定閾值並且大於其所有近鄰,這些候選的中心按照累加值將序排列,以便於最支援畫素的中心首先出現
(6)接下來對每乙個中心,考慮所有的非0元素
(7)這些元素按照其與中心的距離排序。從最大半徑到最小半徑算起,選擇非0畫素最支援的一條半徑
(8)如果乙個中心收到邊緣影象非0畫素的最充分支援,並且到前期被選擇的中心有足夠的距離,那麼他就會被保留下來。
這個實現可以使演算法執行起來更高效,獲取更加重要的是能夠幫助解決三維累加器中國會產生許多雜訊並且使得結構不穩定的稀疏分布問題。
霍夫梯度法的缺點
(1)在霍夫梯度法中,我們使用sobel導數來計算區域性梯度,那麼隨之而來的假設是,它可以視作等同於一條區域性切線,這並不是乙個穩定的做法,在大多數的情況下,這樣做會得到正確答案,但或許會輸出產生一些雜訊。
(2)在邊緣影象中的整個非0畫素集,被看做每個中心的候選部分。因此如果把累加器的閾值設定的偏低,演算法需要消耗更長的時間。因此,每乙個中心只會選擇乙個圓,如果有同心圓,就只能選擇乙個
(3)因為中心是按照其關聯的累加器值得公升序排列的,並且如果新的中心過於接近之前已經接受的中心的話,就不被保留下來,並且當有很多的同心圓或者是近似同心圓時,霍夫梯度法的傾向是保留最大的乙個圓,可以說這也是一種比較極端的演算法,因為子在這裡預設sobel導數會產生雜訊,若是對於無窮解析度的平滑影象而言,這是必須的。
霍夫圓變換函式:hounghcircles()函式void houghcircles(inputarray image,
outputarray circles,
int method,
double dp,
double mindist,
double param1 =100,
double param2 =100,
int minradius =0,
int maxradius =0);
函式引數詳解
**實現nsstring*image =@"dkdk.jpg";
uiimage*image1 = [uiimageimagenamed:image];
matim;
uiimagetomat(image1, im);
if(im.empty()) {
return;
//建立零時變數
mat midimage,dstimage;
//轉換為灰度影象進行影象平滑
cvtcolor(im, midimage,color_bgr2gray);
gaussianblur(midimage, midimage,cv::size(9,9),2,2);
//進行霍夫圓變換
std::vector circle;houghcircles(midimage, circle,hough_gradient,1.5,10);
//依次在圖中繪製出圓
for(size_ti =0; i < circle.size(); i++) {
//圓心
cv::point center(cvround(circle[i][0]),cvround(circle[i][1]));
//半徑
int radius =cvround(circle[i][2]);
//繪製
cv::circle(midimage, center, radius,scalar(0,88,255));
self.secondimageview.image=mattouiimage(midimage);
效果
缺點 霍夫圓 霍夫變換
霍夫變換是一種特徵提取,被廣泛應用在影象分析 電腦視覺以及數字影像處理。霍夫變換是用來辨別找出物件中的特徵,例如 線條。他的演算法流程大致如下,給定乙個物件 要辨別的形狀的種類,演算法會在引數空間中執行投票來決定物體的形狀,而這是由累加空間 accumulator space 裡的區域性最大值來決定...
霍夫圓變換
對於直線來說,一條直線能有引數極徑級角表示,而對圓來說我們需要三個引數來表示乙個圓 在opencv中,我們常常通過乙個叫 霍夫梯度法 的方法來解決圓變換的問題。霍夫梯度法的原理 1 首先對影象應用邊緣檢測,比如canny邊緣檢測 2 然後對邊緣影象中的每乙個非零點,考慮其區域性梯度,即用sobel函...
OpenCV 霍夫線變換 霍夫圓變換
關於霍夫變換在官方文件opencv249裡的描述如下 api如下 void houghlines inputarray image,outputarray lines,double rho,double theta,int threshold,double srn 0,double stn 0 vo...