1. 程式人生 > 程式設計 >Python+OpenCV影象處理——實現直線檢測

Python+OpenCV影象處理——實現直線檢測

簡介:

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

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

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

4.霍夫直線檢測的具體原理參見:

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

程式碼如下:

#直線檢測
#使用霍夫直線變換做直線檢測,前提條件:邊緣檢測已經完成
import cv2 as cv
import numpy as np

#標準霍夫線變換
def line_detection(image):
 gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY)
 edges = cv.Canny(gray,50,150,apertureSize=3) #apertureSize引數預設其實就是3
 cv.imshow("edges",edges)
 lines = cv.HoughLines(edges,1,np.pi/180,80)
 for line in lines:
 rho,theta = line[0] #line[0]儲存的是點到直線的極徑和極角,其中極角是弧度表示的。
 a = np.cos(theta) #theta是弧度
 b = np.sin(theta)
 x0 = a * rho #代表x = r * cos(theta)
 y0 = b * rho #代表y = r * sin(theta)
 x1 = int(x0 + 1000 * (-b)) #計算直線起點橫座標
 y1 = int(y0 + 1000 * a) #計算起始起點縱座標
 x2 = int(x0 - 1000 * (-b)) #計算直線終點橫座標
 y2 = int(y0 - 1000 * a) #計算直線終點縱座標 注:這裡的數值1000給出了畫出的線段長度範圍大小,數值越小,畫出的線段越短,數值越大,畫出的線段越長
 cv.line(image,(x1,y1),(x2,y2),(0,255),2) #點的座標必須是元組,不能是列表。
 cv.imshow("image-lines",image)

#統計概率霍夫線變換
def line_detect_possible_demo(image):
 gray = cv.cvtColor(image,apertureSize=3) # apertureSize引數預設其實就是3
 lines = cv.HoughLinesP(edges,np.pi / 180,60,minLineLength=60,maxLineGap=5)
 for line in lines:
 x1,y1,x2,y2 = line[0]
 cv.line(image,2)
 cv.imshow("line_detect_possible_demo",image)

src = cv.imread('E:/imageload/louti.jpg')
print(src.shape)
cv.namedWindow('input_image',cv.WINDOW_AUTOSIZE) 
cv.imshow('input_image',src)
line_detection(src)
src = cv.imread('E:/imageload/louti.jpg') #呼叫上一個函式後,會把傳入的src陣列改變,所以呼叫下一個函式時,要重新讀取圖片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

執行結果:

Python+OpenCV影象處理——實現直線檢測

注意:

1.opencv的HoughLines函式是標準霍夫線變換函式,該函式的功能是通過一組引數對Python+OpenCV影象處理——實現直線檢測的集合來表示檢測到的直線,其函式原型為:HoughLines(image,rho,theta,threshold[,lines[,srn[,stn[,min_theta[,max_theta]]]]]) -> lines

image引數表示邊緣檢測的輸出影象,該影象為單通道8位二進位制影象。

rho引數表示引數極徑Python+OpenCV影象處理——實現直線檢測以畫素值為單位的解析度,這裡一般使用1畫素。

theta引數表示引數極角Python+OpenCV影象處理——實現直線檢測以弧度為單位的解析度,這裡使用1度。

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

lines引數表示儲存著檢測到的直線的引數對Python+OpenCV影象處理——實現直線檢測的容器 。

srn引數、stn引數預設都為0。如果srn = 0且stn = 0,則使用經典的Hough變換。

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

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

2.opencv的HoughLinesP函式是統計概率霍夫線變換函式,該函式能輸出檢測到的直線的端點Python+OpenCV影象處理——實現直線檢測,其函式原型為:HoughLinesP(image,minLineLength[,maxLineGap]]]) -> lines

image引數表示邊緣檢測的輸出影象,該影象為單通道8位二進位制影象。

rho引數表示引數極徑Python+OpenCV影象處理——實現直線檢測以畫素值為單位的解析度,這裡一般使用1畫素。

theta引數表示引數極角Python+OpenCV影象處理——實現直線檢測以弧度為單位的解析度,這裡使用1度。

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

lines引數表示儲存著檢測到的直線的引數對Python+OpenCV影象處理——實現直線檢測的容器,也就是線段兩個端點的座標。

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

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

以上就是Python+OpenCV影象處理——實現直線檢測的詳細內容,更多關於python 直線檢測的資料請關注我們其它相關文章!