Raw Camera的工作流程(Pipeline)



Raw Camera的工作過程

文章說明

這只是一篇備忘文章,防止在時間的沖刷下忘掉這些基礎知識。

二格式說明

2.1 Bayer pattern

         我們當前所有的數字化的Camera,都要感謝Bryce E.Bayer。是他開創了當前色彩繽紛包羅萬象的數字圖像傳感器的先河。是他最先想到的用Color Filter的方式來獲取現實世界的彩色投影(來自維基百科)。這些紅、綠、藍色是蓋在感光三極管上面的,作用就是將環境光分離出三個顏色來。如圖這個filter Pattern叫做GBRG,這個順序很關鍵,Demosaic的時候需要重點用到。

 

Bayer_matrix.svg.png

2.2 RAW格式

         RAW是一種原始數據的格式,就是說,基本上保留了圖像形成時的樣子。當然,爲了最大化利用存儲空間以及MIPI傳輸方便,這裏做了一些數據穿插的小動作。比如說,這是RAW10格式的圖片,RAW10意味着AD用的是10bits精度,所以一個Pixel得到的數據是10bits。存儲/傳輸的時候,一般會採用16Bytes存儲12Pixels的方式。RAW圖是沒有顏色的,因爲它只是感光三極管將環境光轉化成模擬電壓然後經過AD數字化的東西。

題外話:RAW圖的大小怎麼計算的?

我們來看下一個13M3120*4208)的圖像的大小,17,,612,800字節。但是按照3120*4208*10/8來計算也僅僅是16,411,200字節,缺失的大小存儲的是什麼呢?^-^ 這裏面涉及到三個方面,一是圖像寬度的16字節對齊,二是圖像高度的64行對齊,三是圖像尺寸的4K對齊。這樣計算出來的值如下:

 

實際的圖片大小:

一個字節都不少,我喜歡這個有邏輯有確定結果的世界。

底電流

         也叫暗電流。意思是說環境全黑的時候的電流。因爲當前三極管的製造工藝,決定了這個東西肯定會存在。從這幅標有三極管內部無源寄生器件的圖上能看到內部有多個寄生電容存在,這會導致在輸入爲0的情況下,輸出會有一個小電壓存在,這些電容充電的過程中還會有一些電流產生。這些先按下不表,因爲這些三極管的基礎知識要寫完最少兩張A4紙。

 

tras.png

         暗電流表現在圖像上是什麼樣子的呢?我們拍攝了一張全黑環境下的RAW圖,如下可以看到上面有很多亮度不一的點,這就是暗電流的圖像。這裏面會夾雜着一些壞點,過會會看到。

         當然,這樣看起來可能不是太直觀,我們將其轉化到三維上面看下,可以看出來,絕大部分的像素值在8左右,理想三極管應該是0的。

         我們將整幀圖像減去一個暗電流的數值(均值是14.8,就會看到圖像乾淨了很多。這上面的那些凸起來的點我認爲就是壞點了。從這兩幅對比圖上來看,去除暗電流可以減掉底噪聲,但是也不能去除太多,過大的設置底電流值會導致圖像信息丟失;過小的話圖片會整體偏白並且噪聲過高。

壞點和降噪

         通過底電流後,我們發現有一些像素會比較個性,這時候我們首先要找出來這些像素,標記爲壞點,在我的程序中是使用拉普拉斯算子找到這些壞點的。在RAW空間內,降噪不可以太多。首先,因爲這是在時域空間,可以採用的降噪手法很有限;其次,RAW圖上時域空間降噪會對後續的pipeline影響深遠。從信息量上來說,前端損失的信息量越大,後續的處理就越難,所以一般會前端以保持信息爲主。降噪現在還是主要依靠頻域處理,感謝傅里葉。壞點一般分爲冷點和熱點。真正的壞點永遠是壞點,我們標記出來就好了。怕的是有一些點平時表現不錯,Sensor溫度高一些後就變壞了,那我們只能降溫和降噪了。不確定性,真可怕。

filter =

[

    0    -1     0

   -1     4    -1

    0    -1     0

];

經過濾波器後,我們可以看到這些壞點已經被標記出來,以前是將壞點位置直接存儲下來,以後該點的數據不採用,直接周邊均值補上。

然後使用原圖上週邊同Color Filter的像素補充這個位置。我們可以看到經過去除壞點後,RAW圖像上面異常像素的數目降到了2個(4208*3120),並且這兩個異常像素的數值最大是3.

Rolloff

         lensshading是由於透鏡成像的原理決定的,所以在很長一段時間裏這個東西也會一直存在,只是會逐漸的弱化。我們來看下什麼是lens shading

 

         肉眼能明顯看到中間亮四周暗。反映到三維圖像上是這樣子的:

         ColorShading指的是這四個channel的雞蛋殼不重合,所以周邊會有偏色,但是經過rolloff補償後,就一致了。

         我們按照這個形狀給他一個反向的增益,將其補平,但是補充的太平也不好,因爲周邊信息量本來就小,這裏的補平僅僅是數字上的放大,相當於數字增益,若是調整過大,會導致四周噪聲嚴重,(原始兩個Pixel之間差異是1,肉眼不可區分;放大十倍,變成了10,我看見了)。使用的增益如下圖所示:

 

然後補充完成的圖像如下:

仔細看四角,能看到好多小顆粒噪聲,這就是補償過高(100%)的後果;所以一般會採用70% ~ 80%的補償目標,這樣可以在肉眼可接受的shading區間內尋找到噪聲的最佳平衡點。以前有一個很牛很牛的人說,Tuning其實就是Balance,不懂Balance的產品經理不是好人。

Demosaic

         我們補完的圖像其實還是RAW空間,需要進行Demosaic將其轉化爲RGB空間內。這一步我現在用的是非向量轉換方式,太挫了,正在找相應的轉換矩陣......你看數學多麼重要...... 之前的經驗告訴我,向量化的運算相較於這種指針方式的運算速度會提升十倍以上。     我們有四個channel,分別是BGbGrRDemosaic我採用的是4鄰域方式,就是參考周邊四個相同Color Filter的像素信息來補全當前的數據。這一塊實在是寫的太挫了,我實在是不好意思在這塊BB了。計算方式如下:

白平衡參考點運算

         我們選取圖像的一部分,當然也可以是全部的像素值,認爲他是灰度的。然後根據反向補平原理,算出他的增益來。

         我們選取位置如下:

Rg =

 

   1.3895

 

 

Bg =

 

   1.6336

然後將增益作用到RGB空間的圖像上,得到如下圖,可以看到白色正了。整體圖像的顏色也不是那麼綠了。

Gamma調整

我認爲Gamma是一個一一對應的變換表,輸入像素值經過查表(可以有三張表,RGB)得到輸出值。維基百科的定義見鏈接。這個表很重要,因爲它直接關係到圖像的動態範圍。下面的三幅圖,分別是兩條Gamma曲線,和對應的效果圖。可以明顯看到,當Gamma在暗區較高(高於1:1直線很多)的時候,圖像整體會偏白。

Ps:題外話,Gamma是作用在RAW空間的。而RAW空間是很暗的,極其特別的情況最亮部分的亮度(拍太陽)會高於200。所以絕大部分的時候我們用到的是Gamma曲線的中下部分,這一塊很關鍵,在調試的時候,要重點進行這一塊的修改。至於200以上的部分就要看實際的需求了。

CC校準

Color Correction這一步,最主要的目的是將顏色還原到最接近真實的情況。所以在我的工具中首先會選定色卡區域,然後將24的顏色塊切出來進行均值計算,得到一個6*4的矩陣。色卡是有標準值的:        

我們校準的時候,得到的其實是一個3*3矩陣,他的作用就是將RGB進行變換。

[1 3] * [3 3 ] = [3 1];[3 1]' = [1 3];

剩下的工作就是將矩陣進行迭代,計算色卡,迭代尋找最小的色差。就固定下來。

Color Correction

         這一步我們會用到CC校準中得到的3*3的轉換矩陣,類似這個樣子:

 

color_correction =

[

   1.3000   -0.1500   -0.1500

  -0.1500    1.3000   -0.1500

  -0.1500   -0.1500    1.3000

];

         按照矩陣乘法規則,這樣乘完後,對應的RGB都會增加30%,飽和度會提升,但是色彩沒有轉換。這個矩陣僅僅是示例。

 

十一 Up Luma

         爲了觀看方便並且更加接近實際的相機顯示效果,我們在這裏將亮度進行一個提升。我們的目標是將最亮色塊(白塊19)提升到200

這樣圖像的亮度就上來了,更加接近數字增益生效後的效果。

十二 Color Conversion

         在保證了顏色的準確性後,我們需要按照產品定義將顏色的飽和度和色彩傾向做個調整。這兩個目的在YUV空間是最容易做的,當然,要是僅僅調整飽和度的話,我個人認爲在HSV空間最合適。這裏面就涉及到一個RGB2YUV的轉換:

平臺端在這一塊做了一小塊修改,他不是按照標準的方式轉換的,而是在轉換的時候,將CbCr兩個轉換算子做了微調,這樣在YUV2RGB轉換回來的時候,你會發現顏色變了。如果按照標準的方式進行RGB2YUV ,然後YUV2RGB,你得到的圖像是近乎一致的。但是修改後的轉換方式你轉回來後就成了右圖的熊樣,原諒我這塊還在摸索,半瓶子水,半瓶醋……

十三 小波降噪

         這塊寫的很粗糙,因爲我沒完全懂,我很慚愧。

         小波降噪是在頻率域進行的噪聲處理,這要感謝傅里葉。當年學習數學時,老師講得很好,但是沒有告訴我傅里葉變換有啥鳥用。等工作了,發現處處都有傅里葉的影子時,我又拿起了課本……感謝中國教育,感謝我的老師。

         小波降噪的原理我還不太明白,雖然網上很多講解的,但飯菜好不好吃,吃了才知道。下面這個圖片,來源於如下程序:

         我只是簡單的將小波轉換後的小波分解矢量中,最後一維全部置爲0,然後將它再恢復成圖像,能看到噪聲明顯減小了(下方兩圖):

 

         我看下MATLAB中自帶的小波程序,可以將小波分解圖形化,可以看到LL的圖像基本不含噪聲,但是細節也丟失的很多。然後逐層的噪聲比例會越來越高。

 

下面這幅圖是小波分解矢量中,右下角的圖像,可以看到基本全是噪聲了,我就是簡單的將這塊全部置爲0,就能看到噪聲明顯減小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章