Camera圖像處理原理及實例分析
作者:劉旭暉 colorant@163.com 轉載請注明出處
BLOG:http://blog.csdn.net/colorant/
主頁:http://rgbbones.googlepages.com/
做為拍照手機的核心模塊之一,camera sensor 效果的調整,涉及到眾多的參數,如果對基本的光學原理及 sensor 軟/硬件對圖像處理的原理能有深入的理解和把握的話,對我們的工作將會起到事半功倍的效果。否則,缺乏了理論的指導,只能是憑感覺和經驗去碰,往往無法准確的把握問題的關鍵,不能掌握 sensor 調試的核心技術,無法根本的解決問題。
1.1 色彩感應及校正
1.1.1 原理
人眼對色彩的識別,是基於人眼對光譜存在三種不同的感應單元,不同的感應單元對不同波段的光有不同的響應曲線的原理,通過大腦的合成得到色彩的感知。 一般來說,我們可以通俗的用 RGB三基色的概念來理解顏色的分解和合成。
理論上,如果人眼和 sensor 對光譜的色光的響應,在光譜上的體現如下的話,基本上對三色光的響應,相互之間不會發生影響,沒有所謂的交叉效應。
但是,實際情況並沒有如此理想,下圖表示了人眼的三色感應系統對光譜的響應情況。可見 RGB的響應並不是完全獨立的。
下圖則表示了 Kodak 某相機光譜的響應。可見其與人眼的響應曲線有較大的區別。
1.1.2 對 sensor的色彩感應的校正
既然我們已經看到 sensor 對光譜的響應,在 RGB各分量上與人眼對光譜的響應通常是有偏差的,當然就需要對其進行校正。不光是在交叉效應上,同樣對色彩各分量的響應強度也需要校正。通常的做法是通過一個色彩校正矩陣對顏色進行一次校正。
該色彩校正的運算通常由 ISP 完成,軟件通過修改相關寄存器得到正確的校正結果。值得注意的一點是,由於 RGB -> YUV的轉換也是通過一個 3*3 的變換矩陣來實現的,所以有時候這兩個矩陣在 ISP 處理的過程中會合並在一起, 通過一次矩陣運算操作完成色彩的校正和顏色空間的轉換。
1.2 顏色空間
1.2.1 分類
實際上顏色的描述是非常復雜的,比如 RGB三基色加光系統就不能涵蓋所有可能的顏色,出於各種色彩表達,以及色彩變換和軟硬件應用的需求,存在各種各樣的顏色模型及色彩空間的表達方式。這些顏色模型,根據不同的划分標准,可以按不同的原則划分為不同的類別。
對於 sensor 來說,我們經常接觸到的色彩空間的概念,主要是 RGB , YUV這兩種(實際上, 這兩種體系包含了許多種不同的顏色表達方式和模型, 如 sRGB, Adobe RGB, YUV422, YUV420 …) , RGB如前所述就是按三基色加光系統的原理來描述顏色, 而YUV則是按照 亮度,色差的原理來描述顏色。
1.2.1.1 RGB <-> YUV的轉換
不比其它顏色空間的轉換有一個標准的轉換公式,因為 YUV在很大程度上是與硬件相
關的,所以 RGB與 YUV的轉換公式通常會多個版本,略有不同。
常見的公式如下
PAL 制:
Y=0.299R+0.587G+0.114B
U=0.493(B-Y) = -0.15R-0.29G+0.44B
V=0.877(R-Y) = 0.62R-0.52G-0.10B
此外,還有,NTSC制:
但是這樣獲得的 YUV值存在着負值以及取值范圍上下限之差不為 255 等等問題,不利於計算機處理,所以根據不同的理解和需求,通常在軟件處理中會用到各種不同的變形的公式 :
體現在 Sensor 上,我們也會發現有些 Sensor 可以設置 YUV 的輸出取值范圍。原因就在於此。 從公式中,我們關鍵要理解的一點是,UV 信號實際上就是藍色差信號和紅色差信號,進而言之,實際上一定程度上間接的代表了藍色和紅色的強度,理解這一點對於我們理解各種顏色變換處理的過程會有很大的幫助。
1.3 白平衡
1.3.1 色溫
色溫的定義:將黑體從絕對零度開始加溫,溫度每升高一度稱為 1 開氏度(用字母 K來表示),當溫度升高到一定程度時候,黑體便輻射出可見光,其光譜成份以及給人的感覺也會着溫度的不斷升高發生相應的變化。於是,就把黑體輻射一定色光的溫度定為發射相同色光光源的色溫。
隨着色溫的升高,光源的顏色由暖色向冷色過渡,光源中的能量分布也由紅光端向藍光端偏移。
值得注意的是,實際光源的光譜分布各不相同,而色溫只是代表了能量的偏重程度,並不反映具體的光譜分布,所以即使相同色溫的光源,也可能引起不同的色彩反應。 人眼及大腦對色溫有一定的生理和心理的自適應性, 所以看到的顏色受色溫偏移的影響較小,而 camera的 sersor 沒有這種能力,所以拍出來的照片不經過白平衡處理的話,和人眼看到的顏色會有較大的偏差(雖然人眼看到的和白光下真實的色彩也有偏差)。
太陽光色溫隨天氣和時間變化的原因,與不同頻率光的折射率有關:
波長長的光線,折射率小,透射能力強,波長短的光線,折射率大,容易被散射,折射率低,這也就是為什么交通燈用紅色,防霧燈通常是黃色,天空為什么是藍色的等等現象的原因。
知道了這一點,太陽光色溫變化的規律和原因也就可以理解和分析了,留給大家自己思考。
1.3.2 色溫變化時的色彩校正
所以從理論上可以看出,隨着色溫的升高,要對色溫進行較正,否則,物體在這樣的光線條件下所表現出來的顏色就會偏離其正常的顏色,因此需要降低 sensor 對紅色的增益,增加 sersor 對藍光的增益。 同時在調整參數時一定程度上要考慮到整體亮度的要保持大致的不變,即以 YUV 來衡量時,Y 值要基本保持不變,理論上認為可以參考 RGB->YUV 變換公式中,RGB三分量對 Y值的貢獻,從而確定 RGAIN 和 BGAIN 的變化的比例關系。但實際情況比這還要復雜一些,要考慮到不同 sensor 對 R,B的感光的交叉影響和非線性,所以最佳值可能和理論值會有一些偏差。
1.3.3 自動白平衡原理
1.3.3.1 原理
自動白平衡是基於假設場景的色彩的平均值落在一個特定的范圍內, 如果測量得到結果偏離該范圍,則調整對應參數,校正直到其均值落入指定范圍。該處理過程可能基於 YUV空間,也可能基於 RGB空間來進行。對於 Sensor 來說,通常的處理方式是通過校正 R/B增益,使得 UV值落在一個指定的范圍內。從而實現自動白平衡。
1.3.3.2 特殊情況的處理
在自動白平衡中,容易遇到的問題是,如果拍攝的場景,排除光線色溫的影響,其本身顏色就是偏離平均顏色值的,比如大面積的偏向某種顏色的圖案如:草地,紅旗,藍天等等,這時候,強制白平衡將其平均顏色調整到灰色附近,圖像顏色就會嚴重失真。
因此,通常的做法是:在處理自動白平衡時,除了做為目標結果的預期顏色范圍外,另外再設置一對源圖像的顏色范圍闕值,如果未經處理的圖像其顏色均值超出了該闕值的話,根本就不對其做自動白平衡處理。由此保證了上述特殊情況的正確處理。
可見,這兩對闕值的確定對於自動白平衡的效果起着關鍵性的作用。
1.3.4 某代碼的例子
可以看到隨着色溫的升高,其變化規律基本符合上節中的理論分析。不過這里多數參數與理論值都有一些偏差,其中日光燈的色溫參數設置與理論值有較大的偏差,實際效果也證明該日光燈的參數設置使得在家用日光燈環境下拍攝得到的照片顏色偏藍。 修改其參數后實拍效果明顯改善。(再查一些資料可以看到通常會有兩種熒光燈色溫 4000 和 5000K,目前我所接觸到的應該是 5000K居多)。
1.3.5 調試和驗證
具體參數的調整,應該在燈箱環境下,使用各種已知色溫的標准光源對標准色卡拍攝,在 Pc 機上由取色工具測量得到其與標准色板的 RGB分量上的色彩偏差,相應的調整各分量增益的比例關系。為了更精確的得到結果,曝光量增益的設置在此之前應該相對准確的校正過。
1.4 顏色相關特效處理
1.4.1 grayscale (灰階)
灰階圖的效果就是將彩色圖片轉換為黑白圖片。
1.4.1.1 理論
理論上,在 YUV空間,將 UV分量丟棄,只保留 Y分量,這樣就可以得到黑白圖像,這也是彩色電式機信號能兼容黑白電視機的原理。如下圖理論上 Y 值一樣的顏色(右邊是用 acdsee 轉成灰度圖的效果),在 grayscale 模式下看應該是一樣的顏色。
算法上的操作,理論上應該把 UV值改成灰色對應數值就可以了。不過根據軟件算法和硬件結構的不同,具體代碼也會有不同。
1.4.2 sepia / sepiagreen / sepiablue
某平台手機上所謂的復古(綠,藍)就是在灰階的基礎上,對 UV值做了一個 offset,將灰度圖轉換成某種顏色的梯度圖。理論上為了獲得藍色效果,應該增加藍色差信號,減小紅色差信號。即增大 U,減小 V。
以 sepiablue 效果為例,這里的字節的 MSB表示符號位:所以 88 為 88,158 為-30。
SET_HUE_U_GAIN(0);
SET_HUE_V_GAIN(0);
SET_HUE_U_OFFSET(88);
SET_HUE_V_OFFSET(158);
1.4.3 negative
所謂負片效果,就是將圖像的顏色反轉,看起來就像是在看膠片底片時的效果。這從理論上也很容易理解和處理,就是在 RGB空間,取其補色,具體的操作就是用 255 分別減去RGB得到新的 RGB值。通常會在 ISP 中實現該功能。
理解了原理,要做出其它顏色變換方面的效果就很容易了。 基本上,在顏色校正和處理方面,需要考慮的相關參數大致包括:
自動 WB 上下限,自動白平衡時的目標范圍,RGB gain, UV gain, UV offset, color correction.有些還會有saturation 和 hue 相關的設置。
從 sensor 或 ISP 硬件處理的流程上說, 通常方向是先做 RGB gain, 再做 color correction,最后做 YUV空間的處理。所以調整效果的時候,為了減少參數之間的相互影響,基本上也可以按這個順序來調整參數。
1.5 亮度感應及曝光
1.5.1 感光寬容度
從最明亮到最黑暗,假設人眼能夠看到一定的范圍,那么膠片(或 CCD 等電子感光器件)所能表現的遠比人眼看到的范圍小的多,而這個有限的范圍就是感光寬容度。
人眼的感光寬容度比膠片要高很多,而膠片的感光寬容度要比數碼相機的 ccd 高出很多!了解這個概念之后,我們就不難了解,為什么在逆光的條件下,人眼能看清背光的建築物以及耀眼的天空雲彩。而一旦拍攝出來,要么就是雲彩顏色絢爛而建築物變成了黑糊糊的剪影,要么就是建築物色彩細節清楚而原本美麗的雲彩卻成了白色的一片。
再看人眼的結構,有瞳孔可以控制通光量,有桿狀感光細胞和椎狀感光細胞以適應不同的光強,可見即使人眼有着很高的感光寬容度,依然有亮度調節系統,以適應光強變化。
那么對於 camera sensor 來說,正確的曝光就更為重要了!
1.5.2 自動曝光和18%灰
對於 sensor 來說,又是如何來判斷曝光是否正確呢?很標准的做法就是在 YUV空間計算當前圖像的 Y值的均值。調節各種曝光參數設定(自動或手動),使得該均值落在一個目標值附近的時候,就認為得到了正確的曝光。
那么如何確定這個 Y的均值,以及如何調整參數使得sensor 能夠將當前圖像的亮度調整到這個范圍呢?
這就涉及到一個概念 18%灰,一般認為室內室外的景物,在通常的情況下,其平均的反光系數大約為 18%,而色彩均值,如前所述,可以認為是一種中灰的色調。這樣,可以通過對反光率為 18%的灰板拍攝,調整曝光參數,使其顏色接近為中等亮度的灰色(Y 值為 128)。然后,對於通常的景物,就能自動的得到正確的曝光了。
當然這種自動判斷曝光參數的 AE 功能不是萬能的,對於反光率偏離通常均值的場景,比如雪景,夜景等,用這種方法就無法得到正確的曝光量了。所以在 sensor 的軟件處理模塊中,通常還會提供曝光級別的設定功能,強制改變自動曝光的判斷標准。比如改變預期的亮度均值等。
1.5.3 曝光級別設定
在多數數碼相機和拍照手機上都可以看到曝光級別設定的功能,如前所述,這種設定實際上是在自動曝光的基礎上給用戶提供一定的曝光控制能力,強制改變 camera sensor 的曝光判斷標准,獲得用戶想要的效果。
通常的做法就是改變 Y值均值的預期值,使得 sensor 在自動曝光時以新的 Y預期值為目標,自動調整 Exptime 和 AG。
1.5.4 gamma 校正
曝光的均值正確了,不代表整體圖像的亮度分布就和人眼所看到的保持一致了。
事實上,人眼對亮度的響應並不是一個線性的比例關系,而各種涉及到光電轉換的設備的輸入輸出特性曲線一般也是非線性的,且表現為冪函數的形式:y=xn , 所以整個圖系統的傳遞函數是一個冪函數:g= g1×g2×…×gn 。
對於 sensor 來說,其響應倒是接近為線性關系,所以為了在各種設備上正確輸出符合人眼對亮度的響應的圖像,就需要進行校正。
冪函數的指數的倒數就是通常所說的 gamma 值。
校正的函數可以表示為 ,通常對於 Window 的輸出顯示系統,gamma 值為 2.2,而對於蘋果的輸出顯示系統和打印系統來說,gamma 值為 1.8。
實際上,sensor 在做 gamma 校正的時候,通常也一並作了從raw 格式的 10bit 的數據到8bit 數據的轉換,所以這時候的公式可以表示為 。
由於指數運算需要消耗大量的 CPU時間,所以實際的做法,往往是將 gamma 曲線用比如 12 段線段進行擬合。這樣只需要保存 13 個點的數據,用線性變換或查表的方式進行gamma 校正。我司多數平台的 gamma 校正就是采用了后者的方法。要調整 gamma 校正實際上也就是調整這 13 個點的數值。
原則上,在拍攝如下圖灰階的色板時,能分辨出的級數越多越好。
1.5.5 對比度
對比度的調整在一定程度上說,其實也就是對 gamma 曲線的調整,增大對比度就是提高 Gamma 值。對於圖像處理來說,也有在硬件 gamma 校正后,單獨由軟件再進行一次類似的冪函數變換來調整對比度。 、
1.5.6 曝光參數的調整
曝光強度的調整,可以通過改變曝光時間,也可以通過改變亮度增益 AG 來實現。
曝光時間受到幀頻的限制,比如攝像時要求 15 幀每秒的話,這時候曝光時間最長就不能超過 1/15s,可能還有別的條件限制,實際的曝光時間還要短,在光線弱的情況下,單獨調整曝光時間就無法滿足幀頻的需要了。
這時候還可以調整增益 AG,來控制曝光的增益,降低曝光時間。但是,這樣做的缺點是以犧牲圖像質量為代價的,AG 的增強,伴隨的必然是信噪比的降低,圖像噪聲的增強。
所以,以圖像質量為優先考慮的時候,曝光參數的調節通常是優先考慮調節曝光時間,其次在考慮曝光增益。當然曝光時間也不能過長以免由於抖動造成圖像的模糊,而在拍攝運動場景時,對曝光時間的要求就更高了。
1.6 抗噪處理
AG 的增大,不可避免的帶來噪點的增多,此外,如果光線較暗,曝光時間過長,也會增加噪點的數目(從數碼相機上看,主要是因為長時間曝光,感光元件溫度升高,電流噪聲造成感光元件噪點的增多),而感光元件本身的缺陷也是噪點甚至壞點的來源之一。因此,通常 sensor 集成或后端的 ISP 都帶有降噪功能的相關設置。
1.6.1 啟動時機
根據噪點形成的原因,主要是 AG 或 Exptime 超過一定值后需要啟動降噪功能,因此通常需要確定這兩個參數的闕值,過小和過大都不好。
從下面的降噪處理的辦法將會看到,降噪勢附帶的帶來圖像質量的下降,所以過早啟動降噪功能, 在不必要的情況下做降噪處理不但增加處理器或 ISP 的負擔, 還有可能適得其反。而過遲啟動降噪功能,則在原本需要它的時候,起不到相應的作用。
1.6.2 判定原則和處理方式
那么如何判定一個點是否是噪點呢?我們從人是如何識別噪點的開始討論, 對於人眼來說,判定一個點是噪點,無外乎就是這一點的亮度或顏色與邊上大部分的點差異過大。從噪點產生的機制來說,顏色的異常應該是總是伴隨着亮度的異常,而且對亮度異常的處理工作量比顏色異常要小,所以通常 sensor ISP 的判定原則是一個點的亮度與周圍點的亮度的差值大於一個闕值的時候,就認為該點是一個噪點。
處理的方式,通常是對周圍的點取均值來替代原先的值,這種做法並不增加信息量,類似於一個模糊算法。
對於高端的數碼相機,擁有較強的圖像處理芯片,在判定和處理方面是否有更復雜的算法,估計也是有可能的。比如亮度和顏色綜合作為標准來判定噪點,采用運算量更大的插值算法做補償,對於 sensor 固有的壞點,噪點,采用屏蔽的方式拋棄其數據(Nikon 就是這么做的,其它廠商應該也如此)等等。
1.6.3 效果
對於手機 sensor 來說,這種降噪處理的作用有多大,筆者個人認為應該很有限,畢竟相對數碼相機,手機 sensor 的鏡頭太小,通光量小,所以其基准 AG 勢必就比相機的增益要大(比如相當於普通家用數碼相機 ISO800 的水平),這樣才能獲得同樣的亮度,所以電流噪聲帶來的影響也就要大得多。這樣一來,即使最佳情況,噪點也會很多,數據本身的波動就很大,這也就造成我們在手機照片上勢必會看到的密密麻麻的花點,如果全部做平均,降低了噪點的同時,圖像也會變得模糊,所以手機噪點的判斷闕值會設得比較高,以免涉及面過大,模糊了整體圖像。這樣一來一是數據本身就差,二是降噪的標准也降低了,造成總體效果不佳。
1.7 數碼變焦
數碼變焦可以有兩種形式:
其一,是通過插值算法,對圖像進行插值運算,將圖像的尺寸擴大到所需的規格,這種算法就其效果而言,並不理想,尤其是當使用在手機上的時候,手機上的攝像頭本身得到的數據就有較大的噪聲,再插值的話,得到的圖像幾乎沒法使用。實際上,即使是數碼相機的數碼變焦功能也沒有太大的實用價值。如果插值算法沒有硬件支持,則需要在應用層實現。我司某平台的數碼變焦用的就是該種辦法。
其二,其實是一種偽數碼變焦的形式,當攝像頭不處在最大分辨率格式的情況下,比如130 萬像素的 sensor 使用 640*480 的規格拍照時,仍舊設置 sersor 工作在 1280*960 的分辨率下,而后通過采集中央部分的圖像來獲取 640*480 的照片,使得在手機上看來所拍物體尺寸被放大了一倍。也有很多手機采用的是這種數碼變焦方式,這種辦法幾乎不需要額外的算法支持,對圖像質量也沒有影響,缺點是只有小尺寸情況下可以采用。此外在 DV方式下也可以實現所謂的數碼變焦放大拍攝功能。(這應該是一個賣點,對 Dv 來說,這種數碼變焦還是有實際意義的)。
要采用這種變焦模式,驅動需要支持 windowing 功能,獲取所需部分的 sensor 圖像數據。
1.8 頻閃抑制功能
1.8.1 何謂頻閃
日常使用的普通光源如白熾燈、日光燈、石英燈等都是直接用 220/50Hz 交流電工作,每秒鍾內正負半周各變化 50 次,因而導致燈光在1 秒鍾內發生 100(50×2)次的閃爍,再加上市電電壓的不穩定,燈光忽明忽暗,這樣就產生了所謂的“頻閃” 。
下表顯示了幾種光源的光強波動情況:
因為人眼對光強變化有一定的遲滯和適應性,所以通常看不出光源的亮度變化。但是依然還是會增加眼睛的疲勞程度。所以市場上才會有所謂的無頻閃燈銷售。
1.8.2 對頻閃的抑制
對於 camera sensor 來說,沒有人眼的遲滯和適應過程,所以對光源亮度的變化是比較敏感的。如果不加抑制,在預覽和 DV模式下,可能會有明顯的圖像的明亮變化閃爍的現象發生。
如何解決呢?考慮到頻閃的周期性,在一個周期內,光源亮度的累積值,應該是大體一致的,所以,如果控制曝光的時間是頻閃周期的整倍數,那么每一幀圖像的亮度就大體是一致的了,這樣就可以有效地抑制頻閃對圖像亮度的影響。
所以,在自動曝光的模式下,sensor 會根據頻閃的頻率,調整曝光時間為其周期的整倍數。 因為各地的交流電的頻率不同,所以有 50Hz/60Hz 之分。
在具體設置相關 Sensor 寄存器的時候,要根據電流頻率和 sensor 的時鍾頻率,分辨率等,計算出頻閃周期對應的時鍾周期數等。