霍夫圓變換
與霍夫直線變換
的原理類似
,也是將圓上的每個(gè)點(diǎn)轉(zhuǎn)換到霍夫空間
盏檐,-
其轉(zhuǎn)換的參數(shù)方程如下:
對于圓來說歇式,
θ
的取值范圍在0~360°
,這樣就有了三個(gè)參數(shù)
胡野,
另外兩個(gè)參數(shù)
是圓心(x0材失,y0)
與半徑γ
。這里的
霍夫空間
便是一個(gè)三維空間
硫豆,
所以如果還是跟之前的累積計(jì)算一樣龙巨,計(jì)算量
就會(huì)大大增加
,
這樣顯然不利于快速計(jì)算與檢測
熊响,所以在OpenCV中旨别,
霍夫圓檢測
不是基于二值圖像
或者邊緣檢測的結(jié)果
,
而是基于灰度圖像的梯度
來找到候選區(qū)域
汗茄,
然后基于候選區(qū)域
實(shí)現(xiàn)霍夫圓檢測
秸弛,
這樣就會(huì)大大減少計(jì)算量
,提高程序的執(zhí)行速度與性能
洪碳,
但是基于梯度實(shí)現(xiàn)霍夫圓檢測也帶來了另外一個(gè)問題
递览,那就是結(jié)果特別容易受到噪聲
影響,
對圖像中的噪聲
特別敏感
瞳腌,
所以在OpenCV中使用相關(guān)API實(shí)現(xiàn)霍夫圓檢測的時(shí)候
绞铃,
首先需要通過模糊操作
對圖像進(jìn)行噪聲抑制處理
。
一般來說嫂侍,常見的均值儿捧、高斯冷离、中值模糊
對圖像噪聲的抑制
已經(jīng)比較有效
,
但是在霍夫圓檢測
中有時(shí)候還會(huì)用到邊緣保留濾波
來抑制平坦區(qū)域噪聲
纯命,
以便在進(jìn)行梯度計(jì)算
的時(shí)候能夠更好地得到候選區(qū)域
西剥。
霍夫圓檢測的API:
-
HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)
image
:8位單通道的灰度圖像。
circles
:輸出的三個(gè)向量的數(shù)組亿汞,圓心與半徑(x瞭空,y,r)疗我。
method
:唯一支持的方法就是基于梯度霍夫變換——HOUGH_GRADIENT咆畏。
dp
:圖像分辨率,注意dp越大吴裤,圖像就會(huì)相應(yīng)減小分辨率旧找;當(dāng)dp等于1時(shí),其跟原圖的大小一致麦牺;當(dāng)dp=2時(shí)钮蛛,其為原圖的一半。
minDis
t:表示區(qū)分兩個(gè)圓的圓心之間最小的距離剖膳,如果兩個(gè)圓之間的距離小于給定的minDist魏颓,則認(rèn)為是同一個(gè)圓,這個(gè)參數(shù)對霍夫圓檢測來說非常有用吱晒,可以幫助降低噪聲影響甸饱。
param1
:邊緣檢測Canny算法中使用的高閾值。
param2
:累加器閾值仑濒,值越大叹话,說明越有可能是圓。
minRadius
:檢測的最小圓半徑墩瞳,單位為像素驼壶。
maxRadius
:檢測的最大圓半徑,單位為像素矗烛。
使用API實(shí)現(xiàn)灰度圖像圓檢測:
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();
}
運(yùn)行結(jié)果如下圖辅柴,左側(cè)為原圖,右側(cè)是霍夫圓檢測運(yùn)行結(jié)果:-
霍夫圓檢測
相比霍夫直線檢測
瞭吃,計(jì)算量大,輸出參數(shù)多涣旨,
因此一般都通過指定半徑范圍
歪架,指定邊緣閾值
與累積器閾值
來減少計(jì)算量
,
否則速度就會(huì)很慢
霹陡,這個(gè)也是在使用的時(shí)候需要特別注意
的和蚪。
上述三個(gè)指定參數(shù)如何影響霍夫圓檢測的計(jì)算量
指定半徑范圍
:
minRadius:檢測的最小圓半徑止状,單位為像素。
maxRadius:檢測的最大圓半徑攒霹,單位為像素怯疤。
即函數(shù)只檢測半徑處于minRadius和maxRadius之間的圓,所以指定半徑范圍自然能夠影響計(jì)算量了催束。指定邊緣閾值
霍夫圓檢測的基于內(nèi)部邊緣檢測的結(jié)果集峦;
而邊緣閾值影響邊緣檢測最終留下的邊緣像素,即影響內(nèi)部邊緣檢測的結(jié)果抠刺,
因而影響霍夫圓檢測的計(jì)算量塔淤;累積器閾值
此閾值的高低便是提取圓的要求的高低,高閾值高要求高計(jì)算量速妖,反之亦然高蜂。
- 此外
廣義霍夫變換
通過拓展,可以實(shí)現(xiàn)任意形狀的檢測罕容,可以查閱其他相關(guān)的資料了解备恤,這里便不多說了。
參考材料
- 《OpenCV Android 開發(fā)實(shí)戰(zhàn)》(賈志剛 著)
- 關(guān)于《OpenCV Android 開發(fā)實(shí)戰(zhàn)》作者的GitHub項(xiàng)目
- 筆者基于作者GitHub維護(hù)的APP