python實現直線檢測


目錄:

 (一)原理

  (二)代碼(標准霍夫線變換,統計概率霍夫線變換)

 

 

(一)原理

1.霍夫變換(Hough Transform) 霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進算法。主要用來從圖像中分離出具有某種相同特征的幾何形狀(如,直線,圓等)。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。

2.Hough變換的原理是將特定圖形上的點變換到一組參數空間上,根據參數空間點的累計結果找到一個極大值對應的解,那么這個解就對應着要尋找的幾何形狀的參數(比如說直線,那么就會得到直線的斜率k與常熟b,圓就會得到圓心與半徑等等)

3.霍夫線變換是一種用來尋找直線的方法。用霍夫線變換之前, 首先需要對圖像進行邊緣檢測的處理,也即霍夫線變換的直接輸入只能是邊緣二值圖像。

具體原理:https://blog.csdn.net/ycj9090900/article/details/52944708

(二)代碼(標准霍夫線變換,統計概率霍夫線變換)

 1 #直線檢測
 2 #使用霍夫直線變換做直線檢測,前提條件:邊緣檢測已經完成
 3 import cv2 as cv
 4 import numpy as np
 5 
 6 #標准霍夫線變換
 7 def line_detection(image):
 8     gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
 9     edges = cv.Canny(gray, 50, 150, apertureSize=3)  #apertureSize參數默認其實就是3
10     cv.imshow("edges", edges)
11     lines = cv.HoughLines(edges, 1, np.pi/180, 80)
12     for line in lines:
13         rho, theta = line[0]  #line[0]存儲的是點到直線的極徑和極角,其中極角是弧度表示的。
14         a = np.cos(theta)   #theta是弧度
15         b = np.sin(theta)
16         x0 = a * rho    #代表x = r * cos(theta)
17         y0 = b * rho    #代表y = r * sin(theta)
18         x1 = int(x0 + 1000 * (-b)) #計算直線起點橫坐標
19         y1 = int(y0 + 1000 * a)    #計算起始起點縱坐標
20         x2 = int(x0 - 1000 * (-b)) #計算直線終點橫坐標
21         y2 = int(y0 - 1000 * a)    #計算直線終點縱坐標    注:這里的數值1000給出了畫出的線段長度范圍大小
#,數值越小,畫出的線段越短,數值越大,畫出的線段越長
22 cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #點的坐標必須是元組,不能是列表。 23 cv.imshow("image-lines", image) 24 25 #統計概率霍夫線變換 26 def line_detect_possible_demo(image): 27 gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) 28 edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize參數默認其實就是3 29 lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5) 30 for line in lines: 31 x1, y1, x2, y2 = line[0] 32 cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) 33 cv.imshow("line_detect_possible_demo",image) 34 35 src = cv.imread('E:/imageload/louti.jpg') 36 print(src.shape) 37 cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) 38 cv.imshow('input_image', src) 39 line_detection(src) 40 src = cv.imread('E:/imageload/louti.jpg') #調用上一個函數后,會把傳入的src數組改變,所以調用下一個函數時,要重新讀取圖片 41 line_detect_possible_demo(src) 42 cv.waitKey(0) 43 cv.destroyAllWindows()

注意:

1.opencv的HoughLines函數是標准霍夫線變換函數,該函數的功能是通過一組參數對 (\theta, r_{\theta}) 的集合來表示檢測到的直線,

其函數原型為:HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

image參數表示邊緣檢測的輸出圖像,該圖像為單通道8位二進制圖像。

rho參數表示參數極徑 r 以像素值為單位的分辨率,這里一般使用1像素。

theta參數表示參數極角 \theta 以弧度為單位的分辨率,這里使用1度。

threshold參數表示檢測一條直線所需最少的曲線交點。

lines參數表示儲存着檢測到的直線的參數對 (r,\theta) 的容器 。

srn參數、stn參數默認都為0。如果srn = 0且stn = 0,則使用經典的Hough變換。

min_theta參數表示對於標准和多尺度Hough變換,檢查線條的最小角度。

max_theta參數表示對於標准和多尺度Hough變換,檢查線條的最大角度。

2.opencv的HoughLinesP函數是統計概率霍夫線變換函數,該函數能輸出檢測到的直線的端點 (x_{0}, y_{0}, x_{1}, y_{1})

其函數原型為:HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines

image參數表示邊緣檢測的輸出圖像,該圖像為單通道8位二進制圖像。

rho參數表示參數極徑 r 以像素值為單位的分辨率,這里一般使用 1 像素。

theta參數表示參數極角 \theta 以弧度為單位的分辨率,這里使用 1度。

threshold參數表示檢測一條直線所需最少的曲線交點。

lines參數表示儲存着檢測到的直線的參數對 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器,也就是線段兩個端點的坐標。

minLineLength參數表示能組成一條直線的最少點的數量,點數量不足的直線將被拋棄。

maxLineGap參數表示能被認為在一條直線上的亮點的最大距離。

參考:

https://www.cnblogs.com/FHC1994/p/9138315.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM