霍夫變換——形狀特徵提取算法:車道線檢測

2021-02-13 AI科技與算法編程

 霍夫變換是一種特徵提取,被廣泛應用在圖像分析、電腦視覺以及數位影像處理。霍夫變換是用來辨別找出物件中的特徵,例如:線條。他的算法流程大致如下,給定一個物件、要辨別的形狀的種類,算法會在參數空間中執行投票來決定物體的形狀,而這是由累加空間(accumulator space)裡的局部最大值來決定。

理論上,霍夫變換就是對於原圖上的每一個直線都在參數空間畫一條線,最終找出參數空間變換線比較密集的地方在對應回到xy 空間坐標系。為了方便理解,下面簡單寫了一下草稿,希望對你有幫助。

注意:建正交直角坐標系過程中, 要選取好以圖片的某個方位左起始點,以像素作為標度。

下圖所示:

圖像是一個 2D 矩陣,超過一些 x 和 y 坐標系,一條線可以描述為y = mx + b

霍夫空間的形成:

輸入的圖片中有兩條粗直線,經過霍夫變換後的結果得到accumaltor矩陣,右圖就是把accumaltor矩陣畫出來,越亮值越大,越黑值越小。在右圖中,有兩個很明顯的亮點, 這兩個亮點分別代表兩條不同參數的直線,與輸入的圖片(下圖)吻合。然後讀取矩陣的兩個最大值就可以得出這兩條線距畫面中心距離以及角度。

類似地,如果給的點坐標越多,形成的霍夫空間為:

圖像如何使用霍夫變換?

Hough 變換是一種用於檢測圖像中簡單形狀(如圓、線等)的特徵提取方法。

"簡單"特徵由形狀表示以參數表示派生。"簡單"形狀僅由幾個參數表示,例如,一條線可以由其斜率和截距表示,也可以用 x、y 和半徑表示。

在我們下面的行示例中,Hough 變換將負責處理圖像上的點並計算霍夫空間中的值。在 OpenCV 中,使用霍夫變換的線路檢測在函數和(概率霍夫變換)中實現。

直線檢測cv2.HoughLinesP()函數原型:
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
image:必須是二值圖像,推薦使用canny邊緣檢測的結果圖像;rho: 線段以像素為單位的距離精度,double類型的,推薦用1.0theta:線段以弧度為單位的角度精度,推薦用numpy.pi/180threshod: 累加平面的閾值參數,int類型,超過設定閾值才被檢測出線段,值越大,基本上意味著檢出的線段越長,檢出的線段個數越少。根據情況推薦先用100試試lines:這個參數的意義未知,發現不同的lines對結果沒影響,但是不要忽略了它的存在 minLineLength:線段以像素為單位的最小長度,根據應用場景設置 maxLineGap:同一方向上兩條線段判定為一條線段的最大允許間隔(斷裂),超過了設定值,則把兩條線段當成一條線段,值越大,允許線段上的斷裂越大,越有可能檢出潛在的直線段


import cv2
import numpy as np

original_img = cv2.imread("lane.png", 0)
img = cv2.resize(original_img, None, fx=0.8, fy=0.8,
interpolation=cv2.INTER_CUBIC)

img = cv2.GaussianBlur(img, (3, 3), 0)
edges = cv2.Canny(img, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 118) # 這裡對最後一個參數使用了經驗型的值
result = img.copy()
for line in lines:
rho = line[0][0] # 第一個元素是距離rho
theta = line[0][1] # 第二個元素是角度theta
print(rho)
print(theta)
if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)): # 垂直直線
pt1 = (int(rho / np.cos(theta)), 0) # 該直線與第一行的交點
# 該直線與最後一行的焦點
pt2 = (int((rho - result.shape[0] * np.sin(theta)) / np.cos(theta)), result.shape[0])
cv2.line(result, pt1, pt2, (255)) # 繪製一條白線
else: # 水平直線
pt1 = (0, int(rho / np.sin(theta))) # 該直線與第一列的交點
# 該直線與最後一列的交點
pt2 = (result.shape[1], int((rho - result.shape[1] * np.cos(theta)) / np.sin(theta)))
cv2.line(result, pt1, pt2, (255), 1) # 繪製一條直線
cv2.imshow('Canny', edges)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()


import cv2import numpy as npimg = cv2.imread('lane.jpg', cv2.IMREAD_COLOR)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)edges = cv2.Canny(gray, 50, 200)lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100,minLineLength=10, maxLineGap=250)for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3)
cv2.imshow("Result Image", img) cv2.waitKey() cv2.destroyAllWindows()

類似地還有圓形檢測,這裡就不介紹了,感興趣的替換一下面的代碼,並且找有圓形照片測試一下函數就可以。

霍夫圓形檢測cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) → circles
參數說明:image- 8位,單通道, 灰度輸入圖像。circles- 找到的圓的輸出向量。每個向量被編碼為3元素的浮點向量 (x,y,半徑)。circle_storage - 在C函數中,這是一個將包含找到的圓的輸出序列的內存存儲。method- 使用檢測方法。目前,唯一實現的方法是 CV_HOUGH_GRADIENT,基本上是 21HT,在[Yuen90]中有描述 。dp - 累加器解析度與圖像解析度的反比。例如,如果 dp = 1,則累加器具有與輸入圖像相同的解析度。如果 dp = 2,則累加器的寬度和高度都是一半。minDist -檢測到的 圓的中心之間的最小距離。如果參數太小,除了真正的參數外,可能會錯誤地檢測到多個鄰居圈。如果太大,可能會錯過一些圈子。param1 - 第一個方法特定的參數。在CV_HOUGH_GRADIENT的情況下, 兩個傳遞給Canny()邊緣檢測器的閾值較高(較小的兩個小於兩倍)。param2 - 第二種方法參數。在CV_HOUGH_GRADIENT的情況下,它是檢測階段的圓心的累加器閾值。越小,可能會檢測到越多的虛假圈子。首先返回對應於較大累加器值的圈子。minRadius -最小圓半徑。maxRadius - 最大圓半徑。

參考文獻

https://zhuanlan.zhihu.com/p/47649796https://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=houghlines#houghlineshttps://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

相關焦點

  • 用霍夫變換&SCNN碼一個車道追蹤器
    本教程將講解如何用計算機視覺技術構建車道追蹤器。本教程使用霍夫變換和 SCNN 兩種方法來完成這項任務。方法 1:霍夫變換大多數車道都設計得相對簡單,這不僅是為了鼓勵有序,還為了讓人類駕駛員更容易以相同的速度駕駛車輛。因此,我們的方法可能會通過邊緣檢測和特徵提取技術先檢測出攝像機饋送回來的直線。
  • 基於霍夫變換的直線檢測
    1 基本原理2 霍夫變換3 霍夫變換的應用
  • 霍夫變換原理剖析
    變換後的空間成為霍夫空間。即:笛卡爾坐標系中一條直線,對應霍夫空間的一個點。一步步來,再看一下三個點共線的情況:其實本質上就是:首先是對其進行邊緣檢測:邊緣檢測後並二值化,就可以通過找非零點的坐標確定數據點。從而對數據點進行霍夫變換。對應映射到霍夫空間的結果為:
  • 泊車輔助系統中的車位線自動檢測與識別
    >,再根據車位線特徵的先驗知識對Hough變換結果進行限制和優化,實現了車位線的識別。本文提出的方法可分為以下幾個過程:對汽車前、後、左、右4個攝像頭採集到的圖像進行重建形成全景圖像;圖像預處理,包括直方圖均衡化,二值化以及形態學處理;Canny邊緣檢測以及Hough變換,然後在參數空間中利用車位線特徵的先驗信息對結果進行優化,最終得出識別結果。具體算法流程如圖1所示。
  • Curvelet變換用於人臉特徵提取與識別
    人臉檢測是一個非常複雜的模式,人臉面部特徵提取及識別成為當前計算機圖像處理相關學科的一個極具挑戰的課題。而基於Carvelet變換的人臉特徵提取及識別的意義在於Curvelet繼承了小波分析優良的空域和頻域局部特性,是又一個新的圖像多尺度兒何分析工其,其相對於小波的優勢在於更加適合描述圖像的幾何特徵,因此也更適合人臉特徵提取及識別分析。。
  • 專欄| 如何利用雷射雷達檢測車道線?這裡提供了4種方法
    後三種方法需要多線雷射雷達,最少也是16線雷射雷達。前者可以使用4線或單線雷射雷達,考慮到奧迪A8已經開始使用4線雷射雷達,4線雷射雷達已經進入實用階段。 當然,這四種方法也可以混合使用。車道線檢測兩步走車道線檢測基本分兩部走:提取幾何或物理特徵,利用離散數據擬合成車道線。
  • OpenCV 之 霍夫變換
    Hough 變換,對圖像中直線的殘缺部分、噪聲、以及其它的共存結構不敏感,因此,具有很強的魯棒性。
  • 語音識別算法有哪些_語音識別特徵提取方法
    語音識別算法有哪些_語音識別特徵提取方法 網絡整理 發表於 2020-04-01 09:24:49   語音識別算法有哪些   本文列舉了幾種不同的語音識別算法
  • 乾貨|一文讀懂圖像局部特徵點檢測算法
    研究圖像特徵檢測已經有一段時間了,圖像特徵檢測的方法很多,又加上各種算法的變形,所以難以在短時間內全面的了解,只是對主流的特徵檢測算法的原理進行了學習研究。總體來說,圖像特徵可以包括顏色特徵、紋理特徵、形狀特徵以及局部特徵點等。其中局部特點具有很好的穩定性,不容易受外界環境的幹擾,本篇文章也是對這方面知識的一個總結。
  • 綜述|線結構光中心提取算法研究發展
    本文詳細闡述了光條紋中心提取算法的理論基礎及發展歷程,將現有算法分為三類,傳統光條紋中心提取算法、基於傳統光條紋中心提取的改進算法、基於神經網絡光條紋中心提取算法,並提出每一類算法的優勢與不足。最後,對線結構光中心提取算法的發展提出展望,生產更高質量的線雷射器,擴充基於神經網絡的光條紋中心線檢測模型的訓練樣本。
  • 視頻圖像中文本的檢測、定位與提取
    目前,基於內容的視頻信息檢索(Content―Based Video Retrieval,簡稱CBVR)的研究已取得了較大的進展,但是檢索所採用的特徵基本上都是低級視覺特徵,如顏色、紋理、形狀、空間關係和運動等。
  • 一文概覽目標檢測領域進展(數據集/2D/3D
    他們首先使用數據增強策略,然後使用一些經過改進的 3D 特徵提取網絡,最後改進訓練流程和對損失的評估,進而實現整體性能的提升。 3 2D目標檢測 3.1 傳統方法 傳統的目標檢測算法通常基於不同類型的特徵描述子。
  • 基於小波變換和自相關函數的基音頻率檢測算法
    由於基音周期只具有準周期性,所有只能採用短時平均方法估計該周期,這個過程也稱為基音檢測(Pitch De―tection)。在對說話人確認和辨認研究中,基音頻率是一個重要的參數,因此準確檢測基音頻率有著十分重要的意義。 到目前為止,基音檢測的方法主要有短時自相關函數法、平均幅度差函數法、倒譜解卷積法、Hil―be;t―Huang變換法等。
  • 虹膜識別原理及算法
    從識別的角度來說,虹膜的顏色信息並不具有廣泛的區分性,那些相互交錯的類似於斑點、細絲、冠狀、條紋、隱窩等形狀的細微特徵才是虹膜唯一性的體現。這些細微特徵在彩色圖像和灰度圖像中是一致的,因此一般採用灰度圖像進行虹膜識別的研究。
  • 從數據集到2D和3D方法,一文概覽目標檢測領域進展
    他們首先使用數據增強策略,然後使用一些經過改進的 3D 特徵提取網絡,最後改進訓練流程和對損失的評估,進而實現整體性能的提升。3 2D目標檢測3.1 傳統方法傳統的目標檢測算法通常基於不同類型的特徵描述子。方向梯度直方圖(HOG)[12] 就是其中一種著名的描述子,它統計在已定位的圖像部分中梯度方向的出現次數。
  • 複雜場景下的複雜缺陷檢測方法——深度學習算法綜述
    二、傳統算法傳統的表面缺陷檢測算法結構通過圖像預處理得到便於檢測的圖像,隨後藉助統計機器學習方法來提取圖像特徵,進而實現缺陷檢測的目標。圖像預處理通常包括直方圖均衡化、濾波去噪、灰度二值化、再次濾波幾部分,以得到前後景分離的簡單化圖像信息;隨後利用數學形態學、傅立葉變換、Gabor 變換等算法以及機器學習模型完成缺陷的標記與檢測。上述傳統算法在某些特定的應用中已經取得了較好的效果,但仍然存在許多不足。
  • 自動駕駛新驅動力:點雲算法如何釋放雷射雷達威力?
    這些傳感器的數據輸入到系統的感知算法裡,對於這個感知算法,我們會將這些數據進行處理分析,如何將靜態的物體分離出來,並如何識別、分類與跟蹤動態物體。當雷射雷達實時掃描單次的點雲數據後,我們會去結合單次的點雲數據進行匹配,並進行特徵提取。這些特徵包括路沿、車道線等周圍點線面的特徵。對於高精度地圖,提取過特徵與實時提取的特徵進行匹配,最終得到精準的車本體速度,這是雷射雷達的定位過程。雷射雷達的第二個應用:障礙物的檢測和分類。
  • 基於小波包變換和壓縮感知的人臉識別算法
    本文針對上述字典構成問題,提出基於基函數字典下的稀疏表示,尋找一個正交基,使得信號表示的稀疏係數儘可能的少,小波基符合這一要求,同時小波包變換能提取人臉低頻、高頻四個頻帶的特徵,包括人臉的整體特徵和局部紋理特徵,小波包多層變換後還可以2n的速度對人臉圖像進行降維。
  • 基於陰影重建形狀的視覺技術:一種重要的圖像形狀提取技術及其應用
    而視覺檢測的應用可分類為測量、有/無檢測、機器人導航、瑕疵檢測、一維或二維碼識別,以及光學文字識別(OCR)閱讀等等。常規的2D算法通常擅長處理某些特徵清晰且定義明確的應用,因此檢測更加可靠。 換句話說,目標特徵必須穩定並且清晰一致地呈現,檢測和識別才會比較可靠。