鍍金池/ 教程/ iOS/ 相機(jī)工作原理
與四軸無(wú)人機(jī)的通訊
在沙盒中編寫(xiě)腳本
結(jié)構(gòu)體和值類(lèi)型
深入理解 CocoaPods
UICollectionView + UIKit 力學(xué)
NSString 與 Unicode
代碼簽名探析
測(cè)試
架構(gòu)
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅(qū)動(dòng)開(kāi)發(fā)
Collection View 動(dòng)畫(huà)
截圖測(cè)試
MVVM 介紹
使 Mac 應(yīng)用數(shù)據(jù)腳本化
一個(gè)完整的 Core Data 應(yīng)用
插件
字符串
為 iOS 建立 Travis CI
先進(jìn)的自動(dòng)布局工具箱
動(dòng)畫(huà)
為 iOS 7 重新設(shè)計(jì) App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡(luò)應(yīng)用實(shí)例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類(lèi)
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動(dòng)畫(huà)解釋
響應(yīng)式 Android 應(yīng)用
初識(shí) TextKit
客戶(hù)端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項(xiàng)目介紹
Swift 的強(qiáng)大之處
測(cè)試并發(fā)程序
Android 通知中心
調(diào)試:案例學(xué)習(xí)
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機(jī)制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學(xué)習(xí)的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設(shè)計(jì)優(yōu)雅的移動(dòng)游戲
繪制像素到屏幕上
相機(jī)與照片
音頻 API 一覽
交互式動(dòng)畫(huà)
常見(jiàn)的后臺(tái)實(shí)踐
糟糕的測(cè)試
避免濫用單例
數(shù)據(jù)模型和模型對(duì)象
Core Data
字符串本地化
View Controller 轉(zhuǎn)場(chǎng)
照片框架
響應(yīng)式視圖
Square Register 中的擴(kuò)張
DTrace
基礎(chǔ)集合類(lèi)
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點(diǎn)互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設(shè)計(jì)的藝術(shù)
導(dǎo)航應(yīng)用
線(xiàn)程安全類(lèi)的設(shè)計(jì)
置換測(cè)試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無(wú)人機(jī)項(xiàng)目
Mach-O 可執(zhí)行文件
UI 測(cè)試
值對(duì)象
活動(dòng)追蹤
依賴(lài)注入
Swift
項(xiàng)目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務(wù)
自定義 Collection View 布局
測(cè)試 View Controllers
訪(fǎng)談
收據(jù)驗(yàn)證
數(shù)據(jù)同步
自定義 ViewController 容器轉(zhuǎn)場(chǎng)
游戲
調(diào)試核對(duì)清單
View Controller 容器
學(xué)無(wú)止境
XCTest 測(cè)試實(shí)戰(zhàn)
iOS 7
Layer 中自定義屬性的動(dòng)畫(huà)
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲(chǔ)
代碼審查的藝術(shù):Dropbox 的故事
GPU 加速下的圖像視覺(jué)
Artsy
照片擴(kuò)展
理解 Scroll Views
使用 VIPER 構(gòu)建 iOS 應(yīng)用
Android 中的 SQLite 數(shù)據(jù)庫(kù)支持
Fetch 請(qǐng)求
導(dǎo)入大數(shù)據(jù)集
iOS 開(kāi)發(fā)者的 Android 第一課
iOS 上的相機(jī)捕捉
語(yǔ)言標(biāo)簽
同步案例學(xué)習(xí)
依賴(lài)注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識(shí)別
玩轉(zhuǎn)字符串
相機(jī)工作原理
Build 過(guò)程

相機(jī)工作原理

輕輕一按,你的相機(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ī)到底是如何工作的。

快門(mén)速度,感光度 (ISO),光圈

在我們深入將光子轉(zhuǎn)換為 JPEG 文件之前,我們先來(lái)看看相片的一些基本概念。這些概念不僅在過(guò)去的膠卷攝影時(shí)有效,在今天也是同樣的。在不久之前,幾乎所有的攝影都是通過(guò)膠卷完成的。與今天使用數(shù)碼感光器不同,那時(shí)候成像依賴(lài)的是受光照影響的生化反應(yīng)。但因?yàn)樵谂臄z相片中其他所有東西都遵循同樣的原則,所以對(duì)笨重的膠卷相機(jī)和膠卷攝影適用的規(guī)律一樣會(huì)在使用 iPhone 拍攝時(shí)適用。

進(jìn)光量

拍攝一張相片的過(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)完全丟失了。

曝光檔數(shù)

有三個(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ì)研究下:

快門(mén)速度

當(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)

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 的光圈大小。

結(jié)合起來(lái)

在 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 了。

對(duì)焦

相機(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é)焦距。

光學(xué)組件

相機(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è)典型的例子。

光滿(mǎn)四溢

現(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à),它的值所受到的影響也就越大。

快門(mén)

膠卷相機(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ò)是顏色的另一種叫法而已。

視覺(jué)感知

如果說(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ì)立維度uv (有時(shí)候也被叫做 ab)。

更多信息請(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ī)是怎么看到這些顏色的了。

數(shù)碼顏色傳感器

像素傳感器自身并不會(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)確信息,從而圖像模糊。

缺陷補(bǔ)償

除了重建顏色信息,相機(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 的部分。

結(jié)語(yǔ)

我們今天使用的數(shù)碼相機(jī)是數(shù)十年研究和工程的結(jié)晶。我們?cè)谶@篇文章里勉強(qiáng)勾勒了它所使用到的科技的輪廓。通過(guò)這篇文章,我們希望你能夠更了解你的 (iPhone) 相機(jī)... 以及為 iOS 和 OSX 制作出更好的相片 app。