一帆喇、霍夫直線檢測
霍夫變換(Hough Transfrom),是1972年提出的,最開始就是用來在圖像中檢測直線臂外,后來擴展能檢測圓、曲線等
原理:
圖像是一個個離散的像素點構(gòu)成喇颁,如果在圖像中有一條直線漏健,那也是一系列的離散點構(gòu)成。
一條直線可以用方程式:y=kx+b表示橘霎,k是斜率蔫浆,b是截距,(x,y)也是點姐叁。我們可以轉(zhuǎn)換成b=-kx+y瓦盛。我們可以把(k,b)看作另外一個空間的點
我們看到,在x-y圖像空間中的一個點外潜,變成了k-b參數(shù)空間中的一條線原环,而x-y圖像空間中的2個點連成的線,變成了k-b參數(shù)空間中的一個交點
所以橡卤,霍夫變換檢測直線的原理就是:
如果x-y圖像空間中有很多點在k-b空間中相交于一點扮念,那么這個交點就是我們要檢測的直線
有一個問題需要注意,圖像空間中如果一條直線是垂直的碧库,那么斜率k是沒有定義的(或者說無窮大)柜与。為了避免這個問題,霍夫變換采用了另一個參數(shù)空間:距離-角度參數(shù)空間
那么在圖像中嵌灰,每個點都可以用距離和角度來表達
點(x,y)與距離和角度的關(guān)系變成了r=xcosθ+ysinθ
在新的距離-角度參數(shù)空間中弄匕,圖像中的一個點變成了一個正弦曲線,而不是k-b參數(shù)空間中的直線了沽瞭。這些正弦曲線的交點就是圖像空間中我們要檢測的直線了
每一個(r,θ)都表示一條經(jīng)過(x0,y0)直線迁匠,那么同一條直線上的點必然會有同樣的(r,θ)。如果將某個點所有的(r,θ)繪制成下面的曲線驹溃,那么同一條直線上的點的(r,θ)曲線會相交于一點
函數(shù):(cv2.HoughLines(src, 1, np.pi/180,200))
(1)參數(shù)是輸入圖像城丧,且必須是二值圖像,在進行霍夫變換之前需要采用閾值方法的邊緣檢測豌鹤;
第二和第三個參數(shù)分別是r,θ對應(yīng)的精度亡哄;
第四個參數(shù)是閾值,判定為直線投票數(shù)的最小值布疙;
注意蚊惯,投票數(shù)取決于直線上點的個數(shù)愿卸,因此這個閾值代表了檢測到的直線的最短長度
霍夫變換的應(yīng)用:用于分離圖像中特殊形狀的特征
可以容忍特征邊界描述的誤差,并且不受噪聲的干擾
廣泛用于條形碼掃描截型、驗證和識別
二趴荸、霍夫圓檢測
假設(shè)一個圓,半徑為r宦焦,圓心為(a,b)发钝,我們將其表示為:
HoughCircles( InputArray image, OutputArray circles, Int method, Double dp, Double mindist, Double param1, ouble param2, Int minradius, Int maxradius )
參數(shù):
image:輸入圖像 ,必須是8位的單通道灰度圖像
circles: 輸出結(jié)果,發(fā)現(xiàn)的圓信息 (x, y, radius)
method: 方法 CV_HOUGH_GRADIENT
dp = 1:用來檢測圓心的累加器圖像的分辨率于輸入圖像之比的倒數(shù)波闹,且此參數(shù)允許創(chuàng)建一個比輸入圖像分辨率低的累加器笼平。例如,如果dp= 1時舔痪,累加器和輸入圖像具有相同的分辨率寓调。如果dp=2,累加器便有輸入圖像一半那么大的寬度和高度锄码。
mindist:10 最短距離-可以分辨是兩個圓的夺英,否則認為是同心圓。這個參數(shù)如果太小的話滋捶,多個相鄰的圓可能被錯誤地檢測成了一個重合的圓痛悯。反之,這個參數(shù)設(shè)置太大的話重窟,某些圓就不能被檢測出來了载萌。
param1:它表示傳遞給canny邊緣檢測算子的高閾值,而低閾值為高閾值的一半巡扇。
param2:中心點累加器閾值 – 候選圓心扭仁。它越小的話,就可以檢測到更多根本不存在的圓厅翔,而它越大的話乖坠,能通過檢測的圓就更加接近完美的圓形了。
minradius, // 最小半徑
maxradius//最大半徑