Bayer濾鏡如何轉換顏色?
Bayer模式是顏色模式,被廣泛應用於CCD和CMOS攝像頭。相機使用了拜耳濾鏡,分別過濾得到紅綠藍三種顏色。既然要得到的是紅綠藍頻段光線的強度,要通過的就是紅綠藍光,就反射了其他頻段的光線。
比如說紅色濾鏡應該是 反射 了除去紅色那一個波段的其他光。這里有一個疑問:它是 保留 了人眼可見的感覺是紅的500–700nm波長的光可以通過,還是保留那個特定的人眼反應是最紅的那個波長可以通過?
因為這好像涉及到復合光(即自然界的各種波長的光疊加)與單純的RGB(即只有特定那個顏色頻率的光,只改變光強疊加出來的光)的轉換問題。雖然所有他們可以表示的顏色看起來是不差的(即可以用RGB表示看到的幾乎所有復合光的一樣的顏色),可是怎么把看起來是某一顏色的自然復合光不差地轉換為看起來顏色一樣的RGB數值呢?只要看起來是最紅的那個波長的光就可以了嗎?還是只要有點紅的都要。這怎么取舍?取舍之后拍出來照片的顏色是在一定范圍內人眼看不出來,但和實際看到的自然色應該是有誤差的。
如果是反射其他波長的光那么RGB濾鏡看起來是青色(0, 255, 255),紫色(255, 0, 255),黃色(255, 255 ,0)這三個顏色,而非示意圖上的紅綠藍。
因為人眼三種視錐細胞對波長的響應是有重疊的部分的。它反射了其余波長的光看起來到底會是什么顏色的?
RGB Bayer Color分析
Bayer色彩濾波陣列
拜耳色彩濾波陣列(Bayer Color Filter Array,CFA)是非常有名的彩色圖片的數字采集格式。色彩濾波器的模式如上圖所示,由一半的G,1/4的R,1/4的B組成。
拜耳色彩濾波器的模式、序列、濾波器有很多種,但最常見的模式是由Kodak提出的2*2模式。
當Image Sensor往外逐行輸出數據時,像素的序列為GRGRGR.../BGBGBG...(順序RGB)。這樣陣列的Sensor設計,使得RGB傳感器減少到了全色傳感器的1/3,如下所示。
圖像傳感器的結構如下所示,每一個感光像素之間都有金屬隔離層,光纖通過顯微鏡頭,在色彩濾波器過濾之后,投射到相應的漏洞式硅的感光元件上。
白平衡調節(White Balance)
色彩傳感器並不能像人眼那樣直接感應圖像,因此為了保證最終圖像的真實性,必須經過一些白平衡處理以及色彩校正等算法來修正圖像。
原始像素的第一步處理操作就是白平衡調節。一個白色物體每通道的白平衡都應該是相同的,即R=G=B。通過白色物體的采集以及直方圖分析,擁有最高級別白平衡的通道被作為目標通道,而其他兩個通道通過增益達到匹配,如下:R'=aG'=bB'。同時,隨着光源的不同,白平衡也應該相應的調節。
Bayer插值補償算法(Bayer Interpolation)
1) 插值紅藍算法實現
每一個像素僅僅包括了光譜的一部分,必須通過插值來實現每個像素的RGB值。為了從Bayer格式得到每個像素的RGB格式,需要通過插值填補缺失的2個色彩。插值的方法有很多(包括領域、線性、3*3等),速度與質量權衡,最好的線性插值補償算法。其中算法如下:
R和B通過線性領域插值,但這有四種不同的分布,如下圖所示:
在(a)與(b)中,R和B分別取領域的平均值。
2) 插值綠算法實現
在(c)與(d)中,取領域的4個B或R的均值作為中間像素的B值。
由於人眼對綠光反應最敏感,對紫光和紅光則反應較弱,因此為了達到更好的畫質,需要對G特殊照顧。在上述(c)與(d)中,擴展開來就是上圖的(e)與(f)中間像素G的取值,者也有一定的算法要求,不同的算法效果上會有差異。經過相關的研究,(e)中間像素G值的算法如下:
(f)中間像素G值的算法如下:
CMOS攝像頭這部分轉換是在內部用ADC或者ISP完成的,生產商為了降低成本必然會使得圖像失真。當然用外部處理器來實現轉換,如果處理器的速度足夠NB,能夠勝任像素的操作,用上面的算法來進行轉換。不過上述算法將直接成倍提高了算法的復雜度,速度上將會有所限制。因此為了速度的提成,可以直接通過來4領域G取均值來中間像素的G值,將會降低一倍的速率,而在性能上差之甚微,算法如下:
如果能夠通過損失圖像的額質量,來達到更快的速度,還可以取G1、G2的均值來實現,但是這樣的做法會導致邊沿以及跳變部分的失真。
從一個單獨平面中得到彩色圖像,該平面的R/G/B像素點如下表所示安排。
對像素輸出的RGB分量由該像素的1、2或者4鄰域中具有相同顏色的點插值得到。Bayer模式可以通過向左或向上平移一個像素點來進行一些修改。比如說,Bayer模式具有很流行的BG類型。
實際上不明白用RGB來表示可見顏色以后。RGB的三個分量的疊加關系是線性疊加。那么對RGB應用數值變換,比如說減去紅分量一個數。
CFA的濾過波段不是完美的單一波長的,其實很希望能這樣做,因為這樣的話各通道分離度越高,對色彩的還原就會越准確。而這個現象反向的話,最極端的結果就是黑白傳感器,不能獲得任何有效的色彩信息。
CFA的波長透過曲線各個CIS(CMOS Image Sensor)各不相同,這也是拍攝出來圖像的色彩表現的一個重要影響因素,比如大家一直說的SONY的色彩表現不佳,這個問題和CFA的性能是絕對離不開的。
比如,CFA透過曲線,就是一個很典型的例子,通過提高RGB分離度來獲得更高的色准。
RYYB這種排列,就會導致色彩反算的准確度降低。
CFA的取舍非常重要,這個也算是各個廠商一直在各種攻關的一點了。
拍到的照片的顏色和實際顏色差別是很大的。這個需要通過色彩管理來實現,如何獲取XYZ坐標,如何向RGB空間映射,這些展開的話就太多了。
然后是第二問,CFA不是反射無法透過的光,是吸收無法透過的光,所以理論上完美的CFA應該是黑的,不過實際上大家都知道不存在這種完美材料,基本顏色就是和CFA像素對應的顏色看起來是一致的。
然后其實你的最后一個問題是很好的,如果把拍照看作一個圖像信息獲取的過程的話,其實是非常希望得到全光譜數據而不是單單的RGB數據的。比如微軟就做過類似的工作。
這個例子里,對RGB的數值進行變換,本質上是加權減去一部分光譜能量的。但不能從RGB的圖片中提取出原始的光譜信息,因為從光譜到RGB的這個映射過程實際上已經把那些數據都拍平了,是一種“降維打擊”。
CFA根據techinsight的報告,拍下來看就是紅藍綠的顏色。