目錄
霍夫變換原理
映射
峰值統計
總結
OpenCv中的霍夫線檢測
霍夫變換原理
霍夫變換運用兩個坐標空間之間的變換,將在一個空間中具有相同形狀的曲線或直線映射到另一個坐標空間的一個點上形成峰值,從而把檢測任意形狀的問題轉化為統計峰值問題,
可以看出,要搞清楚的主要問題:
- 映射
- 峰值統計
映射
比如說,當霍夫空間引數為(k,q)時:
在笛卡爾坐標平面(x、y坐標系)中的一條直線(y=kx+q)對應霍夫空間的一個點(k,q),
反過來同樣成立,笛卡爾坐標系中的一個點對應著霍夫空間種的一條直線,
并且經過驗證,若笛卡爾坐標系中n點在同一直線上,那么在霍夫空間中n線就交于同一點,
以上就是映射,但是未考慮到完整的情況,如果在笛卡爾坐標系中有線是垂直x軸的(也就是k=∞),那么在霍夫空間中這個點要畫到無窮遠處去了,因此應對笛卡爾坐標系進行極坐標變換后再霍夫空間引數設為ρ,θ,
可以看出點映射直線,變成了點映射曲線,但是該相交還是相交,
峰值統計
上面已經提到,原坐標系空間中的在一條直線上的點映射成霍夫空間中的一族曲線后交于同一點,
那么峰值統計要統計的就是霍夫空間中每個點被經過的曲線數量,
為什么?因為當霍夫空間中一個點被經過的曲線越多,那就說明原空間中越多的點在同一條直線上,那就說明這條“直線”是直線的概率越大,(總所周知,直線其實就是無數個點連在一起...)
那怎么統計呢?對霍夫空間進行離散化,然后對網格單元進行檢查,累加計數值最大的網格,其坐標值(ρ0, θ0)就對應影像空間中所求的直線,

總結
原理步驟
1. 霍夫變換
2.對每一點統計峰值
3.設定閾值,得到直線
當然你也可以在霍夫變換之前進行平滑去噪、Canny邊緣檢測等其他操作,
OpenCv中的霍夫線檢測
opencv中存在兩種方法:
1.霍夫線檢測:
lines = cv.HoughLines( image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]] )
- lines:回傳值(ρ,θ),ρ以像素為單位,θ以弧度為單位,
- rho:累加器的距離解析度(以像素為單位),
- theta:累加器的角度解析度(弧度),
- threshold:閾值,僅大于的才可以被回傳,
- srn:對于多尺度Hough變換,它是距離解析度rho的除數,粗累加器距離解析度為rho,精確累加器解析度為rho/srn,如果srn=0和stn=0,則使用經典Hough變換,否則,這兩個引數都應為正值,
- stn:對于多尺度Hough變換,它是距離解析度θ的除數,
- min_theta:對于標準和多尺度Hough變換,檢查直線的最小角度,必須介于0和最大θ之間,
- max_theta:對于標準和多尺度Hough變換,檢查直線的最大角度,必須介于min_theta和CV_PI之間,
import cv2
import numpy as np
img = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv2.imwrite('houghlines3.jpg',img)
2.概率霍夫線檢測:
lines = cv.HoughLinesP( image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]] )
- lines:回傳兩個端點的坐標,
- rho:累加器的距離解析度(以像素為單位),
- theta:累加器的角度解析度(弧度),
- threshold:閾值,僅大于的才可以被回傳,
- minLineLength:最小行長度,小于該長度的線段將被拒絕,
- maxLineGap:同一直線上連接點的最大允許間距,
import cv2
import numpy as np
img = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imwrite('houghlines5.jpg',img)
相關參考:
OpenCV霍夫變換系列(前篇)-經典霍夫線變換
影像直線檢測——霍夫線變換
霍夫變換直線檢測(Line Detection)原理及示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295035.html
標籤:其他
