相機主要技術點為3A算法。
而3A算法主要指的是自動對焦(AF)、自動曝光(AE)及自動白平衡(AWB)。
自動白平衡:根據光源條件調整圖片顏色的保真程度。
網上時常有類似招聘如下的招聘信息:
---------------------------------------------- ----------------------------------------------
Camera/ISP 算法工程師
攝像機3A算法軟件工程師
這里隨機摘錄一些具體要求。
任職要求:
1、本科以上學歷,天文,物理,機電、工業自動化,電子相關專業,碩士學歷優先考慮;
2、本科畢業3年以上,碩士畢業1年以上的相關行業相關工作經驗要求;
3、熟練掌握C/C++或者FPGA 開發語言,數據結構,MATLAB,信號和系統;
4、掌握數字色度學,數字圖像處理,數字影像處理的基本知識;
5、熟悉攝像機成像原理;
6、掌握3A(AF,AE,AWB)算法之一;
7、對於自動化控制,數字信號采樣,濾波,負反饋,PID算法有實際經驗;
8、理解從鏡頭到SENSOR,電機,ISP,編碼器,采集,顯示通道一些列變化。
任職要求:
1. 精通camera的3A(AE,AWB,AF)算法原理和設計思路, 有3A算法的設計經驗為佳
2. 具備豐富ISP(圖象處理器) 開發經驗,熟悉MTK,QUALCOMM, OV等便攜式終端上應用的ISP開發環境。有上述環境下開發經驗為佳。
3. 精通數字圖像處理原理和基礎知識。
4. 熟悉C/C++語言,有開發經驗為佳
5. 有手機/便攜式相機3A算法實現/應用經驗
6. 精通CMOS sensor的工作原理
---------------------------------------------- ----------------------------------------------
而這類職位一般都是高薪待遇。
然后問題來了,市面上3A算法相關資料都非常稀少,就連相關書籍都很少提及算法細節,而他們基本上都會要求精通3A算法至少之一。
而關於白平衡算法,比較不錯的資料是這份:
基於灰度世界、完美反射、動態閾值等圖像自動白平衡算法的原理、實現及效果
之前多次與博主laviewpbt探討相關的知識,受益匪淺。
而據我所知,絕大多數的相機采用的基礎算法便是灰度世界算法,然后在這算法的基礎上再改進。
貼一下《基於灰度世界、完美反射、動態閾值等圖像自動白平衡算法的原理、實現及效果》灰度世界法的大概內容。
---------------------------------------------- ----------------------------------------------
灰度世界算法(Gray World)
是以灰度世界假設為基礎的,該假設認為對於一幅有着大量色彩變化的圖像, R、 G、 B 三個分量的平均值趨於同一個灰度K。一般有兩種方法來確定該灰度。
(1)直接給定為固定值, 取其各通道最大值的一半,即取為127或128;
(2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分別表示紅、 綠、 藍三個通道的平均值。
算法的第二步是分別計算各通道的增益:
Kr=K/Raver;
Kg=K/Gaver;
Kb=K/Baver;
算法第三步為根據Von Kries 對角模型,對於圖像中的每個像素R、G、B,計算其結果值:
Rnew = R * Kr;
Gnew = G * Kg;
Bnew = B * Kb;
對於上式,計算中可能會存在溢出(>255,不會出現小於0的)現象,處理方式有兩種。
a、 直接將像素設置為255,這可能會造成圖像整體偏白。
b、 計算所有Rnew、Gnew、Bnew的最大值,然后利用該最大值將將計算后數據重新線性映射到[0,255]內。實踐證明這種方式將會使圖像整體偏暗,建議采用第一種方案。
---------------------------------------------- ----------------------------------------------
算法的大概思路就是評估一張圖片RGB三個通道的中最能表達該通道富含信息的值,然后以該值為基准重新調整像素。
這樣就會存在評估不夠准確的問題,導致各通道像素信息差距過大,形成噪點以及偏色等現象。
因為如果采用取最大值的方案就會導致在特定情況明顯不均衡,例如該通道大多數的值落在最小值周圍,而卻存在一個遙遠處的最大值,那么就會導致像素信息差距過大,就很糟糕了。
所以在第二種思路上進行進一步改進比較穩妥,因為可用的信息比較多,不容易出問題。
第二種思路,最簡單的另一種改進就是采用灰度法。
均值法: K = (Raver+Gaver+Baver)/3
我們知道常用的視頻采集編碼是YUV。
YUV相關見百度百科:YUV
其中的Y為:
Y =0.299*R + 0.587*G+0.114*B
故灰度法相應可對應為:
K=0.299*Raver + 0.587*Gaver+0.114*Baver
經過實測,這樣的處理后效果還不錯。
貼上對比圖:
原圖
均值法
灰度法
單從肉眼上去分辨兩張圖片,的確很難分出優劣。
不過我也只是大概點一下這個思路而已,有所積累的人,看到這,應該可以發散出更多的想法。
接下來我要說的是具體相機中的鎢絲燈等手動白平衡是如何實現的。
簡單的說就是色溫調節。
那么基於灰度世界這個白平衡算法可以怎么實現這種調節呢?!
這里貼出簡單實現的C代碼:
switch (preset) { case AUTO: Raver = (SumR / numberOfPixels); Gaver = (SumG / numberOfPixels); Baver = (SumB / numberOfPixels); break; case CLOUDY: Raver = (SumR *1.953125 / numberOfPixels); Gaver = (SumG*1.0390625 / numberOfPixels); Baver = (SumB / numberOfPixels); break; case DAYLIGHT: Raver = (SumR *1.2734375 / numberOfPixels); Gaver = (SumG / numberOfPixels); Baver = (SumB*1.0625 / numberOfPixels); break; case INCANDESCENCE: Raver = (SumR *1.2890625 / numberOfPixels); Gaver = (SumG / numberOfPixels); Baver = (SumB*1.0625 / numberOfPixels); break; case FLUORESCENT: Raver = (SumR *1.1875 / numberOfPixels); Gaver = (SumG / numberOfPixels); Baver = (SumB*1.3125 / numberOfPixels); break; case TUNGSTEN: Raver = (SumR / numberOfPixels); Gaver = (SumG*1.0078125 / numberOfPixels); Baver = (SumB*1.28125 / numberOfPixels); break; default: break; }
enum WB_PRESET{ //自動白平衡 AUTO, //陰天 7500k CLOUDY, //日光 6500k DAYLIGHT, //白熱光 5000k INCANDESCENCE, //日光燈 4400k FLUORESCENT, //鎢絲燈 2800k TUNGSTEN, };
陰天
日光
白熱光
日光燈
鎢絲燈
這里只是起到一個演示作用,具體的參數,可按實際需求酌情進行修改。
本文只是拋磚引玉一下,若有其他相關問題或者需求也可以郵件聯系我探討。
郵箱地址是:
gaozhihan@vip.qq.com