Hough直线检测的理解
我們在前面的《圖像的顏色選擇》、《圖像的感興趣區域》中提到了對車道線的檢測。
通過對原始行車圖像進行顏色選擇和感興趣區域的提取,得到了如下的車道線:
我們的車道線當然是一左一右兩條線。那怎樣從這個車道線圖像中提取出這2條線呢?
這就要談到“霍夫變換(Hough Transfrom)”?;舴蜃儞Q是1972年提出來的,最開始就是用來在圖像中過檢測直線,后來擴展能檢測圓、曲線等。
我們在初中數學中了解到,一條直線可以用如下的方程來表示:y=kx+b,k是直線的斜率,b是截距。
圖像是一個個離散的像素點構成的,如果在圖像中有一條直線,那也是一系列的離散點構成的。那么怎樣檢測這些離散的點構成了直線呢?
我們再看上面的直線方程:y=kx+b,(x,y)就是點。我們轉換下變成:b=-kx+y。我們是不是也可以把(k,b)看作另外一個空間中的點?這就是k-b參數空間。
我們看到,在x-y圖像空間中的一個點,變成了k-b參數空間中的一條直線,而x-y圖像空間中的2點連成的直線,變成了k-b參數空間中的一個交點。
如果x-y圖像空間中有很多點在k-b空間中相交于一點,那么這個交點就是我們要檢測的直線。這就是霍夫變換檢測直線的基本原理。
當然,有一個問題需要注意,圖像空間中如果一條直線是垂直的,那么斜率k是沒有定義的(或者說無窮大)。為了避免這個問題,霍夫變換采用了另一個參數空間:距離-角度參數空間。
我們在中學中學過,平面上的一個點也可以用距離-角度來定義,也就是極坐標:
那么在圖像中,每一個點都可以用距離和角度來表達:
但是,使用距離-角度后,點(x,y)與距離,角度的關系變成了:
于是,在新的距離-角度參數空間中,圖像中的一個點變成了一個正弦曲線,而不是k-b參數空間中的直線了。這些正弦曲線的交點就是圖像空間中我們要檢測的直線了。
對于最開始的圖像,我們先用Canny進行邊緣檢測,較少圖像空間中需要檢測的點數量:
lane = cv2.imread("final_roi.png") # 高斯模糊,Canny邊緣檢測需要的 lane = cv2.GaussianBlur(lane, (5, 5), 0) # 進行邊緣檢測,減少圖像空間中需要檢測的點數量 lane = cv2.Canny(lane, 50, 150) cv2.imshow("lane", lane) cv2.waitKey() import numpy as np rho = 1 # 距離分辨率 theta = np.pi / 180 # 角度分辨率 threshold = 10 # 霍夫空間中多少個曲線相交才算作正式交點 min_line_len = 10 # 最少多少個像素點才構成一條直線 max_line_gap = 50 # 線段之間的最大間隔像素 lines = cv2.HoughLinesP(lane, rho, theta, threshold, maxLineGap=max_line_gap) line_img = np.zeros_like(lane) for line in lines:for x1, y1, x2, y2 in line:cv2.line(line_img, (x1, y1), (x2, y2), 255, 1) cv2.imshow("line_img", line_img) cv2.waitKey()總結
以上是生活随笔為你收集整理的Hough直线检测的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像的边缘检测
- 下一篇: 视觉SLAM总结——视觉SLAM十四讲笔