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