作者:Mehdi Amine
?
從硬件到實現計算機視覺的系統,本文的概述側重于廣度而非深度。為了平衡這種方法,本文引導讀者閱讀具有指導性的參考文獻,并提供了隨時可以運行的源代碼。我們從圖像形成的機制開始。我們涵蓋針孔、透鏡、傳感器(CCD和CMOS)、Bayer濾波器和顏色重建。
然后,我們轉到計算機視覺的應用上來,檢測圖像中的車道線。該方法是基于一套常用的計算機視覺算法。
成像歷史簡介
拍照就是把3D場景投影到2D平面上。暗箱通過一個針孔實現了這種投影。墻上的一個小針孔讓光線穿透了黑暗的照相機室。這個簡單的機制產生了尖銳的投影,使藝術家能夠在場景的細節上畫出草圖。但是這種方法缺乏亮度,針孔本身不能收集足夠的光。
?
柯歇(Athanasius Kircher) 1645年的著作《大路西與陰影》(Ars Magna Lucis Et Umbrae)中“便攜式”暗箱的雕刻
針孔相機即使在今天也吸引了廣泛的興趣,它們能夠捕捉到令人驚嘆的圖像,其特點是在任何地方都能使用。缺點還是一樣,圖像很暗,需要很長的曝光時間。
?
用針孔相機拍攝的鄧盧斯城堡的日落,曝光時間20分鐘,伊萬·麥格雷戈
為了解決光線暗淡的問題,引入了透鏡。通過在光圈前放置透鏡,可以聚集更多的光。透鏡還可以修改投影圖像的放大倍率。在過去,放大需要藝術家移動整個相機。如今,在不改變場景和像面之間的距離的情況下,可以通過移動鏡頭的位置來調節放大效果。變焦是移動鏡頭來改變放大倍率的過程。
即使有了鏡頭,捕捉圖像也需要很長時間依靠藝術家在投影圖像上作畫。19世紀30年代,路易斯·達蓋爾(Louis Daguerre)發明了膠片,這是攝影史上最重要的發明之一。這是第一次有可能在物理層上記錄光,不需要依靠藝術家,只需要按下一個按鈕,就能記住一個時刻。
膠片上涂上鹵化銀。一旦暴露在光線下,鹵化銀就會轉化為金屬銀。轉換量取決于膠片上任何特定點的曝光量。為了產生圖像,膠片隨后要經過化學顯影處理。
黑白底片處理
硅成像探測器的發明甚至比膠片的影響更大。同樣的芯片可以用來捕捉無限多的圖片,而不再需要化學照相顯影。它是數碼相機所使用的技術,也是我們大多數人今天隨身攜帶的手機。
概括地說,拍照就是將3D場景投影到2D平面上。投影是通過光圈來實現的,通過透鏡來收集更多的光線并調節放大倍率。2D平面最初是一個簡單的平面,藝術家可以在上面作畫。后來它變成了鹵化銀薄膜的表面。最后是硅芯片的表面:圖像傳感器。
為了將接收到的光轉換成數字圖像,大多數圖像傳感器依賴于硅原子的特性。當一個具有足夠能量的光子撞擊硅原子時,它會釋放出電子。在硅晶格(一個像素)上,光子通量暴露產生電子通量。然后電子通量被轉換成電壓。
電荷耦合裝置 CCD
在這種類型的圖像傳感器中,光子到電子的轉換發生在每個像素中。在每個像素下都有一個電容儲存釋放的電子。一個叫做“垂直CCD移位寄存器”的電路連接每列像素的電容。這個電路可以使電子從一個像素垂直轉移到它正下方的像素上,直到它們到達最后一行。最后一行由水平CCD移位寄存器連接,該寄存器將電子送到模數轉換器中。
CCD中電子的垂直傳遞采用bucket-brigade法完成。這意味著每一行在獲取其前面一行的電子之前,先將其電子傳遞給下一行。水平轉移保持行順序,當它們水平移動到ADC時,它們被轉換為與它們的電子電荷成比例的電壓。
互補金屬氧化物半導體 CMOS
CMOS以不同的方式實現圖像傳感器。它不是將電子從像素轉移到ADC,而是集成了像素級的電壓轉換。
使用CMOS可以單獨尋址每個像素以讀取其電壓。這提供了更多的靈活性,因為它可以加快特定興趣區域的閱讀速度。這種靈活性是以更小的光敏區域為代價的,因為在像素級集成了更多的組件。為了彌補感光區域的減少,微透鏡被直接放置在每個像素的上方。這些微透鏡將光線聚焦在光敏探測器上。
像素結構
獲取顏色
像素本身能夠捕捉光的強度,但不能捕捉光的波長。為了捕捉顏色(波長),最流行的方法是疊加一個拜耳濾光片陣列。在這種方法中,每個像素都被一個紅色、綠色或藍色的濾光片覆蓋。
圖像傳感器的像素陣列上的彩色濾光片的拜耳排列。每個2乘2單元格包含兩個綠色,一個藍色和一個紅色的濾光片。
人類對幾乎所有顏色的感覺都可以通過3種波長產生。捕捉紅色、綠色和藍色的波長就足以重現拍攝到的場景的實際顏色。但就其本身而言,拜耳模式的疊加是不夠的。它產生的圖像看起來像左邊的:
左邊圖像的像素要么是紅色,要么是綠色,要么是藍色。注意,圖像看起來大部分是綠色的。拜耳模式模擬了人類視網膜在白天對綠光最敏感的事實。因此濾鏡是一半綠色,四分之一紅色,四分之一藍色。
為了將左邊的圖像轉換為右邊的圖像,我們取每個像素的值,并將其與相鄰像素的值結合起來。這個過程被稱為插值。假設我們從左邊的圖片中取一個藍色的像素。插值是將藍色值與相鄰像素的紅色和綠色值混合在一起。
計算機視覺
圖像傳感器的應用已經成為我們生活中的基本組成部分。它們塑造了我們表達自我和交流的方式,它們開辟了科學和藝術的跨學科領域。也許這些領域中最先進的是計算機視覺。
研究計算機視覺必須從欣賞使之成為可能的硬件開始。我們已經簡要地了解了硬件的歷史、進展和主要組件。讓我們來看一個使用它的令人興奮的實際應用。
自動駕駛中的車道線檢測
從2021年5月開始,特斯拉開始交付不再安裝雷達的Model 3和Model Y。這些車型依賴基于攝像頭的自動駕駛系統,以相同的安全評級提供相同的功能。
特斯拉Vision的主動安全功能之一是車道偏離警告/避免。能夠探測道路車道在駕駛中是至關重要的。我們將研究車道檢測,并以兩種不同的方式實現它。首先使用計算機視覺算法,其次使用空間卷積神經網絡。
![image-20220825133010031](D: onghuaiyangwechat202208Computer Vision Sensors & Systems.assetsimage-20220825133010031.png)
第一步是檢測圖像中最顯著的邊緣。與其相鄰像素亮度對比較大的區域被標記為邊緣。下面的代碼將圖像轉換為灰度,用高斯濾波器進行模糊以減少噪聲,并應用算法Canny邊緣檢測。
def?canny(image): ??gray?=?cv2.cvtColor(image,?cv2.COLOR_RGB2GRAY) ??blur?=?cv2.GaussianBlur(gray,?(5,?5),?0) ??canny?=?cv2.Canny(blur,?10,?30) ??return?cannyCanny Edge Detection
![image-20220825133055971](D: onghuaiyangwechat202208Computer Vision Sensors & Systems.assetsimage-20220825133055971.png)
經過Canny邊緣檢測后得到的圖像
這些圖像充滿了我們不需要的信息。我們想專注于前方的道路,所以我們將定義一個多邊形區域,以裁剪每個圖像。定義多邊形的點對這兩幅圖像來說是不同的。為了找到它們,我們可以繪制圖像并顯示寬度和高度軸。
def?region_of_interest(image): ????height?=?image.shape[0] ????width?=?image.shape[1] ????polygons?=?np.array([[(10,height),?(width,height),?(width,1100),?(630,?670),?(10,?1070)]]) ????mask?=?np.zeros_like(image) ????cv2.fillPoly(mask,?polygons,?255) ????masked_image?=?cv2.bitwise_and(image,?mask) ????return?masked_image
?
?
用于裁剪圖像的多邊形掩碼
感興趣區域掩碼的結果
觀察產生的感興趣區域,人眼可以很容易地感知線條。這些線實際上是一系列像素,它們只是計算機中的點。我們需要追蹤兩條最能描述點排列的主線。這是使用Hough變換算法完成的。
lines?=?cv2.HoughLinesP(cropped_image,?2,?np.pi/180,?100,?np.array([]),?minLineLength=40,?maxLineGap=5)
![image-20220825133226882](D: onghuaiyangwechat202208Computer Vision Sensors & Systems.assetsimage-20220825133226882.png)
在原始圖上加上藍色線條的結果
這種方法似乎產生了很好的結果,但這種實現遠非最佳,因為:
我們必須明確定義每個情況的興趣區域。由于透視的變化,應用相同的多邊形掩碼來裁剪ROI是不可能的。
計算時間過慢,開車需要較高的處理速度。
轉彎包括彎曲的車道,這種方法只包括直線。
審核編輯:黃飛
?
評論
查看更多