1. 程式人生 > >高通MSM8909 CAMERA TUNING 基礎

高通MSM8909 CAMERA TUNING 基礎

轉載自:http://blog.chinaunix.net/uid-7213935-id-5750641.html

一. 重要概念:
1.色溫
所謂色溫,簡而言之,就是定量地以開爾文溫度(K)來表示色彩。英國著名物理學家開爾文認為,假定某一黑體物質,能夠將落在其上的所有熱量吸收,而沒有損失,同時又能夠將熱量生成的能量全部以“光”的形式釋放出來的話,它便會因受到熱力的高低而變成不同的顏色,如下圖:


2. 標準光源
是指模擬各種環境光線下的人造光源,讓生產工廠或實驗室非現場也能獲得與這些特定環境下的光源基本一致的照明效果。標準光源通常安裝在標準光源箱內,主要用於檢測物品的顏色偏差。
人造的標準光源主要有如下10種類型:


在除錯的過程中,一般都是基於三種光源型別除錯,所用到的光源為D65,D50,TL84,CWF,A,H。
3. 白平衡
所謂白平衡(英文名稱為White Balance),就是對白色物體的還原。當我們用肉眼觀看這大千世界時,在不同的光線下,對相同的顏色的感覺基本是相同的,比如在早晨旭日初昇時,我們看一個白色的物體,感到它是白的;而我們在夜晚昏暗的燈光下,看到的白色物體,感到它仍然是白的。這是由於人類從出生以後的成長過程中,人的大腦已經對不同光線下的物體的彩色還原有了適應性。但是,作為拍攝裝置,如數碼相機,可沒有人眼的適應性,在不同的光線下,由於CCD輸出的不平衡性,造成數碼相機彩色還原失真。一般情況下,我們習慣性地認為太陽光是白色的,已知直射日光的色溫是5200K左右,白熾燈的色溫是3000K左右。用傳統相機的日光片拍攝時,白熾燈光由於色溫太低,所以偏黃偏紅。所以通常現場光線的色溫低於相機設定的色溫時,往往偏黃偏紅,現場光線的色溫高於相機設定時,就會偏藍。
為了解決不同色溫下,引起的白色漂移現象。由於白色對色溫變化的響應最大,通常用白色來作為調整的基色。
4. 自動白平衡
自動白平衡是基於假設場景的色彩的平均值落在一個特定的範圍內,如果測量得到結果偏離該範圍,則調整對應引數,校正直到其均值落入指定範圍。該處理過程可能基於YUV空間,也可能基於RGB空間來進行。對於Sensor 來說,通常的處理方式是通過校正R/B增益,使得UV值落在一個指定的範圍內。從而實現自動白平衡。
一般來講,在優化引數中,自動白平衡  (AWB) 除錯模組用於調整參考點、弱光查詢表、AWB Bayer 引數和色調校正。
5. 曝光Gain值
曝光等級的強弱,一般由sensor 本省處理能力決定;也可以通過ISP處理能力補強。
6. 光照強度Lux
勒克斯(lux,法定符號lx)照度單位,1 勒克斯等於 1流明(lumen,lm)的光通量均勻分佈於 1㎡ 面積上的光照度。
二. 效果引數標頭檔案構架
1. 效果引數檔案列表
效果引數一般位於下面路徑:mm-camera\mm-camera2\media-controller\modules\sensors\chromatix\0301\libchromatix,在xxxx_sensor_lib.c 中被載入;檔案列表如下:

2. 檔案構架
所有的效果引數都是在.h標頭檔案中,而標頭檔案有分為兩類,一類是common類,如chromatix_xxxx_common.h,一類是非common類,如chromatix_xxxx_preview.h。
任何一個複雜的東西,如果把他拆分的足夠小,總有你能理解的部分。效果引數也不例外,當你把他們構架細分了的時候,就不會被煩躁的資料所纏擾而不知所云。
1) Chromatix_xxx_common.h 檔案構架 
主要包含模組如下: 
Chromatix_xxx_common.h


0x0301,---------------------------------------------------版本
0, // Not compressed
1, // Revision 
{
/*Linearization*/  -------------------------------------線性化
}
{
/*Lens Rolloff */ ---------------------------------------- 鏡頭衰減
}
{
/*LA Secial Effects---場景特效---*/-----------------場景特效
}
線性化:
由於影象感光器所具有的特性,感測器對場景亮度的輸出響應不一定是線性的,並且不同照明條件下可能有所不同。例如,感測器光子響應曲線在強光飽和度條件下幾乎是平的。
在黑暗環境下,由於暗電流的原因,感測器輸出將不會完全為零。該偏移值取決於使用的
具體感測器,並且還取決於整合時間,曝光對應整體增益設定和溫度。即使是不飽和區域,
R/Gr/Gb/B 通道的響應曲線線上性度方面也可能不完全匹配,從而導致輕微的色偏。必須為不同照明條件下每個畫素的每個通道校正感測器響應的線性度。
鏡頭衰減:
出於節約成本的考慮以及尺寸方面的原因,手機相機鏡頭向小型化和低成本方向發展。由於攝像頭尺寸小,製造材料品質低,拍攝的影象在靠近邊緣處會出現亮度衰減的現象。因
此要對 Bayer raw 影象進行鏡頭衰減校正,以降低計算負荷。使用 LUT 分段線性近似法代替模擬曲線和多項式運算。每種顏色都有自己的 LUT,因此亮度衰減和色偏問題可同時得到解決。
LA Special Effects
特效場景,如Whiteboard,Blackboard等,不解釋。
一般情況下,Linearization不會去除錯,如果非要除錯,必須要通過工具優化
。Lens Rolloff則需要用工具除錯,參見文件:80_NK872_1SC_Chromatix_6_User_Guide___Simplified_Chinese.pdf。
總體而言,Chromatix_xxx_common.h 決定一個模組的基本效果,即使Chromatix_xxx_preview.h再怎麼優化,如果Chromatix_xxx_common.h沒有優化好,也優化不出最佳的效果。
2) Chromatix_xxx_preview.h 檔案
由於preview,video,snapshot等檔案構架都一樣,此處只分析此類架構。
主要包含模組如下:
chromatix_xxx_preview.h 檔案:


0x0301,
0,
1,
{
 /*VFE Blocks*/
{
        /*Black-Level Subtraction*/
}
{
        /*Adaptive Bayer Filter 2 ---ABF2---*/
}
  {
/*Bad Pixel Correction*/
        /*Demosaic3*/
/*Chroma and Luma Filters*/
}
{
/*Color Correction*/
}
{
/*Gamma Tables*/
}
{
/*Color Conversion*/
}
{
/*5x5 ASF  */
    }
{
/*7x7 ASF */
}
{
/*Luma Adaptation   */
/*Chroma Suppression/Memory Color Enhancement  */
}
{
/*Wavelet Denoise*/
},
}
{
/*Manual Whitebalance*/
},
{
/*Auto Whitebalance*/
},
{
/*Bayer AWB Params*/
},
{
/*Exposure  Table*/
},
/*不常用模組*/
{
/*Auto Flicker Detection*/
},
{
/*Auto Scene Detection*/
},
三.重點模組除錯
1. AEC 曝光表
通過感測器曝光時間和感測器模擬增益控制影象亮度.
a.知識背景:
攝像頭sensor使用模擬放大器將畫素資訊放到來實現感測器增益。也可以將sensor曝光疆場一段時間,使得每個畫素都可以收集到更多的光線。之後,可以通過曝光演算法控制感測器增益和畫素曝光,從而實現與目標值相關的畫面、物體或是場景的亮度恆定。
b.chromatix6.0 除錯,略去;
c. 手動除錯:
程式碼片段:
 /* Exposure Table */
   {
      1, /* Use Digital Gain */
      367, /* Max Exposure Table Entries for EV0 */
      0, /* Enable Digital Gain for EV Lowlight */
      413, /* Max Exposure Table Entries for EV+2 with digital gain */
      {
         {256, 1}, /* Gain= 1.000 Exposure Index=0 */
         {264, 1}, /* Gain= 1.031 Exposure Index=1 */
         {272, 1}, /* Gain= 1.063 Exposure Index=2 */
         {280, 1}, /* Gain= 1.094 Exposure Index=3 */
         {288, 1}, /* Gain= 1.125 Exposure Index=4 */
         {297, 1}, /* Gain= 1.160 Exposure Index=5 */

曝光表不僅僅是上面工具生成的表,還包括很多”target point”,用來做cover,程式碼片段如下:
/* Low-Light Trigger Points */
      {
         7.200000f, /* Gain Start */
         8.000000f, /* Gain End */
         330, /* Lux Index Start */
         367, /* Lux Index End */
      },
要除錯的幾個引數:
Luma Target----預設亮度
Fix FPS AEC Table Index------最大幀率下的曝光,影響幀率和亮度
……
2. ABF(Adaptive Bayer Fliter)
a. 知識背景:
常規 2D 卷積濾波會使影象質量劣化(要麼影象模糊,噪點少;要麼影象銳度高,噪點多),尤其在應用於 Bayer 畫素時。而ABF濾波在降噪的同時不鈍化邊緣,採用的濾波器可根據相鄰畫素的值調整其核心。
b. 工具除錯,略去;
c. 手動優化
不建議手動優化。
3.ASF(Adaptive Spatial Fliter)
a. 知識背景:
自適應空間濾波器 (ASF) 是一種根據邊緣檢測結果對影象的不同部分執行平滑和銳化處理的自適應濾波器。ASF 針對影象中的不同區域有兩種不同的處理方法。它可對細節較少的區域進行平滑處理以實現降噪,對邊緣進行銳化處理以提升影象銳度。因此必須為 ASF 濾波器指定兩個濾波器,即平滑濾波器和銳化濾波器。


b. 工具除錯
略去,詳細參考:80_NV105_1SC_5x5_Adaptive_Spatial_Filter_Tuning_Guide__Simplified_Chinese_.pdf
80_NK872_1SC_Chromatix_6_User_Guide___Simplified_Chinese.pdf
c.手動除錯:

程式碼片段:
/* Normal Light */
            {
               10, /* e1 */
               32, /* e2 */
               -32, /* e3 */
               32, /* e4 */
               -32, /* e5 */
               0.750000f, /* k1 */
               0.750000f, /* k2 */
               30, /* sp */
               0, /* sp 5x5 */
光照條件 
? 根據光照條件(例如,弱光、正常亮度和強光)確定的ASF引數 

曝光指數代表著光照條件,不同光照條件下應使用不同的ASF引數。
注意在優化的時候,要兼顧到實際情況,不能隨意除錯,而各個引數之間也有有關聯的。
4. gamma校正table
a.  背景知識
曝光的均值正確了,並不代表整體影象的亮度分佈就和人眼所看到的保持一致了。事實上,人眼對亮度的響應並不是一個線性的比例關係,而各種涉及到光電轉換的裝置的輸入輸出特性曲線一般也是非線性的,對於sensor來說,其響應倒是接近為線性關係,所以為了在各種裝置上正確輸出符合人眼對亮度的響應的影象,就需要進行校正。冪函式的指數的倒數就是通常所說的 gamma 值。

它能起到的作用很多,它幾乎可以影響到影象質量調整的各個方面。在影象質量調整中,Gamma校正的一個重要作用是體現細節,增強對比度。由於人眼對於高亮度的差別感覺不明顯,而對低亮度的細小差別感覺較為明顯,因此,Gamma校正通過將低亮度部分的差距拉大,而造成低亮度部分的細節能夠被人眼明顯的感覺出來,而影象的細節部分基本上都是純在於低亮度部分的。
b. 工具除錯略去;
c. 這部分不可能手動優化,但是可以借鑑別的專案的gamma,最好是問FAE要幾組他們實驗室優化過的gamma table。
5. Color Correction 
 a.  背景知識
由於攝像頭系統中使用的光學元件(鏡頭、色彩濾鏡等)和感測器所具有的特性,當影象顯示在特定輸出介質上時,原始 RGB 資料可能不能真實地呈現給人眼。因此需要進行色彩校正。
b. 工具優化略去。
C.手動優化:
程式碼片段:
/* TL84 Color Correction */
      {
         1.729600f,    -0.939000f,    0.209400f,
         -0.319300f,    1.277900f,    0.042600f,
         -0.115400f,    -0.994300f,    2.109700f,
         0,    0,    0,
         0
      },
如上程式碼,加粗的對角線依次是R,G,B的飽和度,可以手動調節,注意各個場景下引數。
 
6. Color Conversion 
a. 背景知識:
要拍攝 JPEG 快照影象,必須將 RGB 色彩空間轉換為 YCbCr 色彩空間。預設轉換矩陣可以在不更改任何資訊的情況下將 RGB 值轉換為 YCbCr 值。不過,由於人眼和攝像頭感測器對光譜響應不同,攝像頭捕捉的顏色也與人眼看到的顏色有所不同。要提升還原色彩與人眼感知間的顏色精確度,可對顏色處理管道中的 RGB 至 YCbCr 轉換矩陣進行優化,從而最大限度地降低平均色度偏差。高階色度增強 (ACE) 的目的是進一步降低還原色彩與人眼感知間的色差,同時增強期望顏色(例如記憶色)的效果。實際上,ACE 中的很多引數可用於提高轉換靈活性,增強空間色彩而儘量不影響其他顏色。
b.工具優化略去;
c.手動除錯:
程式碼片段:
/* TL84 Color Conversion */
      /* Noise Weight: 0.000000 */
      /* Saturation: Red - 1.000000, Green - 1.000000, Blue - 1.000000 */
      {
         {
            /* a_m, a_p */
            0.510000f, 0.510000f,
            /* b_m, b_p */
            -0.338000f, -0.338000f,
            /* c_m, c_p */
            0.510000f, 0.5100000f,
            /* d_m, d_p */
            -0.162000f, -0.162000f,
            /* k_cb, k_cr */
            128, 128
}
各個量的含義:
a_m:黃色飽和度;
a_p:藍色飽和度;
b_m:綠色向量;
b_p:紅色向量;
c_m:綠色飽和度;
c_p:紅色飽和度;
d_m:黃色向量;
d_p:藍色向量;
通過手動除錯片段中加粗的引數,可以到到色彩的微調,尤其是膚色色彩。


7. 白平衡
a. 背景知識
見前重要概念章節所述。
b. 工具優化略去;
c. 手動優化:
   一般分為手動白平衡和自動白平衡。
Manaual Whitebalance
程式碼片段如下:
/* TL84 Whitebalance - RGB */
   {1.074800f, 1.000000f, 1.717200f},
   /* D50 Whitebalance - RGB */
   {1.300800f, 1.000000f, 1.302100f},
   /* A Whitebalance - RGB */
   {1.000000f, 1.134000f, 2.230100f},
   /* D65 Whitebalance - RGB */
   {1.479100f, 1.000000f, 1.074600f},
   /* Strobe Flash Whitebalance - RGB */
   {1.679100f, 1.000000f, 1.274600f},
   /* LED Flash Whitebalance - RGB */
   {1.288600f, 1.000000f, 1.551900f},
每一項下面的三個引數代表RGB的比率,可以按照實際效果手動優化,也可以通過工具優化。
7. Bad Pixel Correction
a. 背景知識
由於半導體工藝(CMOS 或 CCD)存在的缺陷,影象感測器會產生壞點。模組製造過程中也會引入其他瑕疵。這些壞點會表現為亮點(熱畫素)或暗點(冷畫素),有時會成簇出現。壞點/壞點簇可能是: 
?  感測器製造過程中勢阱滲漏、畫素靈敏度異常或電阻損耗造成的壞點/壞點簇安裝鏡頭時因感測器頂部落有灰塵顆粒而造成的壞畫素因老化造成的壞點/壞點簇在噪聲濾波和色彩濾鏡陣列(CFA) 插值處理前,必須找到並校正壞點。缺陷畫素和簇檢測的原理是將影象感測器的特定彩色畫素值與同種顏色相鄰畫素值進行比較。
b. 工具優化略去;
c. 手動優化:
此部分不做手動優化。

8. 小波降噪(Wavelet Denoise)
a.知識背景:
小波去噪是基於頻域去做的去噪,不同的頻率區間按照不同的力度和方式去處理;越是細節的地方頻率越高噪聲也越多,如果力度加的太強,清晰度也會損失比較多.根據目標晶片的小波功能,該模組可能是硬體小波降噪或者軟體小波降噪;MSM8909 是不支援硬體小波降噪功能的,但是支援軟體小波降噪,在capture環節有作用,開啟後拍出的照片沒有紅綠噪點。
 /* Denoise Scale Y */
               {
                  10.000000f, 10.000000f, 10.000000f,10.000000f
               },
               /* Denoise Scale Chroma */
               {
                  15.000000f, 15.000000f, 13.000000f, 10.000000f
               },
               /* Denoise Edge Softness Y */
               {
                  10.000000f, 10.000000f, 10.000000f, 10.000000f
               },
               /* Denoise Edge Softness Chroma */
               {
                  15.000000f, 15.000000f, 15.000000f, 15.000000f
               },
               /* Denoise Weight Y */
               {
                  0.000000f, 0.000000f, 0.000000f, 0.000000f
               },
               /* Denoise Weight Chroma */
               {
b. 工具優化略去;
c. 手動優化:
     一般情況下可以嘗試增大denoise scale去降噪;每組四個值,對應lv0-lv4四個區間力度,值越大去噪力度越強;
Denoise Edge Softness:可直接影響邊緣/細節,因此在增大edge softness 值時要格外小心,特別是針對室外場景。
      Denoise Weight:越小去噪能力越強,denoise weight = 0 則是最大化降噪,細節與之關聯最大,配合銳度除錯,以達到細節和噪聲之間的平衡.
四. 關於除錯
  1. 除錯資訊
    除錯引數的時候,往往要抓log用來跟蹤實時資料,一般步驟如下:
a) adb root ---開啟root許可權;
b) adb shell setprop persist.camera.stats.debug.mask <value> 設定屬性
<value> 是十進位制:
STATS_DEBUG_MASK_AEC_LOG = (1 << 0)  >1 曝光
STATS_DEBUG_MASK_AWB_LOG = (1 << 1)  >2 白平衡
STATS_DEBUG_MASK_AF_LOG = (1 << 2)   >4 對焦
STATS_DEBUG_MASK_ASD_LOG = (1 << 3)  >8 自動場景選擇
STATS_DEBUG_MASK_AFD_LOG = (1 << 4)  >16 工頻干擾消除
c) adb logcat 
在除錯的適合,我習慣於用adb logcat –v time  | grep xxxx來抓取有用的資訊;xxxx選擇你所要關注的有效log,如:
previw size;
banding;
AWB;
exp_index;
indoor_index;
FRAMES;
lux_index;
......
在debug的適合,關注log,看連續性和拐點,進而判斷問題;
2. 優化心得 
a) 儘量多的從FAE哪裡獲取幫助
FAE一般有專業的實驗室,有可以討論的團隊,有別人不知道的特殊模組引數列表,總之優勢明顯。當然也有他們解決不了的問題,這個時候也要發揮我們自己的主觀能動性,對問題不能置之不理。
b) 除錯不能隨意
camera 的效果引數很多都是前後有聯絡的,不能顧此失彼,要綜合考慮,同時也要一定的妥協折中,以達到一個穩定和滿意的效果。
c) 多總結
不同IC的模組在效果引數上都有很多共性,在除錯的時候自己多加總結,比較,總會出現意想不到的效果。