我們都喜歡用手機拍著,攝影愛好者還喜歡用專業的單反相機拍攝照片。一般我們都是直接得到圖片,這些圖片的格式一般是JPG格式的。很多人理所當然覺得相機拍出來的圖片就是JPG格式的。
其實不然,我相信也有讀者明白相機其實是先拍攝到原始圖像,再通過插值得到的RGB圖像。那么,相機底層到底是如何運作的?相機是如何拍攝到我們常見的彩色圖像的呢?
從這篇文章開始,我會詳細介紹相機的一些底層技術,其中的主線就是相機的成像流程,在英文中叫In-Camera Imaging Pipeline。
其實我們用相機拍照,最先得到的是Raw data,我們可以稱之為原始數據。
我們可以先看下面這幅圖:
這幅圖來自這個網站:https://www.ptgrey.com/white-paper/id/10912,原文是英文的,有興趣的讀者可以去讀讀。
這幅圖給我們大致描繪了我們的相機是怎么得到圖像的。一般而言,相機中有CCD或者CMOS傳感器,就是上圖的中的SENSOR。這個傳感器里面的每一點都是一個收集光子的光電二極管。上圖中的紅色小球P就代表了從被拍攝物體發出的光子(Photon)。光電二極管的作用是什么呢?顧名思義,就是把光子轉換為電子。所以,大家可以看到,上圖中的那些紅撲撲的光子在經過傳感器中的光電二極管后,就變成了綠油油的電子(electronic,縮寫為e),因為電子帶負點,所以“e”旁邊有“-”號。要說明的是,并不是所有的光子都會轉換成電子,這里面其實是有轉換率的,也就是圖中的Quantum Efficiency (QE)。這點我們可以以后詳細談,我先挖一個坑,大家可以查查這里面的東西,看能否填上。
這些電子被存儲在一個井里,這個井有一個很洋氣的名字,叫potential well,中文直譯過來教電勢井。我們在物理中學過電勢的概念,咱可以把它理解成海拔。電勢兩端當然是有差異的,就好比三峽大壩兩端的水位高度??刹灰∏七@個高度,那可是很大的能量哦。有關物理含義我不多介紹。這個電勢井的作用是什么呢?大家可以這么理解電勢井,這個井就像一個銀行卡,像存錢一樣把電子存起來。如果攝像頭越好,那么這個電勢井的井深就越大,意味著這張銀行卡就應該能存貯更多的錢。如果這是一張信用卡,意味著這張卡能透支更多的額度。
當然,有了銀行卡,就要有配套的取款機吧對不對,至少讓我們先查查賬,看看卡里有多少錢再說。這就是上圖里的電壓表狀的東西了,就是相機中讀取電勢的一個設備,英文名叫Analog-to-digital converter,是把電勢井的每個點的兩端之間的電勢差(也叫電壓)轉成數值的設備,就好像是把存在銀行卡的那些人民幣紙幣轉成數值顯示在屏幕上的設備。
再多說一句的是,不同相機品牌的原始數據的格式不同,這就好比不同國家的銀行卡里存有不同的幣種一樣。常見的相機品牌有佳能,尼康,松下,索尼,奧林巴斯,柯達等,其原始數據的格式為CR2 (Canon),NEF (Nikon),RW2 (Panasonic),ARW, SRF, SR2 (Sony),ORF (Olympus),DCR, K25, KDC (Kodak)。
到這里為止,我已經基本介紹完相機是如何拍攝到原始數據的了。我想大家會有一個問題:在這里為止,我們在相機中的傳感器里的每一個點得到的數值是一維的,但是我們拍攝到JPG圖像是彩色的,也就是說每個點都是R, G, B三個維度都有數據,這是怎么回事呢?
這個問題非常好~鼓掌!
其實,到目前為止,我們只了解了相機中傳感器硬件的功能,這個功能只依賴于不同品牌的傳感器。其實我覺得相機就和我們使用的手機的結構是很像的。比如三星手機可以使用高通的CPU芯片,三星自己的鏡頭。相機也是如此。這些相機廠家大多數都用自己的傳感器,尤其是松下的SmartFSI傳感器,效果也別好,我以后會詳細介紹,這里不多說。
除了傳感器之外,這些不同的相機廠家最拿手的就是成像流程了,就是Imaging Pipeline。這些是這些相機廠家的獨門絕技,絕不外傳的。那么這些流程到底起到什么作用呢?說的簡單點,成像流程就是把一維的原始數據編程R,G,B三維彩色圖片的過程。
相機在拍攝到原始數據之后,傳感器上的每個點都是一維的灰度值,就像下圖一樣:
其實傳感器還有一個身份,那就是顏色過濾器,英文名是color filter array。傳感器上的每個點是很有講究的,這些點過濾掉掉其它顏色之后,允許通過的是紅色R,綠色G,藍色B。如果這個點只允許紅色通過,那么每個點上的數值,其實就是這個點在紅色R這個通道上的數值。JPG彩色圖像有三個通道,分別是紅色R,綠色G,藍色B。那這個點在另外兩個通道上的值如何得到呢?這個點在綠色G和藍色B上的值可以通過周圍的值插值得到。
有人說,怎么這么節???!為什么不做三個傳感器,疊加起來,然后分別記錄R,G,B三個通道的值呢?這個想法很好,的確有這樣的傳感器,但成本太高,而且收益不是那么大。目前大多數CCD,CMOS傳感器都是一層傳感器,目前對于日常生活還是夠用的。
有人又問了,怎么我看這個傳感器,綠色的那么多?誒,對了,這是因為人眼對于綠色最為敏感,所以呢,傳感器模仿了人眼的構造,其中紅色,綠色,藍色的比例分別是1/4,1/2,1/4。
好了,我們繼續,看下圖:
我們的傳感器得到了每個點(R或G或B)上的數值,然后相機里的軟件部分把這些數值通過彩色插值(相當于上圖中的Raw Converter)把原始數據轉換成R,G,B三個通道上的數值,這樣就得到了RGB彩色圖像。這樣就完了嗎?!
當然不是!如果你覺得這樣就好了,那真是太小瞧這些相機制造商了!
這樣并沒有結束哦,這張彩色圖像不是我們看到最終結果。下面是一個常見的成像流程,這個流程里的每一步,我以后都會另開章節詳細介紹,這里就簡略一些,大家先了解一個大概就可以,有興趣的讀者可以自行查閱??聪聢D:
從這張圖,我們可以看到,在得到彩色插值后的RGB圖像之后,圖像還需要經過白平衡和彩色空間轉換階段。白平衡就是去掉不實際的色彩陰影,使得圖像呈現出來的白色是真實出現的白色。就好比絕對零度不是0攝氏度,也不是0華氏度,而是-273攝氏度一樣。白平衡其實是設定了一個白色的標準。詳情可以參考以下鏈接:
http://www.cambridgeincolour.com/tutorials/white-balance.htm。色彩空間轉換其實是一個道理,就是把RGB圖像中的紅綠藍轉變成相機廠家定義的標準紅綠藍一樣。紅,綠,藍色都有很多種,下面請你識別出下面的綠色:
所以,大家看到沒,傳感器中設定允許通過的紅,綠,藍不是最終的紅綠藍。這三個基本色需要在成像流程里進行校準。這三個顏色被校準后,其他的顏色也就自動校準了。接下來就是伽馬映射(Gamut mapping),也是一個校準色彩的過程。接下來的色調映射(Tone Mapping)這個過程是這樣的,原始數據里的數值的變化范圍很大,一般是16bits,也就是說從1到幾萬不等,但是我們常用的顯示器或者手機屏幕只能投影8bits的圖像,也就是0到255之間的數值。超過255的數值統一按照255來處理,這里0是黑色,255是白色。Tone Mapping有很多具體的方法,但基本原理都把是一個從很大動態范圍的原始數據映射到0到255之間的圖像。這樣,才能保持相對的色調保持不變,否則如果把原始數據中的超過255的數值全部統一按255處理,就會使得呈現出來的圖像色調比較單一,并且失真。最后一個就是JPEG壓縮了,這樣子出來的圖像不會那么大,方便存儲和傳輸。
下面是一個更詳細的成像流程,以及一個真實的把原始數據轉成我們常見的JPG圖像的例子。我以后有機會再詳細介紹這個pipeline。
好了,到目前為止,我已經基本介紹了相機的硬件部分(傳感器)和軟件部分(成像流程)的功能。希望對大家理解相機,拍攝有所幫助。