輕輕一按,你的相機(jī)就把光子轉(zhuǎn)換為了比特。于是一張相片就保存到了你的 iPhone 里。
讓我們假設(shè)一下你身處室外,環(huán)顧四周。三億里之外,太陽無時無刻不在發(fā)射光子。它們需要花上 8 分鐘之久才能到達(dá)我們舒適的星球。有一些光子撞擊到你周圍的物體,并反射到你眼睛的視網(wǎng)膜上,這會使你的大腦以這些物體為基準(zhǔn),創(chuàng)建一副圖像,我們將其稱之為視覺。
攝影要做的就是捕獲這幅圖像。攝影是在 200 年前被發(fā)明的,但在此之前的好幾千年里,人類已經(jīng)通過繪畫的方式來捕捉他們所看到的東西了。
我們中的很多人其實每天都相機(jī)不離身:當(dāng)今智能手機(jī)已經(jīng)是最常用的相機(jī)之一了。在數(shù)碼攝影的時代之前,攝影通常是記錄在紙上或者膠卷上的。而今天,攝影將光轉(zhuǎn)換為比特信息。
這篇文章將帶你探索這一切是怎么發(fā)生的:智能手機(jī)的相機(jī)到底是如何工作的。
在我們深入將光子轉(zhuǎn)換為 JPEG 文件之前,我們先來看看相片的一些基本概念。這些概念不僅在過去的膠卷攝影時有效,在今天也是同樣的。在不久之前,幾乎所有的攝影都是通過膠卷完成的。與今天使用數(shù)碼感光器不同,那時候成像依賴的是受光照影響的生化反應(yīng)。但因為在拍攝相片中其他所有東西都遵循同樣的原則,所以對笨重的膠卷相機(jī)和膠卷攝影適用的規(guī)律一樣會在使用 iPhone 拍攝時適用。
拍攝一張相片的過程有時候被稱之為曝光。曝光也指單位面積上光的數(shù)量。為了相片亮度合適,光的數(shù)量也需要在一定的范圍內(nèi)。如果我們沒有捕獲足夠的光,那么相片就會欠曝 - 圖像被湮沒在圖像傳感器或者膠卷的固有噪聲中。如果我們捕獲的光太多,圖像就會過曝 - 圖片傳感器/膠卷所接受的光過于飽和,無法區(qū)分不同的光的數(shù)量,這意味著幾乎所有區(qū)域看上去曝光程度都是一樣的。
當(dāng)拍攝照片時,我們必須將相機(jī)調(diào)整到光線的量既不太高也不太低。下面是同一個場景中欠曝和過曝的樣本,右手邊的顯示了使用 Pixelmator 調(diào)整了曝光后的情況。這個例子說明了要是一張照片過度地過曝或者欠曝的話,是沒有辦法進(jìn)行修復(fù)的:
http://wiki.jikexueyuan.com/project/objc/images/21-1.jpg" alt="" />
http://wiki.jikexueyuan.com/project/objc/images/21-2.jpg" alt="" />
http://wiki.jikexueyuan.com/project/objc/images/21-3.jpg" alt="" />
http://wiki.jikexueyuan.com/project/objc/images/21-4.jpg" alt="" />
在欠曝圖像中,即使我們嘗試將它調(diào)亮,圖像的暗部依然被 “卡” 在黑色,我們沒有辦法讓圖像中的筆確實擁有不同的顏色。過曝圖像中也有大部分區(qū)域被卡在白色或者灰色:編織帶和硬幣細(xì)節(jié)已經(jīng)完全丟失了。
有三個要素可以影響曝光的進(jìn)光量:快門速度,光圈和感光度 (ISO)。我們稍后會仔細(xì)談?wù)勊鼈儭?/p>
在攝影中,通過調(diào)整這三者中任意一個來讓進(jìn)光量翻倍或者減半,就叫做改變了 “一檔” 曝光。每一檔曝光對于這三者 (快門速度,光圈和曝光度) 來說對應(yīng)的是不同的數(shù)字變化。但如果我們將快門速度調(diào)整一檔,我們需要通過調(diào)整 ISO 或者光圈一檔來進(jìn)行補償,才能獲取同樣的進(jìn)光量。我們之后會馬上提及一些細(xì)節(jié)。
有趣的是所有這三者 (快門速度,光圈和 ISO) 也會在曝光上影響其他要素。這三個參數(shù)有著無數(shù)種組合來達(dá)到同樣進(jìn)光量的結(jié)果,我們來仔細(xì)研究下:
當(dāng)我們捕捉圖片時,圖像傳感器捕捉一段時間的光線。這段時間被叫做快門速度,因為它表示了快門打開和關(guān)閉的快慢。
比如 1/50 秒的快門速度會讓圖像傳感器進(jìn)行 1/50 秒 (= 0.02 秒或者 20ms) 光線捕捉。如果我們將快門速度改變至 1/25s (40ms) 時,圖像傳感器將捕捉兩倍時間長度的光,也就是兩倍數(shù)量的光子,或者說兩倍的進(jìn)光量。
對于快門速度來說,一檔表示將快門速度加倍或者減半。從 1/50 秒到 1/25 秒調(diào)整了一檔。
iPhone 6 的快門速度可以在 1/8000 秒到 1/2 秒之間調(diào)整。我們可以通過改變快門速度來調(diào)整進(jìn)光量,但這也會影響圖像的清晰度。如果我們在拍照時相機(jī)和場景是完全靜止的,我們可以使用任意長的曝光時間 (快門速度),但是更多情況并非如此。我們身邊的東西都一直在移動,特別是對于 iPhone 來說,相機(jī)本身也一直在移動。
當(dāng)物體移動的足夠快的時候,它在整個曝光時間里便不會只停留在某一個點,這會導(dǎo)致圖片模糊。一般來說我們希望畫面清晰、不模糊,因此我們通常希望快門速度在 1/100 秒或者更快/更短。對于高速運動的物體的攝影,我們可能還需要選擇一個更快的快門速度。但是我們也可以有意地選擇一個長的快門速度來讓物體模糊,以強(qiáng)調(diào)其運動感。這種情況下最好把相機(jī)固定在三腳架或者類似的東西上,這樣可以確保場景中固定的物體仍然保持清晰。
ISO 值也被稱作膠卷速度。在數(shù)碼攝影中,它被用來衡量圖像傳感器對光的靈敏程度,以及因此帶來的曝光噪音。實際上的細(xì)節(jié)非常復(fù)雜,Wikipedia 會給你一個更詳細(xì)的解釋。
iPhone 6 可以將相機(jī)在 ISO 32 至 ISO 1600 之間調(diào)整 ISO 值。一檔對應(yīng)翻倍或者減半 ISO 值。每次我們將 ISO 加倍 (比如從 ISO 100 到 ISO 200),我們就只需要一半的進(jìn)光量。我們?yōu)榇耸且冻龅?strong>代價的,那就是相片的噪點將會變多。
在 ISO 32 時,iPhone 傳感器得到的圖片將會有最少的噪點,但是同時也需要最多的光。在 ISO 1600 時,iPhone 圖像傳感器就只需要 1/50 (2%) 的進(jìn)光量,但是圖片會有更多的噪點。
這里有用三腳架架上 iPhone 6 后同樣場景的兩個樣本、這些圖片是從整幅相片中裁取的一小部分。左邊的使用的是 ISO 32 和 1/3 秒曝光。右邊的是 ISO 1600 和 1/180 秒曝光。捕獲的進(jìn)光量基本是一致的,但是左邊的噪點要比右邊的少。但是如果沒有三腳架的話,我們是無法使用 1/3 秒的曝光時間來拍出銳利的相片的。
http://wiki.jikexueyuan.com/project/objc/images/21-5.jpg" alt="" />
http://wiki.jikexueyuan.com/project/objc/images/21-6.jpg" alt="" />
最后,相機(jī) (更確切地說是相機(jī)的鏡頭) 的光圈是用來衡量到達(dá)圖像感應(yīng)器的光所通過的通孔的大小的。光圈值以 F 比例 (焦比) 來進(jìn)行標(biāo)定,比如 ?/5.6,其中 5.6 表示鏡頭焦距與光圈 (也就是通孔) 的有效直徑的比例。
可能 F 比例會讓人有點迷惑。F 比例所對應(yīng)的一檔指的是當(dāng)前值與根號 2 (√? ? 1.4) 相乘或者相除。在 ?/4 時,我們所得到的光的量是 ?/2.8 時的一半。
當(dāng)使用 iPhone 相機(jī)時,事情就變得簡單很多了,因為 iPhone 6 的光圈值是固定的,具體來說是 ?/2.2。
除了影響進(jìn)光量,光圈還會對景深造成影響。這和對焦有關(guān)系。相機(jī)中的光學(xué)系統(tǒng)會將與相機(jī)一定距離范圍內(nèi)的物體渲染清晰。當(dāng)我們改變光圈時,這個距離范圍將變寬或者變窄。我們可以用這個特性來達(dá)到一些很好的效果 (譯者注:比如人像的背景虛化等)。但很遺憾的是,我們不能調(diào)整 iPhone 的光圈大小。
在 iPhone 上,我們能調(diào)節(jié)的只有 ISO 和快門速度。因此我們需要在噪點 (由 ISO 影響) 以及動態(tài)模糊/銳利之間進(jìn)行權(quán)衡,同時保證相同檔次的曝光。
這也解釋了為什么晚上拍出來的照片看起來要比白天拍出來的差:在晚上光線要少得多,為了仍然有一個可接受的快門速度,自動曝光系統(tǒng)將調(diào)高 ISO,也許會被調(diào)到相機(jī)允許的最大值。要是即使這樣還是不能達(dá)到足夠的進(jìn)光,自動曝光還會降低快門速度。這樣的組合就造成了畫面上更多的噪點,以及圖像模糊。
有些 iOS app 可以讓你手動調(diào)整曝光。其中一種選擇是去調(diào)整 EV (exposure value) 值 (也就是曝光值)。這種方式還是會使用相機(jī)的自動曝光邏輯,但是你可以調(diào)整你想要的曝光程度。-1 的 EV 值將會通過自動曝光邏輯讓圖片欠曝一檔。自動曝光邏輯仍然會自動地選擇 ISO 和快門速度的組合 (因為在 iPhone 相機(jī)上光圈是固定的)。
另一種選擇是使用快門優(yōu)先 (通常被標(biāo)記為 S 或 Tv)。這讓我們能都直接設(shè)置想要的快門速度,然后自動曝光將自動地調(diào)整 ISO 來達(dá)到合適的曝光。
最后,我們可以完全手動控制曝光 (通常用 M 來表示),這種情況下我們需要自己調(diào)節(jié)快門速度和 ISO。當(dāng)這么做的時候,我們通常會為了方便先自動曝光一張,然后使用自動曝光的參數(shù)來作為調(diào)節(jié)的起始點。
那些允許你調(diào)整光圈的相機(jī)還有一種模式叫做光圈優(yōu)先 (通常標(biāo)記為 A 或者 Av)。這種模式和快門優(yōu)先在概念上是對應(yīng)的,我們手動控制光圈,然后讓自動曝光邏輯去選擇快門速度 (以及 ISO 值,除非它是固定的)。
有一些好辦法可以讓你獲取到好的自動曝光。iOS 的自動曝光邏輯將會檢查圖像的全部部分,然后去猜測你想要拍攝和曝光的主體是什么。如果畫面的一部分特別亮,其他地方又特別暗的話,相機(jī)是不能把所有東西都曝光得很好的。所以在這種情況下自動曝光必須選擇一些東西作為主體,比如人的面部。內(nèi)建的 iOS 相機(jī) app 也允許你通過點擊畫面來提示自動曝光系統(tǒng)某個部分比較重要,應(yīng)該被良好曝光,這會導(dǎo)致自動曝光進(jìn)行調(diào)整。相機(jī) app 還能讓你通過在屏幕上上下滑動來調(diào)整曝光值。但是如果你想要直接去設(shè)置快門速度和/或 ISO 的話,你就需要用另外的 app 了。
相機(jī)只能將離相機(jī)一定距離范圍內(nèi)的物體渲染清晰。在這個范圍內(nèi)的物體就是被聚焦的,而如果太近或者太遠(yuǎn)而導(dǎo)致模糊的,它們就是失焦的。
包括 iPhone 在內(nèi)的大多數(shù)的相機(jī)都有自動對焦 (AF),相機(jī)會猜測圖片的哪個部分需要被聚焦,并依此來調(diào)節(jié)焦距。iOS 內(nèi)建的相機(jī) app 允許用戶點擊某處來進(jìn)行對焦 - 有些 app 甚至可以讓用戶手動調(diào)節(jié)焦距。
相機(jī)鏡頭是由一系列光學(xué)組件構(gòu)成的,它們負(fù)責(zé)引導(dǎo)和聚集光束。對相機(jī)焦距的調(diào)整,其實是通過物理移動這些鏡頭組件來完成的。
模塊化相機(jī) - 比如 單反 - 可以讓你在不同的鏡頭間切換。即使是像 iPhone 這樣固定鏡頭的相機(jī),你也可以通過在內(nèi)建鏡頭前方再加裝額外鏡頭來調(diào)整相機(jī)的光學(xué)部分。
鏡頭系統(tǒng)最重要的指標(biāo)是它的焦距 - 主要是它的放大倍率和視野角度。一個廣角鏡頭的放大倍率比較低,因此可以讓相機(jī)捕捉更大的區(qū)域。而長焦鏡頭,特別是遠(yuǎn)攝鏡頭的視角就窄得多,由于它的放大倍數(shù)很大,它只能獲取廣角鏡頭中的一小部分區(qū)域。
鏡頭也影響圖像的其他部分。它可能會將一些你不想要的變形或者顏色失真引入到拍攝的圖片中,比如色差就是一個典型的例子。
現(xiàn)在我們知道一些基礎(chǔ)知識了,那么相機(jī)實際上是如何捕捉圖像的呢?
在你的 iPhone 相機(jī)里面,有一個圖像傳感器。這個部分就相當(dāng)于我們眼睛里的視網(wǎng)膜。圖像傳感器可以將光或者光子轉(zhuǎn)換為電信號。
圖像傳感器是由海量的獨個的像素傳感器串起來的巨大矩形區(qū)域。我們可以將每個像素傳感器想象成一個裝電荷的桶。當(dāng)光子撞擊到像素傳感器的光二極管時,它們將在這個像素的桶中緩慢地積攢電荷。最后,每個像素都會有它自己的一小桶電子。這些電荷的數(shù)量是依賴于光子數(shù)量的 - 或者說是決定于打到這個特定的點上的光的強(qiáng)度。
因為我們有一個像素傳感器的二維陣列,我們現(xiàn)在就擁有能夠反應(yīng)出所有這些位置的光的強(qiáng)度的一組二維電荷陣列了。在 iPhone 6 上,我們有八百萬個這樣的微小的像素傳感器,以及它們所對應(yīng)的電荷桶。
現(xiàn)在,我們需要明白兩件事情:第一,我們需要有重置這些電荷的能力;其次,一旦像素傳感器曝光了,我們需要能夠讀出這些電荷的數(shù)量。重置這件事情可以全局地對所有像素一起進(jìn)行。但是對這樣的八百萬個小電荷,我們傾向于單獨處理,以將它們轉(zhuǎn)換為伏特量級的量,以方便讀取。
數(shù)碼相機(jī)通常會去移動一行中的像素:圖像傳感器首先讀取一行中第一個電荷桶中的電荷,然后所有的桶將它們中存放的電荷轉(zhuǎn)移給相鄰的前一個桶。這樣第一個電荷桶現(xiàn)在就保存了本來在第二個桶中的電荷,并準(zhǔn)備好了再次被讀取。重復(fù)這樣的步驟,所有像素的值都將被讀入到傳感器的行中。
正在被讀取的桶,或者說像素傳感器中的值將會被一個模數(shù)轉(zhuǎn)換器 (ADC) 轉(zhuǎn)換為數(shù)字信號。ADC 的輸出是一個對應(yīng)每個像素傳感器所接收到的進(jìn)光量的數(shù)字。最終,這些值被傳遞到一個數(shù)字圖像處理器中進(jìn)行處理。對于數(shù)字圖像處理的過程,我們稍后再談。
知道了這些,我們就明白為什么幾百萬或者上千萬像素中的幾百上千這個數(shù)字并不影響圖片質(zhì)量了?;蛘哒f,真正對圖片質(zhì)量有重大影響的是每個像素的尺寸。這些像素傳感器非常小,以 iPhone 6 為例,每個像素傳感器邊長為 1.5 μm (微米)。而在一個介于消費級和專業(yè)級之間的單反相機(jī)上,它們的邊長有 9 μm 之大。
隨著尺寸增加,有兩件事會發(fā)生。首先,像素越大,撞擊它的光就越多,所生成的電荷也就越多。我們擁有的電荷越多,也就意味著讀出時的噪聲越小。想象一下你在鄰著一條繁華的街道的屋子里聽音樂吧,如果你使用的是手機(jī)的內(nèi)置的揚聲器的話,你基本上不可能聽得到什么。但是如果你搬來一套大型環(huán)繞聲音響,那么街上的噪音就都消失了。像素中的電荷和圖像傳感器的噪點也是同樣。像素越大越好,9 μm 的圖像像素將比 1.5 μm 的像素多收集 36 倍的光子。
第二點是更大的像素意味著濺射 (bleed) 的影響變小。和 CPU 或者 RAM 一樣,圖像傳感器也是一個硅基的半導(dǎo)體部件。形象來說,光打在傳感器上的時候就像水潑在被冰住的玻璃上一樣,它會濺射到鄰近的像素中去。隨著像素變小,濺射到鄰近像素中的光就會變多:實際打到了鄰近像素中的光越多地濺射到當(dāng)前像素的話,它的值所受到的影響也就越大。
膠卷相機(jī)使用快門來控制曝光,這是處在膠卷前方的一個非常靈敏的機(jī)械部件:在曝光時它將會被打開,然后在快門速度所指定的時間之后關(guān)上。大一些的數(shù)碼相機(jī)仍然是使用機(jī)械快門,但是像智能手機(jī)和其他小的數(shù)碼相機(jī)使用的是電子快門。
包括 iOS 設(shè)備在內(nèi)的許多小型設(shè)備使用的是回轉(zhuǎn)快門 (rolling shutter)。它會一行一行地讀取圖片數(shù)據(jù)。因為每一行其實不是在同一時間讀取的,所以會導(dǎo)致有時候場景中高速移動的物體變形得很奇怪。有些例子其實還蠻有趣的。
現(xiàn)在我們知道 iPhone 是如何測量光打在每個像素上的多少了。但是通過這個我們僅只會得到一張黑白照片。彩色照片還需要額外的技術(shù)。在我們深入之前,我們先來看看顏色是什么。我們會稍微偏點題,來看看所謂顏色學(xué)的一些皮毛知識、
深綠色的森林的顏色是深綠色的,淺黃色的自行車是淺黃色的,這似乎是天經(jīng)地義的。但是這種被叫做”顏色“的東西到底是什么的。在計算機(jī)領(lǐng)域,我們也許可以回答說某種顏色就是特定量的紅,綠和藍(lán)的組合。但是在現(xiàn)實中,要比這復(fù)雜得多。
有些人 (CIE) 試圖給顏色一個定義,但是最終卻只能終結(jié)在像這樣晦澀和讓人迷惑的詞句之中:
顏色是一種由有色或無色內(nèi)容進(jìn)行任意組合而構(gòu)成的視覺感知的屬性。這種屬性可以被色彩名字描述,例如黃色,橙色,棕色,紅色,粉紅色,綠色,藍(lán)色,紫色之類;或者被無色名字描述,例如白色,灰色,黑色之類,并被像是深,淡,亮,暗這樣的名字或是組合進(jìn)行修飾。
注意:感知到的顏色依賴于顏色的視覺刺激的光譜分布,這種分布包括尺寸,形狀,結(jié)構(gòu)以及視覺刺激本身周圍的環(huán)境,以及觀察者視覺系統(tǒng)的適應(yīng)性狀態(tài)。另外進(jìn)行觀察的個人的普世經(jīng)驗以及類似場景也會對感知造成影響。
他們通過使用顏色自身來循環(huán)定義顏色,雖然被他們叫做了色彩,但這其實只不過是顏色的另一種叫法而已。
如果說要從上邊的定義里抽取一點什么的話,”顏色是一種視覺感知“ 這句話算比較重要。一個人必須要看到之后,才能說有顏色。顏色要是離開了我們的感知的話,也就不再存在了。你必須要看到光源,或者某些反射光的東西,才能說出這個東西的顏色。
牛頓首先發(fā)現(xiàn)了光是一組顏色譜??梢姽獍瞬ㄩL大致在 380 至 720 納米的一組波。但是我們在看不同波長的光的時候感覺是不一樣的。
人類的眼睛是擁有光子探測器的,其中一些被稱為視錐細(xì)胞。我們有三種不同類型的視錐:S,M 和 L。每一種類型對不同波長的光會做出不同的響應(yīng)。這些視錐細(xì)胞有時候被稱為紅色,綠色和藍(lán)色的光感受器。其實這種說法有失偏頗,更精確的叫法應(yīng)該是赤色,稍微不那么赤的赤色,以及青色。如圖所示,其實它們響應(yīng)曲線有相當(dāng)大一部分是重疊的:
http://wiki.jikexueyuan.com/project/objc/images/21-7.svg" alt="" />
像燈泡這樣的光源擁有著特定的光譜 - 也就是每個波長的光都有特定的強(qiáng)度。相對應(yīng)的,一個物體,比如自行車的框架,會按照不同的強(qiáng)度來反射或者吸收特定波長的光。對每一種情況,我們可以將光源光譜和物體的反射光譜以及視錐的響應(yīng)曲線相乘 (其實是沿波長做積分)。對每一個視錐細(xì)胞來說,這樣做會得到一個計算結(jié)果,S,M 和 L 視錐的三個光刺激值就是感知到的顏色。我們的大腦會將青色,赤色和弱赤色的視錐的值組合起來,形成對顏色的感知。事實上,顏色感知并不只依賴于這三個值的,還和空間和時間的信息有所關(guān)聯(lián)。
現(xiàn)在我們知道顏色是怎么形成的了,但是我們?nèi)绾味x某個給定的顏色呢?我們要怎么描述某輛自行車上那種特定的紅色呢?
答案是,我們需要一種叫做色彩空間的東西來定義它。我們可以將色彩空間理解成一種度量單位。
當(dāng)有人問 “大象能跑多快” 時,"18" 或者 "2.8" 這樣的答案是毫無意義的。我們需要一套度量單位來衡量它,比如 “18 千米每小時”。對于顏色來說也是一樣的。當(dāng)我們問 “這輛自行車是什么顏色” 的時候,我們也需要一套類似的 “度量單位” 來表述我們的答案。這套度量單位就是色彩空間。
雖然細(xì)節(jié)很復(fù)雜,但是色彩空間的主要概念還是非常簡單的:如果我們用三個光源 - 一個紅色,一個綠色和一個藍(lán)色的光源 - 我們可以將它們以不同強(qiáng)度混合起來以得到各種顏色的光。舉個例子,要是我們想要匹配在我們的臺燈反射下的香蕉的顏色的話,我們最后得到的值會是 10 份紅光,8 份綠光和 4 份藍(lán)光.天空的顏色可能是 4,8 和 10。這些值精確地依賴于我們所挑選的光源 (也就是基本值),在這里是 4,8 和 10。要是我們挑選了另一組光源 (基準(zhǔn)值),達(dá)到同樣的顏色結(jié)果時這個數(shù)字可能變?yōu)?11,9 和 2。我們所挑選的基準(zhǔn)值其實就定義了我們的色彩空間。
當(dāng)被問到 “這輛自行車是什么顏色” 時,我們可以說這是在某一組三個特定的基準(zhǔn)值光源下,將它們的光強(qiáng)調(diào)整到 23%,45% 和 53% 所得到顏色。其他擁有同樣的一組基準(zhǔn)光源的人就可以根據(jù)這個數(shù)字重新創(chuàng)建出這個顏色。
在現(xiàn)在計算機(jī),包括 iOS 中,事實上所使用的默認(rèn)色彩空間是 sRGB 色彩空間。它的三個基準(zhǔn)值是通過 ITU-R BT.709 標(biāo)準(zhǔn)定義的。除了通過三個基準(zhǔn)值之外,還有一些其他的不同方式來定義色彩空間,但其實最終它們的概念都是相同的。
值得指出的是,大部分的色彩空間只能對應(yīng)可見顏色的一個子集??梢钥纯?sRGB 色彩空間的圖表:
http://wiki.jikexueyuan.com/project/objc/images/21-8.svg" alt="" />
馬鞍形的圖形區(qū)域代表了人眼可見的所有顏色。黑色三角形內(nèi)的區(qū)域表示能被 sRGB 色彩空間表達(dá)的顏色。三個頂點是這個色彩空間的基準(zhǔn)值 - 也就是只有其中一個基準(zhǔn)光源全開的情況。三角形區(qū)域之外的顏色可以被人眼感知,但卻不能被 sRGB 色彩空間表達(dá)。還有一點需要特別說明的是:這張圖里在三角形之外的顏色看起來好像和三角形邊緣的顏色非常相似。這是因為這張圖片本身是用 sRGB 色彩空間來表示的,三角形外的真實的顏色在圖片文件中是顯示不出來的,因此只能回滾到和這個真實顏色最接近的能表達(dá)的顏色去。
當(dāng)我們通過十六進(jìn)制 (比如 #dde834) 或者是 UIKit 的 API (比如 UIColor(red:0.867, green:0.910, blue:0.204, alpha:1.000)) 選取顏色時,我們所表達(dá)的其實是 86.7% 的 sRGB 紅色基準(zhǔn)值,91% 的 sRGB 綠色基準(zhǔn)值以及 20.4% 的 sRGB 藍(lán)色基準(zhǔn)值所混合的顏色。
RGB 色彩空間和 sRGB 相比有更大的全色域,也就是所能表達(dá)更多的可見顏色。CIELUV (也被叫做 CIELAB) 色彩空間就是一個基于 RGB 基準(zhǔn)的色彩空間的例子。它也由三個組成部分:代表亮度的 L,以及代表顏色對立維度的 u 和 v (有時候也被叫做 a 和 b)。
更多信息請去看看 Wikipedia 上關(guān)于色彩空間的文章,另外嘗試用用 OS X 里的顏色實用工具也是熟悉色彩空間的好辦法。
還有一件事情讓顏色變得很復(fù)雜,那就是我們的大腦其實做了很多處理,來讓東西看上去是 “正?!?的 - 這種處理中很大一部分和白平衡有關(guān)。我們都知道白色和灰色是什么意思。但是當(dāng)我們看到什么東西是灰色的時候,事實上在絕大多數(shù)情況下其實它并不真的是灰色。但是我們的大腦會 “指出” 在這個光照條件下,它就應(yīng)該是灰色,所以我們認(rèn)為我們看到了灰色。
從一幢白色的建筑物上反射出來的光在早上和晚上其實是大不相同的。但是我們的大腦指出建筑物的顏色并沒有從一種變換到另一種。這乍看上去很明顯,因為我們已經(jīng)習(xí)慣了我們的大腦無時無刻不在處理這些事情。
我們的大腦有能力進(jìn)行色彩調(diào)節(jié) - 它通過調(diào)整每種視錐類型的靈敏程度來進(jìn)行色彩平衡。另外,除了簡單的調(diào)整以外,我們的大腦還有一些非常復(fù)雜的機(jī)制。大腦是如何截取那些來自視錐,但又依賴于環(huán)境,時間和空間影響的信號的?Akiyoshi 關(guān)于視覺的頁面展示了一些證明大腦處理能力的令人精神錯亂的例子。但是當(dāng)事情來到相片和顏色時,要記住的是相機(jī)只能簡單地記錄它所看到的東西,正因如此,有時候?qū)ξ覀儊碚f,拍到的東西和它本身看起來的就有可能偏離很遠(yuǎn)。
當(dāng)我們使用相機(jī)拍照時,相機(jī)可沒我們的大腦那么聰明。但是相機(jī)也有一套自動的白平衡算法來嘗試找出場景中的中性顏色 (也就是灰系色)。之后相機(jī)的圖像傳感器將嘗試將相片中的所有顏色都按照這個結(jié)果來進(jìn)行調(diào)整。有時候這很好使,但也有失敗的時候。失敗一般是因為奇怪的光照條件,比如場景的一部分被一種光源照亮,而另一部分被另一種光源照亮。
有了以上這些知識,我們就可以來看看我們的數(shù)碼相機(jī)是怎么看到這些顏色的了。
像素傳感器自身并不會因為光的波長不同而有什么區(qū)別。但是如果在它們前面放一個顏色濾鏡的話,像素傳感器的響應(yīng)曲線就會根據(jù)光的波長的不同而發(fā)生分離變化。
如果我們使用綠色,紅色以及藍(lán)色的顏色濾鏡,那么有些像素傳感器將只接收綠光,有些只接收紅光,而有些只接收藍(lán)光 (在現(xiàn)實中,它們將擁有和我們眼睛的視錐細(xì)胞相似的響應(yīng)曲線)。當(dāng)今的相機(jī)幾乎無一例外地使用了一種稱為拜爾濾鏡 (Bayer filter) 的裝置。如果使用這種濾鏡的話,綠色的像素傳感器的數(shù)量將會是紅色或者藍(lán)色的兩倍。它看上去是這樣的:
http://wiki.jikexueyuan.com/project/objc/images/21-9.svg" alt="" />
現(xiàn)在數(shù)碼相機(jī)有顏色信息了,但是同時它也丟失了很多信息。我們只知道所有像素中的 1/4 的部分的紅色的值。藍(lán)色也類似。而對于綠色,我們知道 1/2 的像素的值。換句話說,66% 的數(shù)據(jù)丟失了。將所有像素的全部的顏色信息進(jìn)行還原的過程叫做逆拜爾化 (debayering)。與之相伴的高級算法將將通過為已存在的信息進(jìn)行插值,來得到一張全分辨率的彩色圖像。
即使是一個簡單的插值算法也可能要花上很多努力來得到,而隨著時間流逝,越來越多的逆拜爾化方法被開發(fā)出來解決這個問題。但是也存在一些問題問題,來舉例說明:大部分的逆拜爾化算法非常依賴綠色像素的流明數(shù) (光強(qiáng)度)。這樣導(dǎo)致的結(jié)果是幾乎所有這些逆拜爾化算法在幾乎全紅色的區(qū)域表現(xiàn)不佳。這里截取了一張 iPhone 6 拍攝的照片:
http://wiki.jikexueyuan.com/project/objc/images/21-10.jpg" alt="" />
注意相比起小冊子上的黑色文字來說,iPad 保護(hù)殼上寫的 “PRODUCT” 的大字中的 C 和 T 字母是非常不清楚的。這是由于圖像在 iPad 保護(hù)殼的部分缺少綠色信息而導(dǎo)致逆拜爾化的去噪部分無法得到準(zhǔn)確信息,從而圖像模糊。
除了重建顏色信息,相機(jī)里的圖像處理器還對圖像做了一系列的其他調(diào)整。
隨著圖像傳感器的像素數(shù)越來越多,某些像素中產(chǎn)生缺陷的可能性也越來越高。通常相機(jī)里都會有一系列的像素 (通常是整排) 是無法正常工作的。在對原始圖像數(shù)據(jù)進(jìn)行處理的時候,圖像處理器將去修復(fù)那些死掉的像素。
圖像傳感器有一部分區(qū)域的像素的位置是在相機(jī)接收可見光的區(qū)域之外的。這些圖像傳感器的像素將永遠(yuǎn)是黑色的。但是它們讀出的數(shù)據(jù)卻不是 0。利用這些像素,圖像處理器可以通過用包含實際圖片的那些像素的值減去它們,來調(diào)整圖像的明暗程度。通過這個方式,圖像處理器也可以補償大部分圖像傳感器 (和/或 ADC) 中的內(nèi)在誤差。
數(shù)碼相機(jī)的最后一步是將圖像數(shù)據(jù)寫入一個文件中。在大部分情況下,數(shù)碼相片被保存為 JPEG 格式。JEPG 壓縮 會調(diào)整圖像數(shù)據(jù)以追求高的壓縮比。iPhone 6 所拍攝的一張圖片的像素數(shù)據(jù)大約為 23 MB (3.264 x 2.448 x 3 = 23.970.816),但是這樣一張圖片對應(yīng)的 JPEG 文件通常只有 1.5 到 2.5 MB。通過閱讀話題 #3 的這篇文章來了解關(guān)于 JPEG 的更多信息。
有些數(shù)碼相機(jī)允許用戶存儲一種叫 RAW 格式的文件。相機(jī)的圖像處理器仍然會對從傳感器拿到的原始圖像數(shù)據(jù)做一些處理,但是這個文件所包含的數(shù)據(jù)將非常接近于真實的像素值。這么做的好處是我們可以在之后的時間點對它做逆拜爾化。
舉個例子,OS X 上的逆拜爾化比大部分單反相機(jī)上的要強(qiáng)力。與操作 JPEG 文件相比,對支持的相機(jī)的 RAW 文件進(jìn)行操作,可以讓我們在不損失畫質(zhì)的前提下做更多的調(diào)整。Core Image 中的 RAW 圖像處理將把用戶定義的各種調(diào)整作為逆拜爾化的一部分。相比起來,在操作 JPEG 圖像時,調(diào)整僅只是事后工作。
想了解更多細(xì)節(jié)的話,可以查看 OS X SDK 中的 CoreImage/CIRAWFilter.h 文件,以及 WWDC 2014 session 514 的 32:40 的部分。
我們今天使用的數(shù)碼相機(jī)是數(shù)十年研究和工程的結(jié)晶。我們在這篇文章里勉強(qiáng)勾勒了它所使用到的科技的輪廓。通過這篇文章,我們希望你能夠更了解你的 (iPhone) 相機(jī)... 以及為 iOS 和 OSX 制作出更好的相片 app。