王懷濤,曹明偉,邢皎玉 Wang Huaitao,Cao Mingwei,Xing Jiaoyu
?
基于HSV顏色空間與邊緣特征的黃色車道線檢測
王懷濤,曹明偉,邢皎玉 Wang Huaitao,Cao Mingwei,Xing Jiaoyu
(合肥工業大學汽車與交通工程學院,安徽合肥 230009)
車道線檢測是實現汽車智能行駛的首要技術,文中闡述了一種在城市復雜道路環境中直線部分黃色車道線的檢測方法。首先,利用黃色車道線在HSV顏色空間的顏色特征檢測出照片中的黃色像素。為此,首先采集不同光照強度條件下的黃色車道線像素作為樣本值,再以此樣本值為后驗知識來檢測出目標照片中黃色像素,但此時會保留有較多的干擾像素;其次,利用車道線邊緣的直線特征檢測出目標照片中具有直線特征的像素。再次,將前2步得到的結果作與運算,去除絕大部分干擾像素;最后,在得到的結果圖上運用霍夫變換,迅速得到所要檢測的黃色車道線。
黃色車道線;HSV顏色空間;邊緣特征;與運算;霍夫變換
智能化是未來汽車產業發展的趨勢,車道線作為智能汽車安全行駛重要參考標線,其快速準確地檢測顯得尤為重要。
當前車道線檢測算法主要有基于灰度圖的閾值分割法[1-2],基于Canny算子的車道線邊緣檢測算法[3],基于車道線顏色特征的閾值分割法[4]。前2種方法未能利用車道線顏色這一重要特征,用于檢測道路中的白色車道線時具有較好的效果,但檢測亮度較低的黃色車道線時效果很差;后一種方法雖然利用了車道線的顏色特征,但是根據車道線顏色進行圖像分割的顏色閾值會隨著光照、車道線的新舊不同而變化,而且會識別出干擾像素。
文中提出一種新的車道線檢測方法,專用于黃色車道線檢測。先通過查找H-S(Hue-Saturation,色相-飽和度)二維表識別出具有黃色特征的像素,再在這些具有黃色特征的像素中識別出具有直線邊緣特征的像素,然后濾除同時具有黃色和直線邊緣特征的干擾像素,最后進行霍夫變換即可檢測出黃色車道線。
采集樣本照片中黃色車道線的像素點,根據這些像素點在HSV(Hue,Saturation,Value,色相、飽和度、亮度)空間的H、S值建立一個用來描述、存儲車道線黃色特征的數據庫,即H-S二維表;通過將目標照片中的像素值與此H-S二維表中的值作比較即可識別出目標照片中的黃色像素點。此H-S二維表應能夠隨著車道線識別程序的運行而不斷更新。
1.1 建表方法
拍攝20張在不同光照下含有不同干擾因素的包含黃色車道線的照片。拍攝點選在車道中間,模擬車載相機的拍攝角度。選取不同光照條件下、含有不同干擾的6張照片作為樣本照片如圖1(a)所示,剩下3張照片作為目標照片。用圖像編輯工具提取6張樣本照片中的黃色車道線,并將它們放到黃色車道線提取圖如圖1(b)所示,再統計黃色車道線提取圖中每一對(H,S)像素特征值所對應的像素個數,該像素個數縮放后的數值就是所要建立二維表中對應(H,S)坐標處的數值,這樣能建立所需要的初始H-S二維表。
在HSV空間中每個黃色車道線像素均對應H、S、V 3個值,根據不同光照、不同亮度條件下的顏色恒常性原理,僅選取H、S 2個值來建立二維表格,弱化光照強度對檢測結果的不利影響。
1.2 建表過程
提取的黃色車道線如圖1所示。
用OpenCV中的cvtColor函數(函數的轉換格式參數選用CV_BGR2HSV_FULL,這樣轉換后的H、S值的范圍均在0~255[5],和像素亮度范圍一致)將圖1(b)轉換到HSV顏色空間后,用calcHist函數統計圖1(b)中每一對(H,S)值對應的像素個數;不統計黑色(即H=S=0)區域的像素,因為它們不是黃色車道線像素。然后用convertTo函數將像素個數值縮放到0~255范圍內。以左上角為坐標原點,以飽和度S為水平軸,以色相H為豎直軸,以縮放后的數值作為對應(H,S)坐標處的數值,得到初始二維表(表中數據太多,不便直接顯示)。由于表中的數值被縮放到0~255范圍內,與灰度像素的灰度值范圍相同,所以可以將初始二維表看做是一張灰度圖片的mat格式矩陣,以圖片格式顯示出來的結果如圖2所示[6]。為了方便打印,圖中像素點的黑色程度代表該像素的灰度值,像素點越黑,灰度值越大;以下各圖的處理方式與圖2相同。
由圖2可知,灰度值非0的像素大部分分布在H為15~30、S為30~105范圍內。其他范圍內灰度值為0,說明在這些范圍內的每對(H,S)值在圖1(b)中對應的像素個數為0(H=S=0的像素除外)。圖2中某像素越黑,說明該像素對應的(H,S)值在圖1(b)中對應的像素個數越多,則該對(H,S)屬于黃色車道線特征的概率越大。
有了初始二維表,就可以將其用于后面的查表操作。之所以將其稱作初始二維表是因為該表是不斷更新的。當用初始二維表檢測出黃色車道線后,用檢測出的黃色車道線替換掉圖1(b)中的車道線,得到新的二維表;不斷地更新二維表可以使查表結果圖(圖4)中的干擾像素更少,使檢測過程更快速準確。
選擇一張目標照片如圖3所示,可看出照片中的干擾。
先用cvtColor函數將彩色目標照片1(圖3)轉換到HSV空間,再用OpenCV中的lut函數對圖3中的每個像素按照(H,S)分量值在初始二維表(圖2)中進行查表操作,查表后得到一張灰度圖,如圖4所示。
由圖4可知,運用查表法,無論是在教學樓陰影中的黃色車道線還是在陽光下的車道線都能被順利檢測出來;查表法能濾除大部分非黃色干擾像素。但是對于顯示為黃色的干擾像素(人體外露的黃色胳膊和小腿皮膚、法國梧桐樹干下端表皮脫落露出的黃色內皮、黃色樹葉、黃色落葉以及在陽光下反射淡黃色光的柏油路面),查表法無法濾除;因此需要利用車道線的邊緣特征來濾除余下的干擾像素。
黃色車道線的邊緣像素連線是一條傾斜的直線,這一特征是其他黃色干擾像素所不具備的,利用這一特征可以濾除這些黃色干擾像素。
各種斜率的道路右側車道線(道路左側車道線類同)的模擬放大圖如圖5所示,即以未經過消除鋸齒處理的直線放大后的邊緣模擬實際車道線的邊緣,達到清楚顯示車道線邊緣特征的目的。檢測車道線的目的是獲得車道線的數學方程,因此只需要檢測出車道線上能反映其形狀特征的那一部分像素即可,無需檢測出車道線上的所有像素。選擇道路右側車道線的左邊緣像素和道路左側車道線的右邊緣像素為待檢測目標像素,這樣檢測出的車道更窄,更有利于車輛偏離車道預警控制。
對于圖5中保留鋸齒的模擬道路右側車道線,待檢測目標像素為車道線的左邊緣鋸齒尖像素,因為鋸齒尖像素特征最為明顯,最易區分。將以鋸齒尖像素為中心的9個像素(3×3,編號1~9,鋸齒尖編號為5)局部放大并顯示在圖5中。由圖可知,不論右側車道線斜率多大,其左邊緣以鋸齒尖像素為中心的9個像素的亮度分布具有相同的特征:編號2、編號3、編號6這3個像素的亮度均比編號4、編號7、編號8這3個像素大了許多(命名為特征①)。利用這一特征來檢測道路右側車道線左邊緣鋸齒尖像素和道路左側車道線右邊緣鋸齒尖像素。
用于檢測出鋸齒尖像素的原圖可選擇目標照片的查表結果圖(圖4)或者其在HSV空間的S或V分量圖(H分量圖中車道線在陽光下的部分不可見,所以不能選H分量圖)(圖6)。由圖4和圖6中的部分車道線邊緣放大圖可知,邊緣鋸齒特征最明顯且最滿足特征①的是V分量圖,選擇從V分量圖中檢測出鋸齒尖像素。
為了提高檢測速度,采用在前面識別出的黃色特征像素點內部檢測出具有直線邊緣特征(特征①)的像素點。對于查表結果圖中每個不為0的像素點,找到與它位置相同的在V分量圖中的像素點a;在V分量圖中以像素點a為編號5像素,考察其周圍的8個像素亮度分布情況(圖5中的放大圖),如果編號2、編號3、編號6這3個像素的最小亮度比編號4、編號7、編號8這3個像素的最大亮度大10(之所以取10,是因為經對比分析,亮度差值小于10的分界線,人眼基本無法區分),就認為這個像素是目標像素并將其像素值設為255,否則設為0;二值化后的檢測結果如圖7所示。
在圖7中,雖然檢測出了黃色車道線邊緣,但是也保留了白色車道線和白色人行橫道線的邊緣干擾像素。在多數情況下,經過黃色特征提取和直線邊緣特征提取后,均能成功檢測出黃色車道線像素。但對于夕陽照射下柏油路面,由于白色線為無色,柏油路面顯示淡黃色,導致白色線與柏油路面的交接處既具有黃色特征也具有直線邊緣特征,從而被檢測算法誤認為是黃色車道線而被檢測出來。為了濾除此類干擾,可以將檢測出來的鋸齒尖像素(圖7)向車道線中心方向水平移動(右邊車道線檢測算法向右移,左邊車道線檢測算法向左移)4個像素的距離,然后再與查表結果圖(圖4)作與運算;由于查表結果圖中白色車道線和人行橫道線內部像素灰度值為0,而黃色車道線內部像素灰度值不為0,與運算便濾除了白色車道線和人行橫道線的邊緣干擾像素。圖7中的非0像素水平移動4個像素后的結果與圖7類似,不再給出。
此處的與運算是指按位與運算。如果水平移動4個像素后的結果圖(圖7)像素灰度值為255,二進制表示1111 1111,那么查表結果圖(圖4)中相應位置的像素灰度值與其作按位與運算后結果不變;如果其像素灰度值為0,二進制表示0000 0000,那么查表結果圖(圖4)中相應位置的像素灰度值與其作按位與運算后結果為0。與運算的結果圖二值化后如圖8所示。
由圖8可知,與運算不但濾除了白色車道線和人行橫道線邊緣干擾,還濾除了其他大部分干擾像素,只保留少量的孤立干擾像素點。
通過霍夫變換來得到車道線方程的參數,霍夫變換涉及到坐標空間變換,耗時很長,為了縮短霍夫變換的運算時間,圖8中剩下的干擾像素點越少越好;因此,有必要濾除圖8中的少量孤立干擾像素點。
若以一個灰度值大于0的像素點為中心,以5個像素長度為邊長的5×5正方形區域內沒有其他非0像素(除了它自身),則稱此像素點為孤立點,如圖9所示。
將圖8放大后發現其中的干擾像素大部分為孤立點,而車道線像素大部分為非孤立點;根據這一區別可濾除孤立點干擾。具體算法是,對于圖8中的每個非0像素點a檢查其周圍5×5區域內的24個像素點的灰度值,若這24個像素的灰度值均為0,則令a為0;否則a值不變。算法運行后的結果如圖10所示。
由圖10可知,經過孤立點清除運算后,不僅清除了大部分孤立的干擾像素點,還保留了黃色車道線像素。
在僅存在極少量干擾像素時,使用OpenCV函數庫中的HoughLinesP函數來檢測黃色車道線的參數,不僅精度高而且耗時少[2]。可以將該函數的threshold參數設定為較小值,經過多次比較存在各種干擾情況的threshold最佳設定值,特取threshold=10,即圖9中在同一條直線上的像素點數量大于10時才能檢測到該直線。檢測結果以藍色顯示在原圖中,并以白色顯示在黑色背景圖中,如圖10所示。霍夫變換結果如圖11所示。
為驗證黃色車道線檢測算法具有普適性,需要在其他目標照片上進行驗證。驗證結果如圖12和圖13所示。
圖12和圖13分別是在校園兩條路上的驗證結果圖,圖中均準確檢測出了黃色車道線而且濾除了其他所有干擾像素;但是兩圖中都僅僅檢測出了離相機較近的幾段黃色車道線,未能檢測出照片中遠處的車道線。這是因為較遠處的黃色車道線經相機處理轉換為照片后,其像素的黃色特征很不明顯,甚至不再顯示為黃色。這樣的檢測結果并不影響智能車輛的自動化行駛,因為車道線的檢測結果會隨著車輛的前行不斷更新。
經過試驗驗證可知,算法具有很好的普遍適用性。在實時性方面,檢測算法首先采用快速方便的查表法濾除大部分干擾像素,其后的每一步操作都是在查表結果圖上亮度非零的像素點上進行,參與計算的干擾像素點數量大大減少,檢測速度得到很大優化,保證了算法的實時性。
[1]白冰潔,韓峻峰,潘盛輝,等. 基于雙閾值分割的車道線檢測方法[J]. 信息技術,2013(3):43-45.
[2]金輝,吳樂林,陳慧巖,等. 結構化道路車道線識別的一種改進算法[J]. 北京理工大學學報,2007,27(6):501-505.
[3]馬小龍. 基于視覺的復雜光照條件下的車道檢測及識別[D]. 成都:電子科技大學,2013.
[4]張遠. 基于車道線邊緣及分布特征的車道線識別算法研究與實現[D]. 沈陽:東北大學,2010.
[5]毛星云. OpenCV入門教程[EB/OL]. [2016-09-01]. http://blog.csdn.net/zhmxy555/article/category/1923021.
[6]毛星云,冷雪飛,王碧輝,等. OpenCV3編程入門[M]. 北京:電子工業出版社,2015.
[7]張博峰. 基于機器視覺的自主無人車道路識別研究[D]. 西安:西安工業大學,2014.
1002-4581(2017)03-0014-06
U491.5+23
A
10.14175/j.issn.1002-4581.2017.03.004
安徽省科技重大專項(15czz02039)。