1. 程式人生 > >車道線檢測演算法

車道線檢測演算法

1.高斯模糊演算法

blur_gray = cv2.GaussianBlur(gray,(kernel_size,kernel_size),0)
Mathematically, applying a Gaussian blur to an image is the same as convolving the image with a Gaussian function.
數學上講,對影象做高斯模糊等同於將影象與高斯函式卷積。
Since the Fourier transform of a Gaussian is another Gaussian, applying a Gaussian blur has the effect of reducing the image’s high-frequency components; a Gaussian blur is thus a low pass filter.
由於高斯分佈的傅立葉變換仍然是高斯分佈,使用高斯模糊就減少了影象的高頻分量,因此高斯模糊是低通濾波器。

引數:
gray為灰度圖;
(kernel_size,kernel_size):表示高斯矩陣的長與寬都是kernel_size,第三個引數0為高斯矩陣的標準差。

高斯模糊本質上是低通濾波器,輸出影象的每個畫素點是原影象上對應畫素點與周圍畫素點的加權和,原理並不複雜,就是用高斯分佈權值矩陣與原始影象矩陣做卷積運算而已。類似神經網路中卷積層的卷積。

這裡(kernel_size,kernel_size)表示高斯矩陣的長與寬都是kernel_size,標準差取0時OpenCV會根據高斯矩陣的尺寸自己計算。概括地講,高斯矩陣的尺寸越大標準差越大,處理過的影象模糊程度越大

2.Canny邊緣檢測演算法

edges = cv2.Canny(blur_gray, low_threshold, high_threshold)

引數:
blur_gray為模糊後的灰度圖;
low_threshold為閾值下界;
high_threshold閾值上界;兩閾值用來判斷梯度大小。

Canny演算法的基本思想是找尋一幅影象中灰度強度變化最強的位置。所謂變化最強,即指梯度最大。平滑後的影象中每個畫素點的梯度可以由Sobel運算元(一種卷積運算)來獲得(opencv中有封裝好的函式,可以求影象中每個畫素點的n階導數)。

首先,利用如下的核來分別求得沿水平(x)和垂直(y)方向的梯度G_X和G_Y。

        K_{GX} = [-1 0 1; -2 0 2; -1 0 1],  K_{GY} = [-1 -2 -1; 0 0 0; 1 2 1] 

之後,便可利用公式來求得每一個畫素點的梯度值,

G=Gx2+Gx2
有時為了計算簡便,也會使用G_X和G_Y的無窮大範數來代替二範數。把平滑後的影象中的每一個點用G代替後,便得到梯度圖。
Canny演算法中應用了一種叫雙閾值的技術。即設定一個閾值上界和閾值下界(opencv中通常由人為指定的),影象中的畫素點如果大於閾值上界high_threshold則認為必然是邊界(稱為強邊界,strong edge),小於閾值下界low_threshold則認為必然不是邊界,兩者之間的則認為是候選項(稱為弱邊界,weak edge),需進行進一步處理。

3.霍夫變換

lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
                        min_line_length, max_line_gap)

引數:
edges: 必須是二值影象,推薦使用canny邊緣檢測的結果影象;
rho: 線段以畫素為單位的距離精度,double型別的,推薦用1.0;
theta: 線段以弧度為單位的角度精度,推薦用np.pi/180;
threshold: 累加平面的閾值引數,int型別,超過設定閾值才被檢測出線段,值越大,基本上意味著檢出的線段越長,檢出的線段個數越少;
np.array([]) 這個引數為佔位符,對結果無影響;
min_line_length: 線段以畫素為單位的最小長度,根據應用場景設定;
max_line_gap: 同一方向上兩條線段判定為一條線段的最大允許間隔(斷裂),超過了設定值,則把兩條線段當成一條線段,值越大,允許線段上的斷裂越大,越有可能檢出潛在的直線段。