》》點(diǎn)贊肥隆,收藏+關(guān)注,理財(cái)&技術(shù)不迷路《《
目錄:
13.1 直線檢測
13.1.1 霍夫直線變換
定義:
霍夫變換(Hough Transform)是圖像處理中的一種特征提取技術(shù)鸥鹉,可以識(shí)別圖像中的幾何形狀撑帖。它將圖像空間中的特征點(diǎn)映射到參數(shù)空間進(jìn)行投票筐眷,通過檢測累計(jì)結(jié)果的局部極值點(diǎn)得到一個(gè)符合某特定形狀的點(diǎn)的集合。經(jīng)典霍夫變換用來檢測圖像中的直線垒手,后來霍夫變換擴(kuò)展到任意形狀物體的識(shí)別蒜焊,多為圓和橢圓。它的抗噪聲科贬、抗形變能力較強(qiáng)泳梆。另一種直線提取的方法是對圖像邊緣點(diǎn)進(jìn)行鏈碼追蹤,在得到的鏈碼串中提取直線榜掌。
霍夫變換將在一個(gè)空間中具有相同形狀的曲線或直線映射到另一個(gè)坐標(biāo)空間的一個(gè)點(diǎn)上形成峰值优妙,從而把檢測任意形狀的問題轉(zhuǎn)化為統(tǒng)計(jì)峰值問題。
標(biāo)準(zhǔn)霍夫變換:
考慮點(diǎn)和線的對應(yīng)關(guān)系憎账,過一點(diǎn)(x1,y1)的直線可表示為:y1=kx1+b套硼,將變量和參數(shù)互換,已知一個(gè)點(diǎn)(x1,y1),經(jīng)過這一點(diǎn)的直線簇可以表示為b=(-x1)k+y1胞皱。位于同一條直線上的點(diǎn)具有相同的斜率和截距邪意,反映到參數(shù)空間上就是這些直線會(huì)交于同一點(diǎn)(k,b)。
舉個(gè)例子:圖像空間有三個(gè)點(diǎn)(1反砌,1)抄罕,(2,2)于颖,(3,3)嚷兔,他們在直線y=1*x+0上森渐,如下圖所示
互換參數(shù)做入,在參數(shù)空間里這三個(gè)點(diǎn)對應(yīng)三條直線:1=k+b,2=2*k+b,3=3*k+b,交于同一點(diǎn)(1同衣,0)竟块,這一點(diǎn)即圖像空間中直線的斜率和截距,如果我們能得到這些點(diǎn)耐齐,也就得到了圖像空間的直線:
由于上面的變換不能表示斜率為無窮大的情況浪秘,因此,采用極坐標(biāo)的方式:Rho = X * Cos(Theta) + Y * Sin(Theta):
在實(shí)際操作時(shí)埠况,步驟如下:
1耸携、得到圖像的邊緣信息;
2辕翰、對邊緣圖像中的每一個(gè)點(diǎn)夺衍,在k-b空間中畫出一條直線;
3喜命、對各直線上的點(diǎn)沟沙,我們采取“投票”(vote)的方法,即累加:有直線經(jīng)過這一點(diǎn)壁榕,這一點(diǎn)的值加1矛紫;
4、遍歷k-b空間牌里,找出局部極大值點(diǎn)颊咬,這些點(diǎn)的坐標(biāo)(k,b)就是原圖像中可能的直線的斜率和截距二庵。
霍夫變換的計(jì)算量和存儲(chǔ)都是很大的贪染。
同樣的原理,我們可以用來檢測圓催享,等式變?yōu)椋?x –a ) ^2 + (y-b) ^ 2 = r^2杭隙,這樣霍夫的參數(shù)空間就變成一個(gè)三維參數(shù)空間。若給定圓的半徑則簡化為二維霍夫參數(shù)空間因妙。
實(shí)例:
13.1.2 API介紹
霍夫line直線檢測痰憎,是基于canny邊緣檢測基礎(chǔ)上的。
opencv這個(gè)API只封裝了兩步攀涵。第一步就是翻遍環(huán)(R和theta到直線)
void HoughLines( InputArray image, OutputArray lines,
double rho, double theta, int threshold,
double srn = 0, double stn = 0,
double min_theta = 0, double max_theta = CV_PI );
參數(shù)說明:
InputArray image:輸入圖像铣耘,必須是8位單通道圖像,推薦使用canny邊緣檢測的結(jié)果圖像以故。
OutputArray lines:檢測到的線條參數(shù)集合蜗细。
double rho:以像素為單位的距離步長,推薦用1.0 。
double theta:以弧度為單位的角度步長炉媒,推薦用CV_PI/180踪区。
int threshold:累加計(jì)數(shù)值的閾值參數(shù),當(dāng)參數(shù)空間某個(gè)交點(diǎn)的累加計(jì)數(shù)的值超過該閾值吊骤,則認(rèn)為該交點(diǎn)對應(yīng)了圖像空間的一條直線缎岗。
double srn:默認(rèn)值為0,用于在多尺度霍夫變換中作為參數(shù)rho的除數(shù)白粉,rho=rho/srn传泊。
double stn:默認(rèn)值為0,用于在多尺度霍夫變換中作為參數(shù)theta的除數(shù)鸭巴,theta=theta/stn眷细。
如果srn和stn同時(shí)為0,就表示HoughLines函數(shù)執(zhí)行標(biāo)準(zhǔn)霍夫變換奕扣,否則就是執(zhí)行多尺度霍夫變換薪鹦。
13.2 圓檢測
13.2.1 霍夫圓檢測原理
霍夫圓變換:的基本原理和上個(gè)教程中提到的霍夫線變換類似, 只是點(diǎn)對應(yīng)的二維極徑極角空間被三維的圓心點(diǎn)x, y還有半徑r空間取代。
霍夫圓變換和霍夫線變換的原理類似惯豆〕卮牛霍夫線變換是兩個(gè)參數(shù)(r,θ),霍夫圓需要三個(gè)參數(shù)楷兽,圓心的x,y坐標(biāo)和圓的半徑,他的方程表達(dá)式(x?a)2+(y?b)2=c2,按照標(biāo)準(zhǔn)霍夫線變換思想地熄,在xy平面,三個(gè)點(diǎn)在同一個(gè)圓上芯杀,則它們對應(yīng)的空間曲面相交于一點(diǎn)(即點(diǎn)(a,b,c))端考。故我們?nèi)绻酪粋€(gè)邊界上的點(diǎn)的數(shù)目,足夠多揭厚,且這些點(diǎn)與之對應(yīng)的空間曲面相交于一點(diǎn)却特。則這些點(diǎn)構(gòu)成的邊界,就接近一個(gè)圓形筛圆。上述描述的是標(biāo)準(zhǔn)霍夫圓變換的原理裂明,由于三維空間的計(jì)算量大大增大的原因, 標(biāo)準(zhǔn)霍夫圓變化很難被應(yīng)用到實(shí)際中。
具體可以參考下圖:
以左圖三個(gè)點(diǎn)為圓心太援,做三個(gè)虛線圓闽晦,虛線圓焦點(diǎn)交于紅色點(diǎn),那么紅色點(diǎn)就是最亮的點(diǎn)(因?yàn)橹底畲筇岵恚奂悠飨沈龋恿巳慰隙ㄊ亲畲笠沧盍?。
13.2.2 API 與實(shí)例
C++: void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist, double param1=100,double param2=100, int minRadius=0, int maxRadius=0 )
第一個(gè)參數(shù)碱蒙,InputArray類型的image荠瘪,輸入圖像,即源圖像,需為8位的灰度單通道圖像哀墓。
第二個(gè)參數(shù)鞭莽,InputArray類型的circles,經(jīng)過調(diào)用HoughCircles函數(shù)后此參數(shù)存儲(chǔ)了檢測到的圓的輸出矢量麸祷,每個(gè)矢量由包含了3個(gè)元素的浮點(diǎn)矢量(x, y, radius)表示。
第三個(gè)參數(shù)褒搔,int類型的method阶牍,即使用的檢測方法,目前OpenCV中就霍夫梯度法一種可以使用星瘾,它的標(biāo)識(shí)符為CV_HOUGH_GRADIENT走孽,在此參數(shù)處填這個(gè)標(biāo)識(shí)符即可。
第四個(gè)參數(shù)琳状,double類型的dp磕瓷,用來檢測圓心的累加器圖像的分辨率于輸入圖像之比的倒數(shù),且此參數(shù)允許創(chuàng)建一個(gè)比輸入圖像分辨率低的累加器念逞。上述文字不好理解的話困食,來看例子吧。例如翎承,如果dp= 1時(shí)硕盹,累加器和輸入圖像具有相同的分辨率。如果dp=2叨咖,累加器便有輸入圖像一半那么大的寬度和高度瘩例。
第五個(gè)參數(shù),double類型的minDist甸各,為霍夫變換檢測到的圓的圓心之間的最小距離垛贤,即讓我們的算法能明顯區(qū)分的兩個(gè)不同圓之間的最小距離。這個(gè)參數(shù)如果太小的話趣倾,多個(gè)相鄰的圓可能被錯(cuò)誤地檢測成了一個(gè)重合的圓聘惦。反之,這個(gè)參數(shù)設(shè)置太大的話誊酌,某些圓就不能被檢測出來了部凑。
第六個(gè)參數(shù),double類型的param1碧浊,有默認(rèn)值100涂邀。它是第三個(gè)參數(shù)method設(shè)置的檢測方法的對應(yīng)的參數(shù)。對當(dāng)前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT箱锐,它表示傳遞給canny邊緣檢測算子的高閾值比勉,而低閾值為高閾值的一半。
第七個(gè)參數(shù),double類型的param2浩聋,也有默認(rèn)值100观蜗。它是第三個(gè)參數(shù)method設(shè)置的檢測方法的對應(yīng)的參數(shù)。對當(dāng)前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT衣洁,它表示在檢測階段圓心的累加器閾值墓捻。它越小的話,就可以檢測到更多根本不存在的圓坊夫,而它越大的話砖第,能通過檢測的圓就更加接近完美的圓形了。
第八個(gè)參數(shù)环凿,int類型的minRadius,有默認(rèn)值0梧兼,表示圓半徑的最小值。
第九個(gè)參數(shù)智听,int類型的maxRadius,也有默認(rèn)值0羽杰,表示圓半徑的最大值。