1.笛卡爾座標系與hough座標系
為了方便說明,我們先以笛卡爾座標系即直角座標系(與笛卡爾空間對應)為例來說明hough變換的基本原理。與笛卡爾座標系對應,我們構造乙個hough座標系(對應hough空間)。在hough座標系中,橫座標採用笛卡爾座標系中直線的斜率k,縱座標使用笛卡爾座標系中直線的截距b。
這條直線與點(xi
,yi)
(x_i,y_i)
(xi,y
i)在引數空間的直線相交於一點 (a0
,b0)
(a_0,b_0)
(a0,b
0),如圖所示:
笛卡爾空間中的點
笛卡爾空間內的關係(y=
kx+b
)(y=kx+b)
(y=kx+
b)hough空間
( xi
,yi)
(x_i,y_i)
(xi,y
i)yi=
axi+
by_i=ax_i+b
yi=ax
i+b
b =−
xik+
yib=-x_ik+y_i
b=−xi
k+yi(x
j,yj
)(x_j,y_j)
(xj,y
j)yj=
axj+
by_j=ax_j+b
yj=ax
j+b
b =−
xjk+
yjb=-x_jk+y_j
b=−xj
k+yj
由上可知:笛卡爾座標系中的一點(xi
,yi)
(x_i, y_i)
(xi,y
i)對應hough座標系中的一條直線b=−
axi+
yib =-ax_i+y_i
b=−axi
+yi
,而hough座標系中的乙個點(ai
,bi)
(a_i, b_i)
(ai,b
i)對應笛卡爾座標系的一條直線y=a
ix+b
iy = a_ix+b_i
y=aix
+bi
,在hough空間中,經過乙個點的直線越多,說明其在笛卡爾空間內的對映的直線,是由越多的點所構成的。我們知道,兩個點就能構成一條直線,但是,如果有乙個點是因為計算錯誤產生的,那麼它和另外乙個點也會構成一條直線,此時就會憑空構造出一條實際上並不存在的直線。這種情況是要極力避免的。因此,在計算中,我們希望用更多的點構造一條直線,以提高直線的可靠性。也就是說,如果一條直線是由越多的點構成的,那麼它實際存在的可能性就越大,它的可靠性也就越高。因此,hough變換選擇直線的基本思路是:選擇盡可能多直線交匯的點。
2.極座標系與hough座標系
上面都是以我們熟悉的笛卡爾空間為例說明的。在笛卡爾空間中,可能存在諸如x=x
0x=x_0
x=x0
的垂線lin
ealinea
line
a的形式,此時,斜率k為無窮大,截距b無法取值。因此,垂線lin
ealinea
line
a無法對映到hough空間內。為了解決上述問題,可以考慮講笛卡爾座標系對映到極座標系上。
opencv提供了函式cv2.houghlines()用來實現hough直線變換,該函式要求所操作的源圖是個二值影象,所以在進行hough變換之前要先講源影象進行二值化,或者進行canny邊緣檢測。
函式cv2.houghlines(image, rho, theta, threshold)
式中:概率hough變換對基本hough變換演算法進行了一些修正,是hough變換演算法的優化。它沒有考慮所有的點,相反,他只需要乙個足以進行線檢測的隨機點子集即可。
為了更好地判斷直線,概率hough變換演算法還對選取直線的方法作了兩點改進:
函式cv2.houghlinesp(image, rho, theta, threshold, minlinelengh, maxlinegap)
式中:
opencv學習筆記(六)霍夫直線檢測和圓檢測
1.霍夫變換直線檢測和圓檢測 霍夫變換是一種從空間域到極座標域的轉換。已知二維空間的一條直線有很多表現方式,例如截距式斜率式比如 y kx b,一旦我們知道k和b,就知道了這條直線,而k和b在座標上表示的只是乙個點而已,如果直線的k相同也就是直線平行,那麼表現在kb座標域也就是條k直線。那麼問題在於...
Reading Andrew Ng DL 目標檢測
目標檢測 1 物件定位和特徵點檢測 目標檢測的神經網路的目標標籤和損失函式為 2 基於滑動視窗的目標檢測演算法。定義 我們以某個步幅滑動這些方框視窗遍歷整張,對這些方形區域進行分類,判斷裡面有沒有汽車。缺點 計算量大 粒度 步幅 3 卷積的滑動視窗實現 基於滑動視窗的目標檢測演算法的缺點 計算量大 ...
Python Opencv Canny邊緣檢測
去噪 梯度 非極大值抑制 滯後閾值 梯度 角度 非極大值抑制 滯後閾值 梯度值 maxval 邊界 maxval 梯度值 minval 與邊界相連,保留。否則拋棄 梯度值 梯度值 ma xval maxv al 梯度 值 mi nval 梯度值nval 邊界與 邊界相連 保留。否則拋棄 拋棄 返回值...