相機工作原理

發表於2015-05-28

輕輕一按,你的相機就把光子轉換為了位元。於是一張相片就儲存到了你的 iPhone 裡。

讓我們假設一下你身處室外,環顧四周。三億裡之外,太陽無時無刻不在發射光子。它們需要花上 8 分鐘之久才能到達我們舒適的星球。有一些光子撞擊到你周圍的物體,並反射到你眼睛的視網膜上,這會使你的大腦以這些物體為基準,建立一副影象,我們將其稱之為視覺。

攝影要做的就是捕獲這幅影象。攝影是在 200 年前被髮明的,但在此之前的好幾千年裡,人類已經通過繪畫的方式來捕捉他們所看到的東西了。

我們中的很多人其實每天都相機不離身:當今智慧手機已經是最常用的相機之一了。在數碼攝影的時代之前,攝影通常是記錄在紙上或者膠捲上的。而今天,攝影將光轉換為位元資訊。

這篇文章將帶你探索這一切是怎麼發生的:智慧手機的相機到底是如何工作的。

快門速度,感光度 (ISO),光圈

在我們深入將光子轉換為 JPEG 檔案之前,我們先來看看相片的一些基本概念。這些概念不僅在過去的膠捲攝影時有效,在今天也是同樣的。在不久之前,幾乎所有的攝影都是通過膠捲完成的。與今天使用數碼感光器不同,那時候成像依賴的是受光照影響的生化反應。但因為在拍攝相片中其他所有東西都遵循同樣的原則,所以對笨重的膠捲相機和膠捲攝影適用的規律一樣會在使用 iPhone 拍攝時適用。

進光量

拍攝一張相片的過程有時候被稱之為曝光。曝光也指單位面積上光的數量。為了相片亮度合適,光的數量也需要在一定的範圍內。如果我們沒有捕獲足夠的光,那麼相片就會欠曝 – 影象被湮沒在影象感測器或者膠捲的固有噪聲中。如果我們捕獲的光太多,影象就會過曝 – 圖片感測器/膠捲所接受的光過於飽和,無法區分不同的光的數量,這意味著幾乎所有區域看上去曝光程度都是一樣的。

當拍攝照片時,我們必須將相機調整到光線的量既不太高也不太低。下面是同一個場景中欠曝和過曝的樣本,右手邊的顯示了使用 Pixelmator 調整了曝光後的情況。這個例子說明了要是一張照片過度地過曝或者欠曝的話,是沒有辦法進行修復的:

未調整 已調整

在欠曝影象中,即使我們嘗試將它調亮,影象的暗部依然被 “卡” 在黑色,我們沒有辦法讓影象中的筆確實擁有不同的顏色。過曝影象中也有大部分割槽域被卡在白色或者灰色:編織帶和硬幣細節已經完全丟失了。

曝光檔數

有三個要素可以影響曝光的進光量:快門速度,光圈和感光度 (ISO)。我們稍後會仔細談談它們。

在攝影中,通過調整這三者中任意一個來讓進光量翻倍或者減半,就叫做改變了 “一檔” 曝光。每一檔曝光對於這三者 (快門速度,光圈和曝光度) 來說對應的是不同的數字變化。但如果我們將快門速度調整一檔,我們需要通過調整 ISO 或者光圈一檔來進行補償,才能獲取同樣的進光量。我們之後會馬上提及一些細節。

有趣的是所有這三者 (快門速度,光圈和 ISO) 也會在曝光上影響其他要素。這三個引數有著無數種組合來達到同樣進光量的結果,我們來仔細研究下:

快門速度

當我們捕捉圖片時,影象感測器捕捉一段時間的光線。這段時間被叫做快門速度,因為它表示了快門開啟和關閉的快慢。

比如 1/50 秒的快門速度會讓影象感測器進行 1/50 秒 (= 0.02 秒或者 20ms) 光線捕捉。如果我們將快門速度改變至 1/25s (40ms) 時,影象感測器將捕捉兩倍時間長度的光,也就是兩倍數量的光子,或者說兩倍的進光量。

對於快門速度來說,一檔表示將快門速度加倍或者減半。從 1/50 秒到 1/25 秒調整了一檔。

iPhone 6 的快門速度可以在 1/8000 秒到 1/2 秒之間調整。我們可以通過改變快門速度來調整進光量,但這也會影響影象的清晰度。如果我們在拍照時相機和場景是完全靜止的,我們可以使用任意長的曝光時間 (快門速度),但是更多情況並非如此。我們身邊的東西都一直在移動,特別是對於 iPhone 來說,相機本身也一直在移動。

當物體移動的足夠快的時候,它在整個曝光時間裡便不會只停留在某一個點,這會導致圖片模糊。一般來說我們希望畫面清晰、不模糊,因此我們通常希望快門速度在 1/100 秒或者更快/更短。對於高速運動的物體的攝影,我們可能還需要選擇一個更快的快門速度。但是我們也可以有意地選擇一個長的快門速度來讓物體模糊,以強調其運動感。這種情況下最好把相機固定在三腳架或者類似的東西上,這樣可以確保場景中固定的物體仍然保持清晰。

感光度 (ISO)

ISO 值也被稱作膠捲速度。在數碼攝影中,它被用來衡量影象感測器對光的靈敏程度,以及因此帶來的曝光噪音。實際上的細節非常複雜,Wikipedia 會給你一個更詳細的解釋。

iPhone 6 可以將相機在 ISO 32 至 ISO 1600 之間調整 ISO 值。一檔對應翻倍或者減半 ISO 值。每次我們將 ISO 加倍 (比如從 ISO 100 到 ISO 200),我們就只需要一半的進光量。我們為此是要付出的代價的,那就是相片的噪點將會變多。

在 ISO 32 時,iPhone 感測器得到的圖片將會有最少的噪點,但是同時也需要最多的光。在 ISO 1600 時,iPhone 影象感測器就只需要 1/50 (2%) 的進光量,但是圖片會有更多的噪點。

這裡有用三腳架架上 iPhone 6 後同樣場景的兩個樣本、這些圖片是從整幅相片中裁取的一小部分。左邊的使用的是 ISO 32 和 1/3 秒曝光。右邊的是 ISO 1600 和 1/180 秒曝光。捕獲的進光量基本是一致的,但是左邊的噪點要比右邊的少。但是如果沒有三腳架的話,我們是無法使用 1/3 秒的曝光時間來拍出銳利的相片的。

ISO 32 ISO 1600

光圈

最後,相機 (更確切地說是相機的鏡頭) 的光圈是用來衡量到達影象感應器的光所通過的通孔的大小的。光圈值以 F 比例 (焦比) 來進行標定,比如 ƒ/5.6,其中 5.6 表示鏡頭焦距與光圈 (也就是通孔) 的有效直徑的比例。

可能 F 比例會讓人有點迷惑。F 比例所對應的一檔指的是當前值與根號 2 (√₂ ≃ 1.4) 相乘或者相除。在 ƒ/4 時,我們所得到的光的量是 ƒ/2.8 時的一半。

當使用 iPhone 相機時,事情就變得簡單很多了,因為 iPhone 6 的光圈值是固定的,具體來說是 ƒ/2.2。

除了影響進光量,光圈還會對景深造成影響。這和對焦有關係。相機中的光學系統會將與相機一定距離範圍內的物體渲染清晰。當我們改變光圈時,這個距離範圍將變寬或者變窄。我們可以用這個特性來達到一些很好的效果 (譯者注:比如人像的背景虛化等)。但很遺憾的是,我們不能調整 iPhone 的光圈大小。

結合起來

在 iPhone 上,我們能調節的只有 ISO 和快門速度。因此我們需要在噪點 (由 ISO 影響) 以及動態模糊/銳利之間進行權衡,同時保證相同檔次的曝光。

這也解釋了為什麼晚上拍出來的照片看起來要比白天拍出來的差:在晚上光線要少得多,為了仍然有一個可接受的快門速度,自動曝光系統將調高 ISO,也許會被調到相機允許的最大值。要是即使這樣還是不能達到足夠的進光,自動曝光還會降低快門速度。這樣的組合就造成了畫面上更多的噪點,以及影象模糊。

有些 iOS app 可以讓你手動調整曝光。其中一種選擇是去調整 EV (exposure value) 值 (也就是曝光值)。這種方式還是會使用相機的自動曝光邏輯,但是你可以調整你想要的曝光程度。-1 的 EV 值將會通過自動曝光邏輯讓圖片欠曝一檔。自動曝光邏輯仍然會自動地選擇 ISO 和快門速度的組合 (因為在 iPhone 相機上光圈是固定的)。

另一種選擇是使用快門優先 (通常被標記為 S 或 Tv)。這讓我們能都直接設定想要的快門速度,然後自動曝光將自動地調整 ISO 來達到合適的曝光。

最後,我們可以完全手動控制曝光 (通常用 M 來表示),這種情況下我們需要自己調節快門速度和 ISO。當這麼做的時候,我們通常會為了方便先自動曝光一張,然後使用自動曝光的引數來作為調節的起始點。

那些允許你調整光圈的相機還有一種模式叫做光圈優先 (通常標記為 A 或者 Av)。這種模式和快門優先在概念上是對應的,我們手動控制光圈,然後讓自動曝光邏輯去選擇快門速度 (以及 ISO 值,除非它是固定的)。

有一些好辦法可以讓你獲取到好的自動曝光。iOS 的自動曝光邏輯將會檢查影象的全部部分,然後去猜測你想要拍攝和曝光的主體是什麼。如果畫面的一部分特別亮,其他地方又特別暗的話,相機是不能把所有東西都曝光得很好的。所以在這種情況下自動曝光必須選擇一些東西作為主體,比如人的面部。內建的 iOS 相機 app 也允許你通過點選畫面來提示自動曝光系統某個部分比較重要,應該被良好曝光,這會導致自動曝光進行調整。相機 app 還能讓你通過在螢幕上上下滑動來調整曝光值。但是如果你想要直接去設定快門速度和/或 ISO 的話,你就需要用另外的 app 了。

對焦

相機只能將離相機一定距離範圍內的物體渲染清晰。在這個範圍內的物體就是被聚焦的,而如果太近或者太遠而導致模糊的,它們就是失焦的。

包括 iPhone 在內的大多數的相機都有自動對焦 (AF),相機會猜測圖片的哪個部分需要被聚焦,並依此來調節焦距。iOS 內建的相機 app 允許使用者點選某處來進行對焦 – 有些 app 甚至可以讓使用者手動調節焦距。

光學元件

相機鏡頭是由一系列光學元件構成的,它們負責引導和聚集光束。對相機焦距的調整,其實是通過物理移動這些鏡頭元件來完成的。

模組化相機 – 比如 單反 – 可以讓你在不同的鏡頭間切換。即使是像 iPhone 這樣固定鏡頭的相機,你也可以通過在內建鏡頭前方再加裝額外鏡頭來調整相機的光學部分。

鏡頭系統最重要的指標是它的焦距 – 主要是它的放大倍率和視野角度。一個廣角鏡頭的放大倍率比較低,因此可以讓相機捕捉更大的區域。而長焦鏡頭,特別是遠攝鏡頭的視角就窄得多,由於它的放大倍數很大,它只能獲取廣角鏡頭中的一小部分割槽域。

鏡頭也影響影象的其他部分。它可能會將一些你不想要的變形或者顏色失真引入到拍攝的圖片中,比如色差就是一個典型的例子。

光滿四溢

現在我們知道一些基礎知識了,那麼相機實際上是如何捕捉影象的呢?

在你的 iPhone 相機裡面,有一個影象感測器。這個部分就相當於我們眼睛裡的視網膜。影象感測器可以將光或者光子轉換為電訊號。

影象感測器是由海量的獨個的畫素感測器串起來的巨大矩形區域。我們可以將每個畫素感測器想象成一個裝電荷的桶。當光子撞擊到畫素感測器的光二極體時,它們將在這個畫素的桶中緩慢地積攢電荷。最後,每個畫素都會有它自己的一小桶電子。這些電荷的數量是依賴於光子數量的 – 或者說是決定於打到這個特定的點上的光的強度。

因為我們有一個畫素感測器的二維陣列,我們現在就擁有能夠反應出所有這些位置的光的強度的一組二維電荷陣列了。在 iPhone 6 上,我們有八百萬個這樣的微小的畫素感測器,以及它們所對應的電荷桶。

現在,我們需要明白兩件事情:第一,我們需要有重置這些電荷的能力;其次,一旦畫素感測器曝光了,我們需要能夠讀出這些電荷的數量。重置這件事情可以全域性地對所有畫素一起進行。但是對這樣的八百萬個小電荷,我們傾向於單獨處理,以將它們轉換為伏特量級的量,以方便讀取。

數碼相機通常會去移動一行中的畫素:影象感測器首先讀取一行中第一個電荷桶中的電荷,然後所有的桶將它們中存放的電荷轉移給相鄰的前一個桶。這樣第一個電荷桶現在就儲存了本來在第二個桶中的電荷,並準備好了再次被讀取。重複這樣的步驟,所有畫素的值都將被讀入到感測器的行中。

正在被讀取的桶,或者說畫素感測器中的值將會被一個模數轉換器 (ADC) 轉換為數字訊號。ADC 的輸出是一個對應每個畫素感測器所接收到的進光量的數字。最終,這些值被傳遞到一個數字影象處理器中進行處理。對於數字影象處理的過程,我們稍後再談。

畫素尺寸,錙銖必較

知道了這些,我們就明白為什麼幾百萬或者上千萬畫素中的幾百上千這個數字並不影響圖片質量了。或者說,真正對圖片質量有重大影響的是每個畫素的尺寸。這些畫素感測器非常小,以 iPhone 6 為例,每個畫素感測器邊長為 1.5 µm (微米)。而在一個介於消費級和專業級之間的單反相機上,它們的邊長有 9 µm 之大。

隨著尺寸增加,有兩件事會發生。首先,畫素越大,撞擊它的光就越多,所生成的電荷也就越多。我們擁有的電荷越多,也就意味著讀出時的噪聲越小。想象一下你在鄰著一條繁華的街道的屋子裡聽音樂吧,如果你使用的是手機的內建的揚聲器的話,你基本上不可能聽得到什麼。但是如果你搬來一套大型環繞聲音響,那麼街上的噪音就都消失了。畫素中的電荷和影象感測器的噪點也是同樣。畫素越大越好,9 µm 的影象畫素將比 1.5 µm 的畫素多收集 36 倍的光子。

第二點是更大的畫素意味著濺射 (bleed) 的影響變小。和 CPU 或者 RAM 一樣,影象感測器也是一個矽基半導體部件。形象來說,光打在感測器上的時候就像水潑在被冰住的玻璃上一樣,它會濺射到鄰近的畫素中去。隨著畫素變小,濺射到鄰近畫素中的光就會變多:實際打到了鄰近畫素中的光越多地濺射到當前畫素的話,它的值所受到的影響也就越大。

快門

膠捲相機使用快門來控制曝光,這是處在膠捲前方的一個非常靈敏的機械部件:在曝光時它將會被開啟,然後在快門速度所指定的時間之後關上。大一些的數碼相機仍然是使用機械快門,但是像智慧手機和其他小的數碼相機使用的是電子快門。

包括 iOS 裝置在內的許多小型裝置使用的是迴轉快門 (rolling shutter)。它會一行一行地讀取圖片資料。因為每一行其實不是在同一時間讀取的,所以會導致有時候場景中高速移動的物體變形得很奇怪。有些例子其實還蠻有趣的

顏色

現在我們知道 iPhone 是如何測量光打在每個畫素上的多少了。但是通過這個我們僅只會得到一張黑白照片。彩色照片還需要額外的技術。在我們深入之前,我們先來看看顏色是什麼。我們會稍微偏點題,來看看所謂顏色學的一些皮毛知識、

深綠色的森林的顏色是深綠色的,淺黃色的自行車是淺黃色的,這似乎是天經地義的。但是這種被叫做”顏色“的東西到底是什麼的。在計算機領域,我們也許可以回答說某種顏色就是特定量的紅,綠和藍的組合。但是在現實中,要比這複雜得多。

有些人 (CIE) 試圖給顏色一個定義,但是最終卻只能終結在像這樣晦澀和讓人迷惑的詞句之中:

顏色是一種由有色或無色內容進行任意組合而構成的視覺感知的屬性。這種屬性可以被色彩名字描述,例如黃色,橙色,棕色,紅色,粉紅色,綠色,藍色,紫色之類;或者被無色名字描述,例如白色,灰色,黑色之類,並被像是深,淡,亮,暗這樣的名字或是組合進行修飾。

注意:感知到的顏色依賴於顏色的視覺刺激的光譜分佈,這種分佈包括尺寸,形狀,結構以及視覺刺激本身周圍的環境,以及觀察者視覺系統的適應性狀態。另外進行觀察的個人的普世經驗以及類似場景也會對感知造成影響。

他們通過使用顏色自身來迴圈定義顏色,雖然被他們叫做了色彩,但這其實只不過是顏色的另一種叫法而已。

視覺感知

如果說要從上邊的定義裡抽取一點什麼的話,”顏色是一種視覺感知“ 這句話算比較重要。一個人必須要看到之後,才能說有顏色。顏色要是離開了我們的感知的話,也就不再存在了。你必須要看到光源,或者某些反射光的東西,才能說出這個東西的顏色。

牛頓首先發現了光是一組顏色譜。可見光包含了波長大致在 380 至 720 奈米的一組波。但是我們在看不同波長的光的時候感覺是不一樣的。

人類的眼睛是擁有光子探測器的,其中一些被稱為視錐細胞。我們有三種不同型別的視錐:S,M 和 L。每一種型別對不同波長的光會做出不同的響應。這些視錐細胞有時候被稱為紅色,綠色和藍色的光感受器。其實這種說法有失偏頗,更精確的叫法應該是赤色,稍微不那麼赤的赤色,以及青色。如圖所示,其實它們響應曲線有相當大一部分是重疊的:

像燈泡這樣的光源擁有著特定的光譜 – 也就是每個波長的光都有特定的強度。相對應的,一個物體,比如自行車的框架,會按照不同的強度來反射或者吸收特定波長的光。對每一種情況,我們可以將光源光譜和物體的反射光譜以及視錐的響應曲線相乘 (其實是沿波長做積分)。對每一個視錐細胞來說,這樣做會得到一個計算結果,S,M 和 L 視錐的三個光刺激值就是感知到的顏色。我們的大腦會將青色,赤色和弱赤色的視錐的值組合起來,形成對顏色的感知。事實上,顏色感知並不只依賴於這三個值的,還和空間和時間的資訊有所關聯。

指定顏色

現在我們知道顏色是怎麼形成的了,但是我們如何定義某個給定的顏色呢?我們要怎麼描述某輛自行車上那種特定的紅色呢?

答案是,我們需要一種叫做色彩空間的東西來定義它。我們可以將色彩空間理解成一種度量單位。

當有人問 “大象能跑多快” 時,”18″ 或者 “2.8” 這樣的答案是毫無意義的。我們需要一套度量單位來衡量它,比如 “18 千米每小時”。對於顏色來說也是一樣的。當我們問 “這輛自行車是什麼顏色” 的時候,我們也需要一套類似的 “度量單位” 來表述我們的答案。這套度量單位就是色彩空間。

雖然細節很複雜,但是色彩空間的主要概念還是非常簡單的:如果我們用三個光源 – 一個紅色,一個綠色和一個藍色的光源 – 我們可以將它們以不同強度混合起來以得到各種顏色的光。舉個例子,要是我們想要匹配在我們的檯燈反射下的香蕉的顏色的話,我們最後得到的值會是 10 份紅光,8 份綠光和 4 份藍光.天空的顏色可能是 4,8 和 10。這些值精確地依賴於我們所挑選的光源 (也就是基本值),在這裡是 4,8 和 10。要是我們挑選了另一組光源 (基準值),達到同樣的顏色結果時這個數字可能變為 11,9 和 2。我們所挑選的基準值其實就定義了我們的色彩空間。

當被問到 “這輛自行車是什麼顏色” 時,我們可以說這是在某一組三個特定的基準值光源下,將它們的光強調整到 23%,45% 和 53% 所得到顏色。其他擁有同樣的一組基準光源的人就可以根據這個數字重新建立出這個顏色。

在現在計算機,包括 iOS 中,事實上所使用的預設色彩空間是 sRGB 色彩空間。它的三個基準值是通過 ITU-R BT.709 標準定義的。除了通過三個基準值之外,還有一些其他的不同方式來定義色彩空間,但其實最終它們的概念都是相同的。

值得指出的是,大部分的色彩空間只能對應可見顏色的一個子集。可以看看 sRGB 色彩空間的圖表:

馬鞍形的圖形區域代表了人眼可見的所有顏色。黑色三角形內的區域表示能被 sRGB 色彩空間表達的顏色。三個頂點是這個色彩空間的基準值 – 也就是隻有其中一個基準光源全開的情況。三角形區域之外的顏色可以被人眼感知,但卻不能被 sRGB 色彩空間表達。還有一點需要特別說明的是:這張圖裡在三角形之外的顏色看起來好像和三角形邊緣的顏色非常相似。這是因為這張圖片本身是用 sRGB 色彩空間來表示的,三角形外的真實的顏色在圖片檔案中是顯示不出來的,因此只能回滾到和這個真實顏色最接近的能表達的顏色去。

當我們通過十六進位制 (比如 #dde834) 或者是 UIKit 的 API (比如 UIColor(red:0.867, green:0.910, blue:0.204, alpha:1.000)) 選取顏色時,我們所表達的其實是 86.7% 的 sRGB 紅色基準值,91% 的 sRGB 綠色基準值以及 20.4% 的 sRGB 藍色基準值所混合的顏色。

RGB 色彩空間和 sRGB 相比有更大的全色域,也就是所能表達更多的可見顏色。CIELUV (也被叫做 CIELAB) 色彩空間就是一個基於 RGB 基準的色彩空間的例子。它也由三個組成部分:代表亮度的 L,以及代表顏色對立維度的 u 和 v (有時候也被叫做 a 和 b)。

更多資訊請去看看 Wikipedia 上關於色彩空間的文章,另外嘗試用用 OS X 裡的顏色實用工具也是熟悉色彩空間的好辦法。

白非白

還有一件事情讓顏色變得很複雜,那就是我們的大腦其實做了很多處理,來讓東西看上去是 “正常” 的 – 這種處理中很大一部分和白平衡有關。我們都知道白色和灰色是什麼意思。但是當我們看到什麼東西是灰色的時候,事實上在絕大多數情況下其實它並不真的是灰色。但是我們的大腦會 “指出” 在這個光照條件下,它就應該是灰色,所以我們認為我們看到了灰色。

從一幢白色的建築物上反射出來的光在早上和晚上其實是大不相同的。但是我們的大腦指出建築物的顏色並沒有從一種變換到另一種。這乍看上去很明顯,因為我們已經習慣了我們的大腦無時無刻不在處理這些事情。

我們的大腦有能力進行色彩調節 – 它通過調整每種視錐型別的靈敏程度來進行色彩平衡。另外,除了簡單的調整以外,我們的大腦還有一些非常複雜的機制。大腦是如何擷取那些來自視錐,但又依賴於環境,時間和空間影響的訊號的?Akiyoshi 關於視覺的頁面展示了一些證明大腦處理能力的令人精神錯亂的例子。但是當事情來到相片和顏色時,要記住的是相機只能簡單地記錄它所看到的東西,正因如此,有時候對我們來說,拍到的東西和它本身看起來的就有可能偏離很遠。

當我們使用相機拍照時,相機可沒我們的大腦那麼聰明。但是相機也有一套自動的白平衡演算法來嘗試找出場景中的中性顏色 (也就是灰系色)。之後相機的影象感測器將嘗試將相片中的所有顏色都按照這個結果來進行調整。有時候這很好使,但也有失敗的時候。失敗一般是因為奇怪的光照條件,比如場景的一部分被一種光源照亮,而另一部分被另一種光源照亮。

有了以上這些知識,我們就可以來看看我們的數碼相機是怎麼看到這些顏色的了。

數碼顏色感測器

畫素感測器自身並不會因為光的波長不同而有什麼區別。但是如果在它們前面放一個顏色濾鏡的話,畫素感測器的響應曲線就會根據光的波長的不同而發生分離變化。

如果我們使用綠色,紅色以及藍色的顏色濾鏡,那麼有些畫素感測器將只接收綠光,有些只接收紅光,而有些只接收藍光 (在現實中,它們將擁有和我們眼睛的視錐細胞相似的響應曲線)。當今的相機幾乎無一例外地使用了一種稱為拜爾濾鏡 (Bayer filter) 的裝置。如果使用這種濾鏡的話,綠色的畫素感測器的數量將會是紅色或者藍色的兩倍。它看上去是這樣的:

現在數碼相機有顏色資訊了,但是同時它也丟失了很多資訊。我們只知道所有畫素中的 1/4 的部分的紅色的值。藍色也類似。而對於綠色,我們知道 1/2 的畫素的值。換句話說,66% 的資料丟失了。將所有畫素的全部的顏色資訊進行還原的過程叫做逆拜爾化 (debayering)。與之相伴的高階演算法將將通過為已存在的資訊進行插值,來得到一張全解析度的彩色影象。

即使是一個簡單的插值演算法也可能要花上很多努力來得到,而隨著時間流逝,越來越多的逆拜爾化方法被開發出來解決這個問題。但是也存在一些問題問題,來舉例說明:大部分的逆拜爾化演算法非常依賴綠色畫素的流明數 (光強度)。這樣導致的結果是幾乎所有這些逆拜爾化演算法在幾乎全紅色的區域表現不佳。這裡擷取了一張 iPhone 6 拍攝的照片:

注意相比起小冊子上的黑色文字來說,iPad 保護殼上寫的 “PRODUCT” 的大字中的 C 和 T 字母是非常不清楚的。這是由於影象在 iPad 保護殼的部分缺少綠色資訊而導致逆拜爾化的去噪部分無法得到準確資訊,從而影象模糊。

缺陷補償

除了重建顏色資訊,相機裡的影象處理器還對影象做了一系列的其他調整。

隨著影象感測器的畫素數越來越多,某些畫素中產生缺陷的可能性也越來越高。通常相機裡都會有一系列的畫素 (通常是整排) 是無法正常工作的。在對原始影象資料進行處理的時候,影象處理器將去修復那些死掉的畫素。

影象感測器有一部分割槽域的畫素的位置是在相機接收可見光的區域之外的。這些影象感測器的畫素將永遠是黑色的。但是它們讀出的資料卻不是 0。利用這些畫素,影象處理器可以通過用包含實際圖片的那些畫素的值減去它們,來調整影象的明暗程度。通過這個方式,影象處理器也可以補償大部分影象感測器 (和/或 ADC) 中的內在誤差。

檔案格式

數碼相機的最後一步是將影象資料寫入一個檔案中。在大部分情況下,數碼相片被儲存為 JPEG 格式。JEPG 壓縮 會調整影象資料以追求高的壓縮比。iPhone 6 所拍攝的一張圖片的畫素資料大約為 23 MB (3.264 x 2.448 x 3 = 23.970.816),但是這樣一張圖片對應的 JPEG 檔案通常只有 1.5 到 2.5 MB。通過閱讀話題 #3 的這篇文章來了解關於 JPEG 的更多資訊。

有些數碼相機允許使用者儲存一種叫 RAW 格式的檔案。相機的影象處理器仍然會對從感測器拿到的原始影象資料做一些處理,但是這個檔案所包含的資料將非常接近於真實的畫素值。這麼做的好處是我們可以在之後的時間點對它做逆拜爾化。

舉個例子,OS X 上的逆拜爾化比大部分單反相機上的要強力。與操作 JPEG 檔案相比,對支援的相機的 RAW 檔案進行操作,可以讓我們在不損失畫質的前提下做更多的調整。Core Image 中的 RAW 影象處理將把使用者定義的各種調整作為逆拜爾化的一部分。相比起來,在操作 JPEG 影象時,調整僅只是事後工作。

想了解更多細節的話,可以檢視 OS X SDK 中的 CoreImage/CIRAWFilter.h 檔案,以及 WWDC 2014 session 514 的 32:40 的部分。

結語

我們今天使用的數碼相機是數十年研究和工程的結晶。我們在這篇文章裡勉強勾勒了它所使用到的科技的輪廓。通過這篇文章,我們希望你能夠更瞭解你的 (iPhone) 相機… 以及為 iOS 和 OSX 製作出更好的相片 app。

相關文章