點「計算機視覺life」關注,置頂更快接收消息!
作者:Wang Hawk
原文:https://zhuanlan.zhihu.com/p/51569883
雖然你可能擁有不止一個相機,而且現在用手機也能拍出精彩的照片,但你肯定也曾困惑過,為什麼數位相機(單反),包括手機,可以拍出精彩的照片,它們跟傳統的照相機到底區別在哪裡?其實我自己也曾很困惑。我依稀記得我大學期間使用的相機都還是膠捲式的,怎麼突然滿大街都是數位相機和手機,人們甚至已經習慣了用手機來拍照,連數位相機都要被淘汰掉了似的。科技實在是進步得太快了。
現在讓我們停下腳步,仔細的來探究一下,包括手機在內的數碼攝影設備是如何將入射光轉換為最終的JPEG格式的圖片的。我會回答兩個問題:
RAW文件是如何生成的?
相機如何將RAW數據轉換為最終我們看到的RGB圖像(並存儲為常見的JPG格式文件)
下圖正是照相機將入射光轉換為「常規」圖像的完整操作序列。
我們今天會談到的內容有傳感器(Sensor),模擬前端(Analog front-end),顏色濾鏡(Color Filter),相機內圖像處理(紅框內黃色部分)這幾個主題。
一. RAW圖像是如何得到的?讓我們先看看現代數位相機的工作流程示意圖。可以看到,從物體上傳來的入射光通過相機的光學器件(藍框部分)後會穿透顏色濾鏡到達傳感器,並通過模擬前端轉化為數位訊號(綠框部分),最後通過相機內的圖像處理系統轉換為最終的RGB格式圖像,並存儲為常見的JPG文件。
這一節我們先忽略光學部分,直接學習綠框部分的傳感器、模擬前端、顏色濾鏡,看看它們是如何將接收到的光線轉換為RAW圖像數據的。
1. 傳感器1.1 傳感器的基本組成正如下圖所示,當相機的快門打開時入射光會穿過快門(通過鏡頭)到達傳感器。此時到底會發生什麼事?
快門關閉時
快門打開時
正如讓愛因斯坦在1921年獲得諾貝爾獎的發現「光電效應」所揭示的,入射光子進入傳感器後會轉換為電子。因此,基本的傳感器的設計如下圖所示,其目的還是使得微透鏡所匯聚的光子能被光電二極體轉換為電子並存儲在勢阱中。
光電效應
基本傳感器設計
1.2 傳感器的性能衡量衡量一個傳感器的性能的基本指標有:
Photodiode quantum efficiency(QE): 光電二極體量子效率
Photodiode response function:光電二極體響應函數
Photodiode full well capacity:光電二極體滿阱容量
量子效率 是指轉換的電子數量與入射的光子數量的比值
量子效率(QE)
當不斷改變入射光的強度時,轉換的電子數量也會發生改變,這構成了上述所說的光電二極體的響應函數。通常來講這是一個線性函數,如下圖所示。但當勢阱飽和(過曝)或者光線過暗(噪聲淹沒了信號)時,它將不再是線性的。這個特性與後面之後會講到的HDR圖像的算法高度相關。
光電二極體的響應函數
勢阱的最大容量稱為滿阱容量,下圖顯示了常見相機的傳感器的滿阱容量,由於矽中光子的有限和固定的吸收長度,滿阱基本上是像素麵積(而不是體積)的函數。
滿井容量
1.3 兩種不同的傳感器:CCD和CMOS根據讀取電路的設計的不同,有兩種不不同的傳感器類型:CCD和CMOS。它們的區別可以用下表簡要的概括。以前高端設備會採用CCD,而中低端、消費級產品才會採用CMOS。而現在的CMOS傳感器已經和CCD傳感器有相當的性能了,大多數消費級和工業攝像機已經採用了CMOS傳感器。
CCD和CMOS的比較
仔細看看CCD和CMOS的結構圖如下:
CCD
CMOS
2. 模擬前端模擬前端
當相機鏡頭關閉時,模擬前端會從傳感器的勢阱中讀出電子,並轉換為模擬信號。這些信號首先被Analog Amplifier(也稱為Gain)所放大。大家在相機設置中的ISO通常是會映射為對Gain的放大倍率的設置,而這個模塊也跟後續會提到的相機的Vignetting(漸暈)高度相關。
放大後的模擬信號接下來由Analog-to-Digital Converter(ADC)轉換為通常是10bits-16bits的數位訊號,常見的為12bits。
Look-Up Table (LUT)用於在一定的範圍內修正傳感器響應的非線性,這個模塊同時還能夠修復一些損壞的像素的輸出。
我們上面提到了一種現象叫做Vignetting,它實際上是指生成的圖像四周比中間暗,如下圖所示:
Vignetting
Vignetting的產生有多種原因,例如:
有了LUT,可以產生非線性的Gain從而糾正Vignetting現象
糾正Vignetting
通過模擬前端生成的就是我們所說的RAW格式圖像,後續的一系列處理都是基於RAW格式圖像進行的。當然,不同的相機生產商會以不同的格式來存儲RAW格式圖像,大家可以查詢到很多資料,推薦維基百科上的這一篇,此處不再贅述。
3. 顏色基礎有沒有記得前面曾經提到的顏色濾鏡?這是起什麼作用呢?
基本傳感器示意圖
在進一步講解之前,讓我們先來了解一下顏色的基礎知識。
3.1 顏色到底是什麼?我們知道光是一種電磁波,而顏色並不是光的客觀屬性——光的客觀屬性是它的波長。下圖展示了幾乎完整的電磁波譜,而我們人眼所能看到的只是其中400nm到700nm的一小段,而顏色則是我們對這一小段電磁波的一種主觀的感覺而已。
電磁波譜
這種主觀的感覺既跟入射光的功率譜分布(SPD)相關,也跟人眼對不同光源的光譜敏感度相關,我們分別來探討下這兩個概念。
3.2 光源的功率譜分布(Spectral Power Distribution - SPD)通常的光源都由多個波長的光組成,而每一種波長的光的功率一般都不一樣。如果畫出每種波長的功率和它的波長之間的關係,我們可以得到光源的功率譜分布(SPD)。例如下圖展示了幾種光源的SPD
功率譜分布(SPD)
3.3 傳感器的光譜敏感度函數(Spectral Sensitivity Function - SSF)不管是數字的還是非數字的傳感器,它們對不同波長的入射光線會有不同的敏感度,可以用傳感器的譜敏感度函數(SSF)來衡量。傳感器對入射光的響應是一個累加了所有光波響應的單一的值,我們可以用一個積分表達式來描述:
傳感器響應是入射光SPD與傳感器本身的光譜敏感度函數乘積的積分
那麼人眼呢?實際上人眼是由包含對不同光波敏感的三種視錐細胞,最終的感覺是由這三種細胞的響應共同構成的,如下公式所示。
三種細胞的響應函數
3.4 顏色濾光陣列(Color Filter Array)現在我們回到相機的傳感器就明白了,為了能在最終的相片中加入顏色信息,人們用顏色濾鏡來模擬了不同的視錐細胞。當這些顏色濾鏡以預先設定好的形式排列時,就構成了顏色濾光陣列(Color Filter Array)。
這裡面牽涉兩個問題,第一是如何設計濾光鏡對不同光線的敏感度,第二是如何設計不同的顏色濾光鏡的最佳空間排列(也成為Mosaic)。
下圖是Canon 40D和50D的譜敏感函數圖比較。每個相機廠商,甚至是同一廠商的不同型號的相機的傳感器的SSF都可能不同
Canon 40D 和 Canon 50D 的SSF不同
下圖是一些Mosaic設計,其中我們最常用最基礎的是Bayer Mosaic。
常見的一些Mosaic設計
因此,當光線通過顏色濾光鏡到達傳感器,由模擬前端最終轉換為數字RAW圖像時,圖像會變成什麼樣呢?可以看到RAW圖像並未顯示出顏色,反而顯示出馬賽克一樣的方塊,並且還有大量的噪聲。所以,接下來很重要的就是通過相機內的圖像處理系統對圖像進行一系列處理,來使之變成最終美觀的RGB圖像。
RAW圖像上的噪聲和馬賽克效應
二. 相機如何將RAW數據轉換為最終我們看到的RGB圖像?
相機內基本處理流程
1. 白平衡(White Balance)前面講過,顏色是我們對光的一種主觀感受,它直接與我們人眼的SSF以及入射光的SPD相關,那麼除此之外,是否跟別的因素相關呢?的確如此,從下圖可以看到我們人眼對不同環境光線下拍攝的物體的顏色具有自糾正的作用。
但相機不具備這樣的功能,因此如果不經過顏色的校正,拍出來的圖片的顏色就會很失真。這就是白平衡的作用:它使得我們人眼感知為白色的物體在最終的成像中也為白色。
白平衡
現在大家用普通的相機一般都會內置一些白平衡選項,可以根據自己的喜好和環境的光線選擇合適的白平衡選項進行顏色的矯正:
相機上預設的白平衡設置
實際上,自動白平衡是一個很熱門的研究領域,這裡我們介紹兩種基本的白平衡算法。正如前面所講,白平衡是要使得我們人眼感知到的白色最後成像也是白色,那麼首先就要確定圖像中哪些是白色。這裡有兩種假設
它假設圖像的平均顏色是白色,其基本的算法可以用如下公式表示
它假設圖像中最亮的區域是白色,公式如下:
我們會在之後用實際代碼來驗證這兩者的不同。但如果大家觀察上述公式會發現,白平衡算法的前提是要能夠獲取不同通道的數據,但我們前面已經講過,RAW格式圖像實際上是不帶顏色的數據。那麼從RAW格式圖像中分離三個通道的數據,就是所謂的Demosaicing的過程。
2. 去馬賽克(Demosaicing)在去馬賽克之前,每個像素只有一個單一的顏色,而我們是想恢復完整的顏色,如何做到呢?
基本上這是通過「插值」來完成的。常見的插值方法有:
Bilinear插值
Bicubic插值
Edge-Aware插值
這裡我們介紹只需要像素的四個領域即可完成的Bilinear插值,簡單講只需將同一顏色的四個領域取平均值即可:
而對於不同的顏色通道則獨立的重複這一過程
如下圖所示,未經去噪處理前的圖像通常會包含很多噪聲,尤其是在低光環境下。
噪聲的來源是多樣的,例如:
圖像上的噪聲
隨機性導致,場景越量,這種隨機分布的方差越小,越不容易產生噪聲。對於比較明亮的場景以及較大像素尺寸的傳感器,散粒噪聲是最主要的噪聲來源。
那麼如何去噪呢?我們這裡談論的是相機內的去噪算法,由於大部分相機本身的運算能力不高,這也意味著無法選擇很複雜的不利於硬體化的算法。這裡簡單用下面這頁圖來展示均值濾波和中值濾波,以後還會給大家介紹更多的去噪算法。
現在我們來談一個很重要的問題:色調重建,也叫做Gamma校正。
我們已經知道,傳感器對輸入圖像的響應大部分是線性的,而且我們人眼對輸入光的響應也是線性的。然而,人的感覺卻是非線性的,即人對暗光會更加敏感,而這種感覺上的敏感度很接近Gamma函數。與此同時,我們的顯示設備相對輸入圖像通常也是非線性的,在亮光圖像更敏感, 如下圖。顯示器和人眼的特性是相反的,這就加倍使得我們感知中的圖像顯得很暗。
人眼的響應特性
相機的原始響應是線性的,但是人眼和顯示器卻是非線性的
我們解決此問題的辦法,是對圖像做一次Gamma校正,使得真正顯示的圖片呈現出相反的特性。如果原圖為L,那麼新的圖像會是Lγ, γ一般取2.2.
Gamma校正
gamma校正一般在哪個階段進行呢?可不可以在拍攝的過程中不進行gamma校正,只是保存圖像為jpeg形式,在下一次顯示之前才做呢?通常來說不宜這樣,因為當我們把圖像保存為jpeg形式是會進行位空間壓縮,這會導致信息損失。所以最好是在壓縮前就做好gamma校正。大家注意回顧gamma校正的位置:
三、raw圖像的獲取和處理到此為止,我相信你已經對我闡述過的模塊有了基本的理解。我特意忽略掉了色彩轉換這一部分,因為關於顏色我會用專門的文章來做深入的探討。
此時讓我們來嘗試仿真從入射光到最終的jpg圖像的全過程, 我會把實例仿真分為兩個部分:
獲取RAW圖像
用dcraw轉換raw圖像
1. 獲取RAW圖像當我們談到獲取RAW圖像時,先回答一個問題:為什麼我們需要RAW圖像?我們平時用相機拍攝並存儲的JPEG圖像文件不夠好嗎?
事實上,JPEG是圖像壓縮後的存儲格式,解壓後是RGB圖像,它本身正如上面所講是非線性的,這使得很多計算攝影相關的算法直接作用到RGB圖像上都會產生錯誤的結果,例如photometric stereo, shape from shading, image-based relighting, illumination estimation, 包括與光傳輸和反向渲染有關的任何算法。這時候,最佳的解決方案就是採用線性的RAW圖像來替代。
那麼如何獲取到RAW圖像呢?很簡單,大部分單反在拍攝時都可以選擇保存RAW圖像文件。當然每個相機廠商都有自己不同的存儲RAW圖像的格式,例如Canon的RAW文件格式是CR2,是一種遵循TIFF規範的14bit的RAW文件。這裡可以查到更多的信息。
假如你使用手機拍攝呢?你還可以使用lightroom這一款應用,不過注意並不是每一款手機都支持。你可以在這裡查到更多的信息。
2 用dcraw轉換raw圖像RAW格式文件是否可以直接用Matlab、Python或別的開發工具打開?事實上並不能直接打開。雖然有很多方法可以解決此問題,但這裡推薦的一種方法是利用dcraw這個小軟體來將RAW格式文件轉換為TIFF文件,而後者時可以直接被很多圖像處理軟體打開的。dcraw的官網在這裡:cybercom.net/~dcoffin/d,它由很多可選的參數。
為了3.3節仿真相機內的處理流程,我用下面的命令將一個CR2格式的RAW文件轉換為對應的TIFF文件,並確保後者未經過相機內的任何處理,只包含原始信息。
dcraw -4 -D -T <RAW_filename>
dcraw非常強大,可以模擬相機內的的大部分標準流程。例如-a選項就可以模擬用全圖信息做灰度世界的白平衡,-q可以用於控制demosaicing的插值質量等等。看官可以自行探索。
例如,我可以用dcraw -4 -D -T banana_slug.cr2輕鬆的將附件RAW文件轉換為了banana_slug.tiff文件,後續就可以用任意一種開發語言來處理它。
四、總結從入射光到最終的相片,相機拍照的過程是非常複雜的,我們今天的內容對這個過程的大部分基本模塊進行了介紹。但是需要注意的是,每個相機廠商都會設計自己私有的、非常複雜的In Camera Image Process Pipeline,很多時候通過最終的成像是完全無法知道其內部到底有哪些私有操作、以及這些操作的順序的。
如下是這個帖子的核心內容總結,希望本文對你所有幫助,謝謝。
我在如下的Jupyter Notebook中展示了本帖中的相關操作,你可以對著它獲取更深入的理解,也能夠進一步掌握用Python來進行圖像處理的一些技巧。
nbviewer.jupyter.org/gi
跟這一系列專題文章相關的Notebook可以從下面的倉庫獲取
https://github.com/yourwanghao/CMUComputationalPhotography.git
這一篇文章的絕大部分素材來自於
[1] CMU 2017 Fall Computational Photography Course 15-463, Lecture 2
如果不做特別說明,素材均來自於[1]
我也會參考下面的重要資料中的內容
[2] Richard Szeliski, Computer Vision : Algorithms and Applications,
[3] Michael Brown, 「Understanding the In-Camera Image Processing Pipeline for Computer Vision,」 CVPR 2016
歡迎關注公眾號:計算機視覺life,一起探索計算機視覺新世界~
覺得有用,給個好看啦~