計算機視覺 OpenCV Android | 基本特徵檢測之 霍夫圓檢測
-
霍夫圓變換
與霍夫直線變換
的原理類似
,也是將圓上的每個點轉換到霍夫空間
, - 其轉換的引數方程如下:
-
對於圓來說,
θ
的取值範圍在0~360°
,這樣就有了三個引數
,另外兩個引數
是圓心(x0,y0)
與半徑γ
。 -
這裡的
霍夫空間
便是一個三維空間
,所以如果還是跟之前的累積計算一樣,
計算量
就會大大增加
,這樣顯然不利於
快速計算與檢測
, -
所以在OpenCV中,
霍夫圓檢測
不是基於二值影象
或者邊緣檢測的結果
,而是
基於灰度影象的梯度
來找到候選區域
,然後基於
候選區域
實現霍夫圓檢測
,這樣就會
大大減少計算量
,提高程式的執行速度與效能
,但是基於梯度實現霍夫圓檢測也帶來了另外一個
問題
,那就是結果特別容易受到噪聲
影響,對影象中的
噪聲
特別敏感
,所以在OpenCV中使用相關AP
I實現霍夫圓檢測的時候
,首先需要通過
模糊操作
對影象進行噪聲抑制處理
。一般來說,常見的
均值、高斯、中值模糊
對影象噪聲的抑制
已經比較有效
,但是在
霍夫圓檢測
中有時候還會用到邊緣保留濾波
來抑制平坦區域噪聲
,以便在進行
梯度計算
的時候能夠更好地得到候選區域
。
霍夫圓檢測的API:
-
HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)
image
:8位單通道的灰度影象。circles
:輸出的三個向量的陣列,圓心與半徑(x,y,r)。method
:唯一支援的方法就是基於梯度霍夫變換——HOUGH_GRADIENT。dp
:影象解析度,注意dp越大,影象就會相應減小解析度;當dp等於1時,其跟原圖的大小一致;當dp=2時,其為原圖的一半。minDis
t:表示區分兩個圓的圓心之間最小的距離,如果兩個圓之間的距離小於給定的minDist,則認為是同一個圓,這個引數對霍夫圓檢測來說非常有用,可以幫助降低噪聲影響。param1
:邊緣檢測Canny演算法中使用的高閾值。param2
:累加器閾值,值越大,說明越有可能是圓。minRadius
:檢測的最小圓半徑,單位為畫素。maxRadius
:檢測的最大圓半徑,單位為畫素。
使用API實現灰度影象圓檢測:
private void houghCircleDemo(Mat src, Mat dst) { Mat gray = new Mat(); Imgproc.pyrMeanShiftFiltering(src, gray, 15, 80); Imgproc.cvtColor(gray, gray, Imgproc.COLOR_BGR2GRAY); Imgproc.GaussianBlur(gray, gray, new Size(3, 3), 0); // detect circles Mat circles = new Mat(); dst.create(src.size(), src.type()); Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1, 20, 100, 30, 10, 200); for(int i=0; i<circles.cols(); i++) { float[] info = new float[3]; circles.get(0, i, info); Imgproc.circle(dst, new Point((int)info[0], (int)info[1]), (int)info[2], new Scalar(0, 255, 0), 2, 8, 0); } circles.release(); gray.release(); }
執行結果如下圖,左側為原圖,右側是霍夫圓檢測執行結果:

-
霍夫圓檢測
相比霍夫直線檢測
, 計算量大,輸出引數多,因此一般都通過
指定半徑範圍
,指定邊緣閾值
與累積器閾值
來減少計算量
,否則
速度就會很慢
,這個也是在使用的時候需要特別注意
的。
上述三個指定引數如何影響霍夫圓檢測的計算量
-
指定半徑範圍
:
minRadius:檢測的最小圓半徑,單位為畫素。
maxRadius:檢測的最大圓半徑,單位為畫素。
即函式只檢測半徑處於minRadius和maxRadius之間的圓,所以指定半徑範圍自然能夠影響計算量了。 -
指定邊緣閾值
霍夫圓檢測的基於內部邊緣檢測的結果;
而邊緣閾值影響邊緣檢測最終留下的邊緣畫素,即影響內部邊緣檢測的結果,
因而影響霍夫圓檢測的計算量; -
累積器閾值
此閾值的高低便是提取圓的要求的高低,高閾值高要求高計算量,反之亦然。
- 此外
廣義霍夫變換
通過拓展,可以實現任意形狀的檢測,可以查閱其他相關的資料瞭解,這裡便不多說了。