基于IC设计的实用ISP算法介绍
前言:
??????? 這篇文章是我從事ISP研究數(shù)年來的一些經(jīng)驗總結(jié),沒有用到深奧的理論知識,有的只是根據(jù)實際狀況來處理的一些常規(guī)方法,以及曾經(jīng)犯過的錯誤總結(jié)。我想把ISP function的原理用簡單淺顯的語言描述出來,希望對初學(xué)者有所幫助。這里的ISP主要是指從CMOS? sensor輸出的bayer pattern,到轉(zhuǎn)換成通用的YUV或者YCbCr格式的過程,通常用于USB攝像頭/監(jiān)控攝像頭/手機/平板等芯片設(shè)計中。
?????? 在IC設(shè)計中,受限于處理速度,像素級的ISP算法都相對簡單,只會用到加/減/乘/比較等基本運算,通常不會用到除法、指數(shù)、對數(shù)、平方根、三角函數(shù)等復(fù)雜運算。以1080p30fps的視頻為例,像素處理速度為1080*1920*30=62M pixel/s,每個pixel都需要非常多的基本運算,用pipeline的方式實現(xiàn)連續(xù)高速計算。像除法,指數(shù)運算或者三角函數(shù),則較多的時鐘周期才能完成一次計算,因此不適用于ISP的像素級處理,在算法設(shè)計中要盡量避免這些復(fù)雜運算。ISP中也有針對整幅圖像處理的運算(非像素級),例如白平衡AWB,自動曝光AE和自動對焦AF,這些算法比較靈活,處理速度要求不高,通常由CPU來處理的,任何復(fù)雜運算都可以用,只要CPU性能足夠。
?
????? 研究ISP算法是一件充滿樂趣的事情,原因在于ISP算法沒有標(biāo)準(zhǔn)答案,任何ISP算法都沒有一個標(biāo)準(zhǔn)協(xié)議,每個人都可以自由發(fā)揮自己的想象力,目的只有一個,讓人眼看得舒服,大家看著好,才是真的好。每個人的想象力各不相同,算法復(fù)雜度也是無窮盡,評價ISP算法的優(yōu)劣,主要就是一個性價比:在一定復(fù)雜度要求的條件下,達(dá)到最好的圖像質(zhì)量。在學(xué)習(xí)ISP相關(guān)的paper的時候,要關(guān)注的重點是算法的原理,或者說出發(fā)點,而不是計算公式,因為公式中通常都是復(fù)雜運算,難以實際用起來,在理解了原理之后,可以找近似的替代算法來達(dá)到相近的效果。
?
????? 從視覺感受來分,我把ISP大致分成亮度,色彩和細(xì)節(jié)三個部分。亮度是指對圖像整體的亮度調(diào)整,涉及到的算法有自動曝光Auto Exposure,黑電平校正Black Level Correction,鏡頭陰影校正Lens Shading Correction,Gamma,High Dynamic Ranger等。涉及到色彩的有白平衡Auto WhiteBalance,色彩校正Color Correction Matrix,飽和度Saturation,色相Hue等。細(xì)節(jié)的算法主要的去噪Denoise,插值interpolation,縮放zoom,邊緣增強edge enhance等。還有一些其他相對特殊的算法,例如自動對焦Auto Focus,防閃爍anti-flick等。一個簡化的ISP算法框架如下圖。
????? ISP各個基本算法是相對獨立的,但是在整體效果呈現(xiàn)上,又是相互關(guān)聯(lián)的。舉例來說,Lens Shading Correction這個算法把要圖像四周的拉亮,這就導(dǎo)致圖像四周的Noise比較大, 而Noise較大的話,edge enhance就要對四周的像素做特殊處理,使得Noise不會被放大,這會導(dǎo)致圖像中心相對清晰,四周相對模糊。經(jīng)常調(diào)校ISP的人,對此可能深有體會。諸多ISP算法模塊,內(nèi)在是有一些確定的邏輯關(guān)系的,上圖中的框架結(jié)構(gòu),有些順序是可以改變,有些則不可以改變,有些改變會導(dǎo)致算法復(fù)雜度提升。ISP算法中有不少特性是相互對立矛盾的,例如清晰度和噪聲,AWB中的穩(wěn)定度和精確度,AE中的收斂穩(wěn)定性和收斂速度等,這些對立的特性,就像天平的兩端,需要根據(jù)客戶需求或者實際應(yīng)用場景去做平衡。
????? 對ISP的研究學(xué)習(xí)過程,既有符合構(gòu)想預(yù)期的情況,也有充滿意外的時候,同時感嘆一下人眼或者說人腦的高復(fù)雜度和高靈敏度。ISP的各種數(shù)學(xué)運算,最終是要讓CMOS sensor感應(yīng)到的圖像,轉(zhuǎn)化模擬成人眼/人腦感受到的圖像,通過不斷的學(xué)習(xí)和嘗試,讓各種ISP模塊中的數(shù)學(xué)計算,能夠得出期望的圖像效果,或者從圖像效果反推出算法中的原因所在。一個有經(jīng)驗的ISP算法研究工程師,就是建立起數(shù)學(xué)計算和圖像效果之間的映射關(guān)系。
??? 接下來,我將從圖像亮度,色彩和細(xì)節(jié)三個方面來一一介紹ISP中各個function。
圖像亮度
ISP算法的目的是要讓CMOS成像接近人眼的感受效果,所以首先要比較人眼成像和CMOS成像的差異。從圖像亮度這方面來看,最重要的就是曝光,其次有針對顯示器特性的Gamma映射,針對CMOS sensor 特性的Black Level Correction,針對鏡頭透光性的Lens shading Correction,以及anti-flick等,下面逐一介紹。
1.1曝光
影響CMOS Sensor 成像亮度的因素有光圈大小,曝光時間以及Sensor像素本身的感光特性。光圈越大,進(jìn)光量越大,圖像亮度和光圈大小成正比。曝光時間越長,接收到的光子數(shù)量越多,圖像亮度和曝光時間也成正比。Sensor本身像素敏感度則和pixel size大小,以及CMOS process(FSI/BSI)相關(guān)。在Sensor內(nèi)部,完成光電轉(zhuǎn)化之后的電位,還需要通過一個模擬/數(shù)字增益電路,增益越大,圖像越亮,同時Noise也會被放大,在sensor的參數(shù)設(shè)定中有這個analog/digital gain,即通常說的ISO。
對于人眼來說,瞳孔是人眼的口徑;虹膜是光圈,像是孔徑內(nèi)的檔板。在角膜的折射造成有效孔徑 (入射瞳)。入射瞳的直徑通常是4mm,但是它的范圍可以從在明亮地方的2mm變化至黑暗地方的8mm。
Sensor和人眼的對比如下表格:
???????? 從以上表格內(nèi)容可以看出,人眼是靠調(diào)整光圈來適應(yīng)環(huán)境亮度,而一般的攝像頭則是調(diào)整曝光時間和增益來適應(yīng)環(huán)境亮度。相比而言,人眼在同一場景下所能感受的亮度動態(tài)范圍要比CMOS sensor大很多倍,在很多戶外場景中,攝像頭拍出的照片局部過曝,或者局部太黑,因此攝像頭很需要HDR技術(shù):同一場景下拍攝不同曝光時間的多張圖片(擴大動態(tài)范圍),來合成一張圖像。另一方面CMOS sensor的曝光時間理論上可以無限長,因此攝像頭可以拍下和人眼平常所見不同的美景,例如夜晚的星空和城市夜景(通常曝光時間要好幾十秒)。不過對于視頻拍攝來說,較長的曝光時間意味著運動物體會變模糊,所以一般都要求幀速率在15fps以上,即曝光時間最大只有1/15s。在這個約束條件下,一般的Sensor感光效果相比人眼差很多,在暗光下為了使圖像可見,必須要用很大的模擬或者數(shù)字增益,很多sensor會到64倍增益,這帶來了很大的Noise,人眼是沒有Noise這一說法的哦。
????? 在ISP中,自動曝光AE有相對成熟的算法。首先以人的視覺主觀感覺確定一個目標(biāo)亮度,這個亮度要讓用戶看著合適,具體數(shù)值看用戶喜好和真實環(huán)境可以調(diào)整。然后統(tǒng)計當(dāng)前圖像的實際亮度。統(tǒng)計的方法常見的有兩種。
????? 一種是基于亮度均值的方法,例如把整幅圖像分割成若干個矩形框,分別統(tǒng)計矩形框中像素平均亮度,不同位置的矩形框有不同的權(quán)重系數(shù),然后加權(quán)平均得到整幅圖像的亮度均值。下圖為兩種常見的權(quán)重設(shè)置方式:中間優(yōu)先(適用于人像拍攝)和下方優(yōu)先(適用于行車記錄儀)。
??????? 人像拍攝的時候,有時并不知道人臉的位置在哪里,如果此時背景比較明亮,那么人臉可能會拍得比較暗。假如上層應(yīng)用中有人臉檢測功能,那么就可以告訴ISP人臉的位置在哪里,ISP對人臉?biāo)诘奈恢眠M(jìn)行亮度統(tǒng)計,把得到人臉的亮度和整幅圖像的均值做加權(quán)平均,重新得到當(dāng)前亮度。
??????? 對于平板和手機而言,還有touch AE,拍攝視頻/照片的時候,在屏幕上點擊感興趣的位置,那么AE 和AF 都會跟著有變化。在ISP中,就是對著touch的區(qū)域做亮度統(tǒng)計,把touch區(qū)域的亮度和整幅圖像的均值再做加權(quán)平均,重新得到當(dāng)前亮度。
?
??????? 還有一種方法是基于直方圖統(tǒng)計的,力爭讓圖像的灰階分布比較好,特別是在高反差的情況下,像素主要分布在直方圖的兩端,亮度均值的算法不太適用。直方圖數(shù)據(jù)可以明顯的反映出這種狀況,從而選擇暗光優(yōu)先模式或者亮光優(yōu)先模式。
?
??????? 以上介紹了當(dāng)前圖像的幾種亮度統(tǒng)計方法,得出當(dāng)前亮度,接著要計算當(dāng)前亮度和目標(biāo)亮度的比例關(guān)系,根據(jù)這個比例關(guān)系來調(diào)整Sensor的曝光時間和增益。我們已經(jīng)知道圖像亮度是和曝光時間及增益成線性比例關(guān)系,有如下公式:
目標(biāo)亮度/當(dāng)前亮度 = (期望曝光時間×期望增益)/(當(dāng)前曝光時間×當(dāng)前增益)
?????? AE算法要在期望曝光時間和期望增益之間做一定的平衡,增益較大的話會有Noise,曝光時間長的話會導(dǎo)致幀速率fps下降。此外,AE控制算法還需要注意兩點:一是給sensor下的曝光參數(shù)并不是實時生效的,往往會有幾個Frame的延遲,要小心避免AE來回震蕩;二是要切換AE參數(shù)要平穩(wěn)一些,漸進(jìn)的方式達(dá)到目標(biāo)亮度,一步到位的視覺感受并不好,AE收斂速度和AE穩(wěn)定性需要平衡。
?
2.2Black Level Correction
????? 黑電位校正是由于CMOS sensor 本身由于暗電流的存在,導(dǎo)致在沒有光線照射的時候,像素單位也有一定的輸出電壓。需要把這個電位減去,讓輸出的數(shù)據(jù)呈現(xiàn)出隨亮度線性變化的規(guī)律。一般的Sensor都有BLC參數(shù),sensor廠商會給出已經(jīng)調(diào)校好的參數(shù),在ISP中也還有進(jìn)一步的BLC存在。但I(xiàn)SP的BLC 一般只是微調(diào)數(shù)據(jù),有些sensor在不同色溫或者環(huán)境亮度條件下需要調(diào)整。如下圖:
???? 右側(cè)的圖像在一定環(huán)境下,呈現(xiàn)偏紅色,因此需要對R分量減去一個較小的幅度。同時為了對整幅圖像數(shù)據(jù)不造成大的影響,R分量還要保持0~255的取值范圍,所以BLC 計算公式如下:
f(x, Δ)=(x-Δ)*255/(255-Δ)
??? 其中Δ為BLC校正的數(shù)值, x可以是R/G/B中的任意一個分量,取值范圍在0~255. BLC的映射關(guān)系圖如下,水平方向表示物體亮度,垂直方向表示Sensor像素的輸出值,藍(lán)色為BLC之前的數(shù)據(jù),紅色為BLC之后的數(shù)據(jù)。
??????? BLC參數(shù)Δ不宜設(shè)置過大,Δ越大,則感光動態(tài)范圍越小。一般要求在圖像效果可接受的范圍內(nèi),Δ越小越好。判斷Δ設(shè)置是否到位的一個簡單方法是把sensor完全遮黑,看看輸出數(shù)據(jù)是否逼近0值。
2.3 Lens ShadingCorrection
????? 由于Lens的不同區(qū)域透光性能不一致,導(dǎo)致圖像中心區(qū)域較亮,圖像四周較暗。如下圖:
??????? 一般來說,物體到lens中心的距離越遠(yuǎn),圖像越暗,呈圓形中性對稱的方式遞減。在算法中很容易想到用曲線映射的方式來補償亮度。假設(shè)像素到lens 中心的距離為d, 那么根據(jù)d映射一個lens shading gain,映射曲線類似拋物線的形狀,每個像素根據(jù)自己的d,乘以相應(yīng)的gain。
??????? 這個Gain在lens中心點(d=0)為1,d越大gain也越大,有些lens在最遠(yuǎn)的角落可能達(dá)到3倍。正是有些Lens shadinggain很大,導(dǎo)致了整幅圖像中四周的Noise明顯比中心大很多。這條曲線的形狀受lens和sensor特性不同而差異很大,對不同波長的光線衰減程度也不一樣,R/G/B三個分量分別需要各自的映射曲線,我們一般采用分段線性插值的方式來模擬這三條曲線,如figure2.3.2(右)。
??????? 要進(jìn)行LSC運算,需要知道三個信息:一是lens 中心坐標(biāo)(Cx,Cy),二是三條曲線形狀,三是像素到(Cx,Cy)的距離d。首先我們回顧一下ISP 構(gòu)架圖figure0.1,可以看到LSC的位置很靠前,僅在BLC之后,在bayer pattern domain。我們先要拍攝一張bayer pattern的圖片,要保證整幅畫面的亮度是一致的:一種方法是拍攝內(nèi)容為純白色或者灰色,這需要絕對的光照均勻;另一種方法是用亞克力板遮住sensor拍白色光源。然后對這張圖片進(jìn)行用一定的方法計算,找到最亮的位置就是lens中心坐標(biāo)(Cx,Cy), 然后找出到lens中心距離相同距離d(i)的點的集合,計算這個集合內(nèi)像素平均亮度和中心像素亮度的比例關(guān)系r(i),取r(i)的倒數(shù)就是LSC gain曲線上d=d(i)的gain值。在ISP中(Cx,Cy)和LSC gain curve是預(yù)先由tool計算好,作為參數(shù)寫入到register中的。對于從左往右自上而下逐行傳輸?shù)膱D像,任意一個pixel到lens 中心的距離d是需要計算的,如果用距離計算公式則用到平方根,計算速度較慢。不過任意兩個相鄰像素到lens中心的距離是有相互關(guān)聯(lián)的,知道了左邊像素的距離,可以通過簡單的幾步加法運算遞推出右邊像素的距離,有興趣的同學(xué)可以嘗試推導(dǎo)一下。
??????? 在實際使用中,由于周邊Noise實在較大,我們不得不在四周亮度和Noise之間取一個平衡。在低光照條件下,通常會讓四周的亮度達(dá)到中心亮度的70%~90%就可以了。環(huán)境色溫的差異,也會導(dǎo)致計算出LSC gain curve有所差異,在調(diào)校IQ的過程中,會計算多種色溫的LSC gain curve,然后在實際使用過程中動態(tài)的調(diào)整curve形狀。
?????? 除了上述圓形的LSC以外,還有一種網(wǎng)格狀(grid)的LSC方式。這種方式早期是用于糾正CMOS sensor由于制程漂移導(dǎo)致的局部色偏問題。Sesnor不同區(qū)域的像素濾光片性能不一致,導(dǎo)致圖像局部偏色,這種偏色沒有規(guī)律性,于是只好用grid的方式來補償。每個網(wǎng)格內(nèi)需要有一組rgb gain,Grid數(shù)量越多,所消耗的資源也越大。對任意一個像素,找出其四周的4組rgb gain,用雙線性插值可以計算出自身的gain。當(dāng)grid足夠密集的話,就可以取代圓形的補償方法,代價是成本較高。
2.4Gamma
???? Gamma這一特性源自于傳統(tǒng)的CRT顯示器,電子射線打出的屏幕亮度和電壓是一種gamma曲線的關(guān)系,基本映射波形曲線如下:
???? 后來為了兼容性,液晶/LED等顯示器都需要做這樣映射,在ISP中,就需要做反映射,理論上的數(shù)學(xué)公式如下,L為歸一化的輸入亮度信號:
???????? 通常情況下,這條曲線的形狀并不是固定的。我們會根據(jù)實際情況來調(diào)整曲線幅度,一般我們會說gamma=2.2。這個2.2數(shù)值就是上述公式中指數(shù)的倒數(shù),1/0.45=2.22。 這個數(shù)值是會根據(jù)sensor和lens 特性,光照環(huán)境,甚至用戶喜好來調(diào)整。Gamma 數(shù)值較大時,圖像會很亮,但是對比度和飽和度會下降,感覺像有一層霧遮住了畫面,同時暗處的Noise會被放大。Gamma很小時,亮度會降低,圖像整體對比度增加,色彩更鮮艷,暗處的Noise較小,但是會讓暗處的畫面更暗而導(dǎo)致看不清內(nèi)容。正是由于Gamma曲線在亮度較小的時候,映射曲線斜率很大,Noise也被同比例放大,所以才會有同一畫面中暗處Noise比較明顯的現(xiàn)象。
??????? 在實際的ISP設(shè)計中,不會真的去用上述的公式進(jìn)行指數(shù)運算,一是計算速度不夠,二是靈活度較低。一般都是用曲線映射的方式,可以用分段線性插值,也可以用SRAM逐一映射。這條曲線的形狀可以任意配置,在調(diào)校圖像的時候,一種方法是在燈箱拍攝24色卡,讓色卡最下方的6個色塊的亮度數(shù)據(jù)Y盡量呈現(xiàn)出線性等比例關(guān)系。這條曲線也可以隨著環(huán)境變化而動態(tài)調(diào)整,特別是在低照度環(huán)境下,為了減小Noise而降低幅度。
2.5Brightness
????? 亮度調(diào)整是一般攝像頭都有的基本屬性。通常都是在YCbCr空間對圖像每個像素的Y都加上一個ΔY,ΔY可正可負(fù)。這樣在增加亮度的時候會有明顯的缺陷,圖像的飽和度會降低,圖像變白,視覺效果變差。根據(jù)RGB和YCbCR的轉(zhuǎn)換公式可以分析出相同的結(jié)論:在Y上增加ΔY,等價于在R/G/B三個分量加上相同的ΔY。 我們常說的色彩鮮艷程度,非常近似于R/G/B之間的相互比例關(guān)系。當(dāng)ΔY為正時,相當(dāng)于R/G/B之間比例關(guān)系趨向于1,即差異變小,所以色彩變淡。那么要保持R/G/B比例關(guān)系,對R/G/B用乘法最好了,一樣可以提高亮度。不過乘法也自己的問題,一是容易讓較大的數(shù)據(jù)溢出,二是對暗處的亮度提升不明顯。因此最好是加法和乘法做個融合,把亮度調(diào)整挪到RGB空間做,會有不錯的效果。這里給出一個計算公式,對RGB三個分量獨立計算,假設(shè)用戶調(diào)整亮度為ΔY,x=R或者G或者B,ΔY 和R/G/G的取值范圍都在0~255之間,a為可調(diào)參數(shù),范圍在0~1,建議為1/4.
???????????????????????????????????????????????????????????????????????????????????????????????????????????? f(x, ΔY) = x + a*ΔY + x*(1-a)*ΔY /256
??? 我這個算法命名為基于色彩分量自身的亮度調(diào)整算法,效果圖如下:
??? ? 減小亮度的時候,也有類似的問題,直接對Y做減法的時候,暗處的內(nèi)容就會丟失比較嚴(yán)重,同樣可以采取在RGB空間加法和乘法結(jié)合的方式,有興趣的可以自己實驗看看。這種算法的映射曲線如下:
2.6Anti-Flick
????? Flick是由于我們平常所用的交流電是50Hz或者60Hz(美國)的正弦波形,熒光燈輻射能量與此相關(guān),人眼察覺不出來(神經(jīng)網(wǎng)絡(luò)刷新頻率太低,還是視覺殘留效應(yīng)?),但是CMOS? sensor可以觀察到,當(dāng)拍攝被熒光燈照射的場景時就會容易有flick現(xiàn)象。如下圖。這是一種垂直方向的正弦波,而且會隨著時間滾動。
???? 要解釋flick的成因,先要了解CMOS Sensor的曝光方式。Sensor 通常有全局曝光global shutter和滾動曝光rolling shutter兩種。Global shutter是指整個Frame pixel在同一時間開始曝光,同一時間結(jié)束曝光,然后把數(shù)據(jù)通過接口傳輸出來,等數(shù)據(jù)傳輸完成之后,再開始下一個Frame的曝光。Rolling shutter是指Frame中各條line上的pixel 按照順序依次開始曝光,先曝光完成的line 先傳輸,不必等整個frame都曝光完成。示意圖如下。
??????? 大部分sensor都支持這兩種曝光模式,相比較而言,可以看到rollingshutter對時間的利用率較高,大部分時間可以被利用起來進(jìn)行曝光。Rolling shutter的缺陷是當(dāng)有物體高速移動的時候,拍攝到的物體會有變形,矩形變成平行四邊形,這可以依照上圖原理推斷出來。Global shutter不會變形,主要用于拍照片,對fps沒有太多要求,單張照片也不存在flick的問題。Rolling shutter用于拍視頻,所以會存在flick問題。
??????? Flick的原因在于熒光燈發(fā)出的能量在時間上是不均勻的,以我們國家50Hz為例,電壓為50Hz正弦波,做平方運算轉(zhuǎn)換到熒光燈的輻射能量,為100Hz的半弦波形狀,如下圖。假設(shè)某個frame的曝光時間為0.025s,即2.5個半弦波,由于采用rolling shutter,每條line的起始曝光時間不一致,Line A和line B可吸收的能量也不相同,Line B 要比Line A亮一些。這樣在整個Frame 中就會有垂直方向的波浪紋。如果相鄰Frame的間隔不是0.01s的整數(shù)倍,那么每條Line 在不同F(xiàn)rame接收的能量也會變化,這樣看到的現(xiàn)象是波浪紋會隨著時間在畫面上滾動。
?????? 解決flick的方法很簡單,只要限制曝光時間是0.01s的整數(shù)倍,那么任意像素吸收的能量都是一樣的。然而在戶外光照較強的時候,曝光時間為0.01s的時候就會導(dǎo)致過曝,戶外也沒有熒光燈,不需要強加這個限制,所以在ISP中需要一個檢測機制,能夠檢測出flick的存在,當(dāng)發(fā)現(xiàn)這種flick的時候才對曝光時間進(jìn)行限制。檢測flick沒有統(tǒng)一的方法,可以自由發(fā)揮想象力,找到能準(zhǔn)確檢測flick并且不會誤判的方法,正是ISP樂趣所在。
2.7HDR
????? HDR的本意是高動態(tài)范圍圖像壓縮。 我們知道一般CMOS sensor拍攝到的照片動態(tài)范圍較人眼小很多,所以通過不同曝光時間拍攝同一場景的多張照片,實現(xiàn)動態(tài)范圍擴展。前文提過曝光時間和圖像亮度成正比,在已知多張照片曝光時間的條件下,可以把多張照片合成一張高動態(tài)范圍的圖片。舉例來說,原始照片中圖像內(nèi)容的亮度范圍都是0~255,合成之后亮度范圍可能變成了0~1023,這幅高動態(tài)照片確實可以呈現(xiàn)所有的圖像細(xì)節(jié),不過一般顯示器的顯示范圍只有0~255,無法直接顯示出來。采用等比例壓縮成0~255的話,圖像細(xì)節(jié)丟失比較嚴(yán)重,于是出現(xiàn)了各種壓縮動態(tài)范圍的算法,既能完整呈現(xiàn)圖像,又不損失細(xì)節(jié)。借用百度的圖片。
??????? 先談一下HDR的實現(xiàn)方法。通常我們所說的HDR都是指照片而不是視頻,也就是說拍攝好幾張不同曝光的照片存在系統(tǒng)的DRAM中,然后由CPU來計算合成,這是由SW來實現(xiàn)的,通常所需時間是秒級。HDR算法種類很多,效果較好的算法也意味著較高的計算復(fù)雜度。現(xiàn)在視頻拍攝也需要HDR,CPU就容易算不過來,我這里分析一下由數(shù)字IC設(shè)計來實現(xiàn)HDR的可行性。
???? 要視頻HDR,首先需要CMOS sensor支持長短曝光模式,以長/短兩種曝光圖像合成為例,據(jù)我所知有兩種輸出格式,如下圖。
Figure 2.7.2?
??????? 對于依次傳輸?shù)哪J?#xff0c;要做二合一融合,必須要把長曝光的整幅圖像先存起來,用SRAM的話顯然面積會非常龐大,成本太高,因此需要存到系統(tǒng)的DRAM中,等短曝光的圖像收到的時候再從DRAM中取出來。這樣會占用DRAM的1個Frame存儲空間,以及1次讀Frame和1次寫Frame的帶寬。對于混合傳輸模式,除了可以同樣采取把長曝光數(shù)據(jù)存儲到DRAM中的方法以外,也具有把數(shù)據(jù)放入SRAM的可能性,這要看混合傳輸時block 大小。以FHD為例,假設(shè)先傳輸100 line的長曝光圖像數(shù)據(jù),再傳輸100 line的短曝光圖像數(shù)據(jù),需要把1920*100=192K個pixel存儲到SRAM中,為了減小size,通常會在Bayer pattern domain做HDR合成,以pixel為10-bit為例,Totalsize為192K*10/8=240K bytes,成本或許可以接受。
?? ?? HDR算法種類較多,我這里大概介紹一下基本思想。有基于直方圖統(tǒng)計特征,進(jìn)行亮度重新映射的方法,類似于直方圖均衡化。有局部處理法,結(jié)合整體圖像亮度和局部區(qū)域?qū)Ρ榷?#xff0c;保留細(xì)節(jié)又壓縮范圍。有轉(zhuǎn)換到對數(shù)域(人眼對亮度的敏感度類似對數(shù)關(guān)系)進(jìn)行壓縮的方法。有對圖像進(jìn)行分層,分為基礎(chǔ)層和細(xì)節(jié)層,保留細(xì)節(jié)層,對基礎(chǔ)層進(jìn)行范圍壓縮的方法。各種方法可以相互融合借鑒,對于IC設(shè)計來說,最關(guān)鍵的還是性價比。
2.8 亮度小結(jié)
???? 以上介紹了和圖像亮度相關(guān)的ISP function,內(nèi)容并不全面,還有一些對比度增強類的算法(例如去霧)沒有描述,請大家包涵。下一章介紹圖像色彩。
3. 圖像色彩
??????? 盡管CMOS sensor模擬了人眼的三原色(RGB)視覺感受,見figure 1.1.1,但是CMOS的工藝特性和人眼還是有很大的差異,因此需要ISP來輔助,讓其色彩盡量接近人的感受。與色彩相關(guān)最重要的function是自動白平衡AWB和色彩校正矩陣Color Correction Matrix,其他有飽和度Saturation,色相Hue,另外手機中一般拍照APP有各種色彩效果也會介紹。
?????? 這里需要介紹一個圖形分析工具:Imatest,這個tool可以幫助分析圖像的亮度,色彩,信噪比,銳利度,畸變等很多性能。
?????? 這個工具提供了評價圖像質(zhì)量的客觀標(biāo)準(zhǔn),有理論有數(shù)據(jù),非常好用。不過也不能完全迷信工具,還是要以人眼看到的情況為準(zhǔn),沒有完美的數(shù)學(xué)模型可精確模擬人的視覺感受。有時候測出來的數(shù)據(jù)很好看,實際效果卻很難看。例如,評測數(shù)據(jù)是基于整幅圖像而計算出來的平均值,而人眼往往會特別關(guān)注一些個別點,只要某一點不好就會無法接受,而不管其他所有地方都不錯。
3.1 自動白平衡AWB
???? 首先介紹一下色溫的概念。色溫源自普朗克定義的黑體受熱輻射,單位是K(kelvin),用于定義光源顏色,熱黑體輻射體與光源的色彩相匹配時的開爾文溫度就是光源的色溫。來看一下色溫的大致范圍:
???????? 這是一份在XYZ色彩空間的光源色溫曲線,可以看到色彩偏紅時色溫較低,色彩偏藍(lán)則色溫較高。一般燭光在1800K,陰天為5000K,晴天為6500K,藍(lán)色天空在10000K以上。在實際場景中,光源的顏色未必剛好在這條色溫曲線上,很可能有一些偏差。
???????? AWB要做的事情,是要讓白色的物體,在任何色溫條件下,都顯示成白色,這是sensor色彩校正的第一步。這里先要說明一下人眼就有非常快速和精準(zhǔn)的AWB,以至于我們很少察覺到。舉例來說,有一張白紙,不論在什么環(huán)境下,我們?nèi)搜鄱紩J(rèn)為是白色的,只有在光源色溫大幅度且快速切換的一瞬間(例如開燈/關(guān)燈),才會感覺到白紙會變色一下,然后馬上又變白了。而CMOS sensor拍攝到的圖片,受色溫的影響很大,而且Sensor 本身對RGB三個分量的敏感度也不一樣(figure3.1.2),因此sensor輸出的原始圖片和人眼所見差異很大。AWB算法就是要克服sensor本身特性和人眼的不一致,以及解決色溫對圖像色彩的影響。Sensor輸出原本色彩和經(jīng)過ISP校準(zhǔn)后的色彩對比如figure3.1.3. 這里ISP中色彩處理包括AWB和CCM.
????? 人眼的AWB是根據(jù)周圍環(huán)境和既往的經(jīng)驗來實現(xiàn)的,這里ISP算法也一樣需要經(jīng)驗。針對任意一款sensor和lens的組合,我們都需要做一些實驗,通過這些實驗來獲取相關(guān)的數(shù)據(jù),作為這個組合的經(jīng)驗值。實驗需要一個燈箱,燈箱中有不同色溫的幾種光源可做選擇,通常有A光源,CWF,D65等色溫從低到高的幾種光源,燈箱背景為純灰色(和白色等價)。用sensor 拍攝不同光源下的燈箱背景或者標(biāo)準(zhǔn)測試灰卡,抓取原始的Bayer pattern圖片。
???? 白色和灰色物體,在圖像數(shù)據(jù)中體現(xiàn)為R,G,B三個分量相等,YCbCrdomain中Cb和Cr都為128. 我們通常在Bayer pattern domain或者RGB domain中來做AWB算法,那么就是要讓白色和灰色物體的R=G=B。我們拍攝到的圖片中,這三者是不相等的,我們可以統(tǒng)計出整幅圖中平均的兩個比例值G/R和G/B,很容易想到,如果對圖像中所有的R分量乘以G/R,所有的B分量乘以G/B,那么圖像就會變成白色或者灰色。我們可以用G/R和G/B來構(gòu)建二維空間,觀察不同光源條件下這兩個數(shù)值的分布情況,如下圖。
??????? 接下來我們需要在這個二維空間中描述一個閉合空間,這個閉合空間代表了可能是白色(灰色)物體的G/R和G/B的取值范圍。在上圖中,是用一個非常簡單的方法,用幾條直線勾勒出一個多邊形作為閉合空間。這個閉合空間必須包含大部分光源的情況。也就是說,假設(shè)有個白色(灰色)物體,不論在何種常見光源下,統(tǒng)計出來的兩個數(shù)值都會落在這個閉合空間內(nèi)。這個閉合空間不能太大也不能太小,太大可能有很多其他顏色被誤認(rèn)為白色,太小則容易找不到白色而不穩(wěn)定。那么如果確定了閉合空間的形狀,在拍攝實際場景時,如果場景中有白色/灰色物體,那么就可以統(tǒng)計出落在閉合空間范圍的像素點數(shù),以及這個閉合空間內(nèi)這些像素的平均G/R和G/B,分別記為R_gain和B_gain,對整幅圖像的R分量乘以R_gain,B分量乘以B_gain,就算達(dá)到白平衡了,同時可以利用這兩個Gain獲得近似的色溫,這里的邏輯關(guān)系并不嚴(yán)密,很可能有些物體并非白色而被誤認(rèn)為白色,所以AWB算法總是存在一定的誤判概率。如果圖像中沒有找到落在閉合空間范圍內(nèi)的像素(或者太少不足以用作參考),那么通常會保持原先的R_gain和B_gain,或者采用灰度世界算法。灰度世界算法是假設(shè)Sensor 拍到的畫面中所有像素的平均色彩應(yīng)該是灰的,即R=G=B,于是把整幅圖像的所有像素(而不僅僅是閉合空間內(nèi))都統(tǒng)計進(jìn)去,計算出一個全局平均的R_gain和B_gain,由于拍攝內(nèi)容的不確定性,這兩個gain可能偏離真實情況很遠(yuǎn)(例如拍攝鮮艷的紅色),因此需要做最大值和最小值限制,避免出現(xiàn)極端異常情況。相比于前面找白色物體的方法,灰度世界算法相對比較穩(wěn)定,總是能計算出大概的gain值,缺點是很可能不正確,受大色塊影響比較嚴(yán)重。在實際應(yīng)用中,通常會結(jié)合這兩種方法的優(yōu)點,加上額外的限制條件,衍生出更加穩(wěn)定和有效的AWB算法。
?????? 在統(tǒng)計上,為了避免大色塊對AWB的影響,通常會對圖像進(jìn)行網(wǎng)格狀分割,對每個矩形框內(nèi)的數(shù)據(jù)獨立統(tǒng)計,如果某個網(wǎng)格的數(shù)據(jù)偏離閉合空間很遠(yuǎn)的話,就認(rèn)為是大色塊而不參與AWB gain計算。
?? AWB的精準(zhǔn)性是可以通過Imatest 測試的,要求在各種色溫下,拍攝24色卡的最下面6個方塊不能有顏色,這個通常很容易達(dá)到。
??????? CMOS sensor拍攝的場景可能時時在變化,每次計算AWB得到的Gain會不一致,有時候甚至相差很多,如果實時調(diào)整AWB gain的話會讓視頻畫面的色彩有跳躍感,看起來不舒服。為此,通常會做兩點,一是AWB gain計算有一個穩(wěn)定區(qū)間,每次計算所得AWB gain后會映射到某個色溫C,假設(shè)原先的C和當(dāng)前計算所得的C差異不大(小于某個閾值)的話,就不做調(diào)整,也就是說當(dāng)畫面色溫變化不大的時候白平衡不變;二是兩次色溫差異超過閾值,需要調(diào)整的話,要采用漸進(jìn)式慢慢的調(diào)整,例如R_gain原本為1.0,調(diào)整為2.0,那么每個Frame gain增加0.01,需要100個Frame才能調(diào)整到位,以30fps為例,就需要3.3秒時間,這樣畫面會漸漸的轉(zhuǎn)變過去,看起來比較柔和舒適,沒有閃爍的感覺。
3.2Color Correction Matrix
?????? 色彩校正矩陣CCM 通常在RGB domain 進(jìn)行,并且在AWB之后。AWB把白色校正了,相應(yīng)的其他色彩也跟著有明顯的變化,可以說色彩基本正確了,只是飽和度有點低,色彩略有點偏差。CCM就是要保持白色(灰色)不變,把其他色彩校正到非常精準(zhǔn)的地步。先看一下CCM計算公式。
??????? 這里CCM之前的像素為[r,g,b]’,CCM之后的像素為[R,G,B]’。 CCM的實現(xiàn)比較簡單,就是一個簡單的矩陣運算,它的困難在于如何確定矩陣的系數(shù)。我們先分析一下這個矩陣中系數(shù)的物理意義。C00表示r分量對R的影響,C01和C02分別表示g和b分量對R的影響,假設(shè)CMOS的模型完全吻合人眼模型,那么顯然C00=1,C01=C02=0,實際上CMOS image sensor中的濾鏡不能完全過濾掉那些不希望看到的光波,如圖Figure 3.1.2。CCM前后的效果比對大致如下。
???????? 在Figure3.1.2中,X軸表示光波的波長,三條不同color的曲線分別表示某CMOS sensor中三種感光單元對不同光波頻率的敏感程度。 CMOS sensor感光單元所接受的光波頻率普遍太寬,三種色彩出現(xiàn)混疊,導(dǎo)致圖像的色彩不夠鮮艷。為了消除這種混疊,CCM中的系數(shù)就具有一種普遍的規(guī)律,系數(shù)C00,C11,C22都大于1,其他的系數(shù)則都小0或者近似0。G對R的影響要大于B對R的影響,所以C01的絕對值要比C02的絕對值大。同樣,C21的絕對值要比C20的絕對值大。
???? CCM不能改變白色。白色意味著r=g=b時,計算結(jié)果R=G=B=r=g=b,由此我們可以得出:
??? ? 以上公式是CCM必須堅持的原則,這樣原本9個獨立的系數(shù)可以縮減為6個,我們把C00,C11和C22用其他的系數(shù)表示。根據(jù)經(jīng)驗我們再設(shè)定其他6個系數(shù)的取值范圍,例如可以約束C01范圍是[-3,0],C02范圍是[-1,0]。要得出這6個系數(shù)的確切數(shù)值,過程有點復(fù)雜,首先來看Imatest對色彩的評價方法。
??? 拍在燈箱中各種色溫下的24色卡圖片,從圖片中取出24個色塊所代表的顏色,轉(zhuǎn)換到Lab色彩空間,和標(biāo)準(zhǔn)的24色卡顏色進(jìn)行比較。如下圖右
??????? 在Figure3.2.2右側(cè)的圖片中,小方塊代表24個標(biāo)準(zhǔn)色在Lab空間的坐標(biāo),小圓點表示實測出來的24種顏色在Lab空間的坐標(biāo),二者之間的連線表示誤差大小。通常認(rèn)為誤差越小越好,圓點往外側(cè)偏移表示色彩太鮮艷,往內(nèi)側(cè)偏移表示色彩太淡,其他方向表示色彩偏差。
??????? 我們要找出CCM中的系數(shù),也要建立一個和imatest類似的評價體系。先回顧一下ISP框架,在CCM之后還有Gamma,Hue和saturation會對圖像色彩和亮度產(chǎn)生影響,而評測的圖像是ISP的最終輸出。所以要找出CCM系數(shù),首先要建立一個ISP色彩和亮度模型,如下圖。我們認(rèn)為一般情況下用戶不需要去調(diào)整亮度,對比度,飽和度以及色調(diào)等參數(shù),這些模塊的默認(rèn)參數(shù)不對圖像色彩和亮度產(chǎn)生任何影響。沒有影響的模塊我都改成灰色,剩下三個有顏色的模塊是需要參與CCM系數(shù)尋找的。
?????? 建好了模型,還需要注意一點:由于sensor的感光動態(tài)范圍和24色卡標(biāo)準(zhǔn)色有差異,并且圖像平均亮度也可能有差異。我們對標(biāo)準(zhǔn)色做亮度調(diào)整(乘法)和動態(tài)范圍調(diào)整(調(diào)對比度),使之盡量符合當(dāng)前這張圖像的平均亮度和動態(tài)范圍,見figure3.2.4。換句話說,就是讓標(biāo)準(zhǔn)24色下方的6個黑白色塊,在變換后的亮度盡可能和當(dāng)前輸出的圖像接近。
???????? 有了模型和目標(biāo)之后,接下來就是選擇一種機制來找出最優(yōu)的CCM系數(shù)。這里每人都可以發(fā)揮個人想象力,盡量找出最優(yōu)的結(jié)果,最“笨”但有效的方法就是遍歷,在一定精度條件下遍歷所有的可能性,找出誤差最小的那組系數(shù)。在搜索CCM系數(shù)的時候,有不少誤區(qū),例如只看色彩誤差數(shù)據(jù)ΔC,當(dāng)搜索范圍設(shè)置不合理,圖像飽和度偏低的時候,計算出來的ΔC會很小,實際效果很難看。
???????? 在不同色溫下,CCM的系數(shù)也有較大的差異,所以一般在ISP中存有多組CCM系數(shù)。在實際使用過程中,需要通過AWB計算出當(dāng)前色溫,然后選擇合適的CCM系數(shù),或者幾組CCM系數(shù)的線性組合。在low light Noise較大的情況下,有時還會減小CCM系數(shù)絕對值以降低Noise。AWB解決了sensor 的R,G,B敏感度差異和色溫的影響,CCM則是糾正R,G,B感光之間的相互干擾,使圖像更接近于人眼。兩者結(jié)合就算把色彩糾正完成了。
3.3Saturation
????? 飽和度Saturation是指色彩的鮮艷程度,在YCbCr空間來看,Cb和Cr等于128時,飽和度為0,|Cr-128|和|Cr-128|越大,飽和度也越大,飽和度的計算公式非常簡單。
?????????????????????????????????????????????????????????????????????????????????????????????????????? f(x,s)=(x-128)*s + 128,? x=Cb or Cr,s>=0
???? 表達(dá)式中s表示飽和度調(diào)整幅度,s=1表示不調(diào)整,s=0表示灰度圖,0<s<1表示降低飽和度,s>1表示增加飽和度。
Figure3.3.1Saturation從左到右分別為s=0, 0.5, 1, 2
???? 飽和度調(diào)整也可以通過CCM來完成,不過CCM找出的是根據(jù)人眼模型得出的標(biāo)準(zhǔn)系數(shù),不宜隨意改變。在Ycbcr空間的這種簡單計算,適合于根據(jù)用戶喜好而調(diào)整的情況。例如我們知道sony相機拍出的照片色彩比較鮮艷,就可以用這個方法實現(xiàn)。
3.4 Hue
????? Hue的本意是色彩的轉(zhuǎn)換,在RGB空間有較明顯的意義,例如當(dāng)轉(zhuǎn)過120度的時候紅色變成綠色,綠色變成藍(lán)色,藍(lán)色變成紅色。至于為什么要這么轉(zhuǎn),其實也沒什么道理,除了特效擺酷外,hue一般不會被用到。但Hue是ISP標(biāo)配,所以還是要說明一下。在Ycbcr domain,Hue意義不能直觀的理解,我知道有用三角函數(shù)對Cb和Cr分量處理的方法,于是自己做實驗琢磨,下面給出Hue轉(zhuǎn)換的近似算法,如有雷同,純屬巧合。
假設(shè)用戶設(shè)定需要色彩旋轉(zhuǎn)的角度為α,記D=Cb-128,E=Cr-128。D’和E’為轉(zhuǎn)過α后的數(shù)值。
D’=D*cos(x) + E*sin(y)
E’=E*cos(y) +D*sin(x)
當(dāng)α=0,x=0,y=2π;
當(dāng)α=2π/3,x=3π/4,y=3π/2;
當(dāng)α=4π/3,x=3π/2,y=3π/4;
當(dāng)α=2π,x=2π,y=0;
???? 這里我只實驗得出了α為4個關(guān)鍵角度時的x和y取值,當(dāng)α為其他角度時,x和y可用兩點之間線性插值得到。變換過程中Y保持不變,Cb’=D’+128,Cr’=E’+128。這里的4個三角函數(shù)可以事先由軟件計算好,數(shù)字IC只要實現(xiàn)乘加運算。從整體效果來看,色彩確實按照期望的方向在旋轉(zhuǎn),但是并不完美。
3.5各種色彩特效
?? 接下來說說YCbCr空間對色彩的一些變化,算法比較簡單。
- 灰度圖:把Cb和Cr直接改為128,Y不變;
- 黑白二值圖:在灰度圖的基礎(chǔ)上,對Y做二值化。一部分取值為0,另一部分取值為255,大致算法為:計算整幅圖像均值和局部區(qū)域均值,得出一個相對均值,把當(dāng)前像素和這個相對均值做比較,再對應(yīng)到一個概率密度分布函數(shù),把當(dāng)前像素按照這個概率映射成0或者255;如下。
- 冷色調(diào)和暖色調(diào);對所有像素的Cb和Cr加上一個固定offset。
- 各種P圖軟件中的色調(diào),例如溫暖,黃昏,冷清,淡雅,青春等等。大致公式如下:定義一個場景模式,即對所有像素的Cb和Cr分量設(shè)定一個目標(biāo)值Cb_target和Cr_target。
Cb’=Cb_targte*α + Cb*(1-α); Cr’=Cr_targte*α + Cr*(1-α);公式中α為調(diào)整比例。各種效果如下,第一幅為原圖,其他為各種色調(diào)。
3.6 色彩小結(jié)
????? ISP中色彩相關(guān)的function就以上幾個,就算法復(fù)雜度來說,色彩在ISP中是相對較簡單的,但是人眼對色彩比較敏感,因此這部分比較重要,需要理解數(shù)學(xué)計算和實際效果之間的關(guān)系,才能恰當(dāng)自如的滿足用戶需求。下一章將介紹細(xì)節(jié)部分。
4.細(xì)節(jié)
???? 細(xì)節(jié)部分會介紹去噪denoise,Bayer pattern 轉(zhuǎn) RGB(即interpolation),Edge enhance(即Sharp)以及邊緣偽彩色false color。這部分內(nèi)容是ISP中最復(fù)雜的,需要較龐大的計算量和Memory。任何一個function都可以在網(wǎng)上找到不少的論文,這里我只說明一些基本原理和關(guān)鍵因素,不討論詳細(xì)的實現(xiàn)算法。
4.1 去噪Denoise
?? 首先我們把Noise 分成三類,分別是高斯白噪聲,壞點,受傷點。這三類分別有不同的處理方法。
?? 壞點Dead pixel是指有些像素不受拍攝景物影響,始終為固定的一個數(shù)值,通常為最大值或者最小值,也就是常說的亮點和黑點。檢測壞點的算法比較容易,因為壞點和周圍的像素差異非常大,檢測出來之后,可以用附近點均值替換即可。
??? 受傷點wound pixel是指有些點在低照度下,sensorgain很大的時候,會出現(xiàn)一定的偏差,能夠被人眼明顯察覺。這些受傷點輸出的值不固定,同時也受拍攝景物影響,例如比周圍正常像素的數(shù)值大一些,形成不太明顯的亮點,有時候還會隨著時間改變,一閃一閃的。對于受傷點,不是很容易被檢測輸出來,好在它一般只出現(xiàn)在暗光條件下,如果受傷點處在平坦區(qū)域,那么可以用最大值(最小值)替換,或者中值濾波等方法消除,如果正好處在邊緣上,那么就較難辨別出來,中值濾波等處理方法會使得圖像模糊。壞點和受傷點對應(yīng)到課本中就是椒鹽噪聲。
??? 一般我們說的噪聲都是指高斯白噪聲,噪聲的大小和sensor的增益大小成比例關(guān)系,同時ISP中的很多運算(例如Gamma,LSC,AWB,CCM等)都會放大Noise幅度。從頻域來看,噪聲遍布整個頻域。對于高頻噪聲,比較容易消除,但是高頻噪聲和實際景物容易混淆,消除噪聲的時候也會使得圖像模糊。對于低頻噪聲,就需要花代價來消除,在任何二維空間域的去噪算法中,都需要一個以當(dāng)前像素為中心的窗口,這個窗口越大,就越能檢測出低頻的Noise,同時也意味著越多的Memory和計算量。從空間域來看,落在平坦區(qū)域的Noise比較容易消除,落在景物邊緣的Noise則真假難辨,必須在清晰度和Noise之間做一個折中的選擇。
我所知道的可用于ISP中去除Noise的方法大概有以下一些分類(沒有廣泛研究過,肯定有疏漏,請包涵)。
1.首先是空間域和時間域的劃分。圖像是二維的,空間域是指僅對一幅圖像中的二維數(shù)據(jù)處理,一般照片的去噪都是在二維空間域。時間域是指多幀圖像之間的去噪,在視頻中,前后Frame有著較大的相關(guān)性,對于靜態(tài)場景來說就更加明顯。空間域去噪算法需要考慮的是Noise和圖像清晰度之間的權(quán)衡,而時間域去噪算法需要考慮的是Noise和移動物體的拖尾殘影現(xiàn)象的權(quán)衡。
2.其次是基于位置和基于數(shù)值的劃分。要消除Noise,一般人第一個想到的方法就是低通濾波器,以當(dāng)前像素為中心,選擇一個一定范圍的中心對稱的低通濾波器,到中心距離越近,對應(yīng)位置像素的weighting越高,越遠(yuǎn)則越小,這就是基于位置的方法。另外一種是基于數(shù)值的方法,先同樣選擇以當(dāng)前像素為中心的一個范圍,把這個范圍內(nèi)的像素按照數(shù)值大小來排成一個序列,然后再做處理,處理的方法可以是直接選擇某些點(例如最大值/最小值替換,中值濾波),也可以對這個序列再做低通濾波計算。鼎鼎有名的雙邊濾波就是結(jié)合了位置和數(shù)值兩種思想合二為一的算法,不過其公式計算太過復(fù)雜,不適合數(shù)字電路設(shè)計實現(xiàn),但是其思想是完全可以借用的。
3.各種變換域的處理方法。例如傅立葉變換,離散余弦變換,最有名的就是小波變換。這些域變換的基本原理都差不多,基于人眼對高頻分量較不敏感的特性,對轉(zhuǎn)換域中的部分?jǐn)?shù)據(jù)進(jìn)行歸0或者縮小,以達(dá)到消除Noise(或者圖像壓縮)的目的。小波變換效果較好,不過由于計算量很大,在ISP中實現(xiàn)有很大的難度。
???? 在實際應(yīng)用中,變換域的方法太過復(fù)雜,不適合實時視頻處理,所以常用的還是上面兩大類方法。一般來說Noise的幅度總是有限度的,和實際景物邊緣的變化程度有較大差距,所以通常會在平坦區(qū)域盡可能的多消除noise, 而在物體邊緣則盡量保護(hù)景物細(xì)節(jié),少做denoise處理,根據(jù)景物內(nèi)容動態(tài)調(diào)整去噪算法是必須的。在另一方面,Noise的幅度大小和sensor的增益相關(guān),當(dāng)環(huán)境變換導(dǎo)致AE gain變化的時候,Noise的幅度變化非常大,有些sensor在低光照條件下會有64倍的AE gain,Noise滿屏跳躍,幾乎掩蓋實際景物。有時候常會說“評價ISP好壞,就是看暗光情況下的Noise大小”,不同的Noise 幅度意味著不同的ISP算法(或者算法中的參數(shù)),所以還需要SW根據(jù)實際情況來動態(tài)調(diào)整去噪算法。因此,在真實的ISP電路設(shè)計中,去噪算法的多樣性和可調(diào)整性是非常必要的。
除了去噪算法以外,抑制Noise根源也是去噪的一個重要手段。Noise本身無處不在,問題根源在于Noise被不斷放大,也就是各種增益Gain(或者說乘法)把Noise放大了許多倍。為了達(dá)到一定的亮度,Sensor的AE gain通常沒有辦法改變,能改變的只有ISP自身。常用的抑制Noise手段包括:
- 降低Lens shading correction曲線的幅度,讓周邊稍微暗一些,減少周邊Noise。
- 降低Gamma curve在暗處的斜率,減少暗處Noise。
- 降低CCM系數(shù)絕對值,減少彩色噪聲。
- 降低edge enhance幅度,減少景物邊緣Noise。
去噪方法可以說是ISP中牽涉最廣,實現(xiàn)難度最大的一個功能,它滲透進(jìn)AE,LSC,Gamma,AWB,interpolation,edge enhance等多個function,是一個系統(tǒng)工程。
4.2Interpolation
??? 這里說的interpolation是指把Bayer patterndata 轉(zhuǎn)化為RGB data的過程,每個像素都要有完整的[RG B]三個分量。先看一下最簡單的雙線性插值算法。
?? 這是最簡單原始的方法,確實可以得到一幅RGB圖像,不過存在一些問題,例如拉鏈現(xiàn)象,有些模糊,分辨率不高,邊緣有些彩色(false color)等。評價插值算法的好壞,通常用ISO12233測試紙,如下圖。
???? 觀察細(xì)節(jié)算法的好壞,必須把圖像放大到像素級別,直接研究數(shù)值大小,下面以拉鏈現(xiàn)象為例。拉鏈現(xiàn)象出現(xiàn)在水平或者垂直的邊緣上,是由于G分量計算不當(dāng)所致。以一條水平邊為例,如下圖,用雙線性插值的話,在水平邊緣上就會出現(xiàn)[90,82.5, 90, 82.5…]這樣的循環(huán)重復(fù)規(guī)律。
??? 從圖像效果來看就是類似拉鏈狀.
????? 要解決拉鏈現(xiàn)象,保持邊緣的光滑,很直觀的想法就是對G分量采取沿著邊緣方向去插值,在上圖中,就讓G5 =(G4 + G6)/2。這樣就意味著要做邊緣方向性的判斷,如果是垂直邊,那么就會是G=(G2+G8)/2,還有各種其他方向,則可以對周邊四個G分量采用不同的加權(quán)平均算法得到中心點G分量數(shù)值。邊緣方向判斷是interpolation算法中最重要的一個環(huán)節(jié),是各家ISP算法的核心之一,有興趣的同學(xué)可以查看這個方面的論文。評價圖像分辨率(清晰度)的一個指標(biāo),是看ISO12233中對細(xì)密紋理的識別程度。一個好的算法可以判斷出只有一個像素寬度的細(xì)條紋。
???? 在Bayer pattern中,一半像素是G,R和B都只占1/4,R和B信息缺失比較嚴(yán)重。在雙線性插值算法中,R分量的計算只和周圍的R相關(guān),如果用G分量的信息去修正缺失的R分量,那么清晰度會有不小的提升。以水平方向的邊緣為例:
??????? 上圖中a1和a2是修正系數(shù),范圍在0~1之間。這種常用的計算方法不僅提高了清晰度,也可以緩解false color現(xiàn)象。不過從另一方面來看,這種修正會增加Noise幅度,原本R分量自身有一定的Noise分布概率,現(xiàn)在疊加了G分量的Noise,那么最大Noise幅度會提高。因此系數(shù)a1和a2需要根據(jù)場景,Noise幅度等因素權(quán)衡選擇。
整體來說,Interpolation算法大致過程就是先邊緣方向檢測,然后沿著方向去做插值,兼顧Noise和清晰度的平衡,順便還可以做一些false color的處理。
4.3Edge enhance
??????? 邊緣增強Edge enhance和一般所說的sharp是一個近似的概念。我這樣區(qū)分二者:sharp是對圖像所有內(nèi)容增加銳利度,包括Noise也會被放大;而edge enhance是要讓真正的edge變得銳利,Noise則盡量不被放大顯現(xiàn)出來。從算法上來說Sharp很好實現(xiàn),任何課本中都會提到sharp算子,而edge enhance則要有效區(qū)分出edge和Noise,并且判斷edge方向來做增強,增強的方法也很有難度,既要達(dá)到一定的銳利度MTF,又要解決邊緣粗糙roughness,overshot和undershot等問題。
邊緣增強一般在YCbCr空間進(jìn)行,并且只對Y分量處理,Cb和Cr保持不變,其原理如下:
Figure4.3.1 edgeenhance 原理?
?????? 淺藍(lán)色為原值,深藍(lán)色為enhance之后的數(shù)值。從波形上看,edgeenhance就是要讓線條的斜率更陡一些,甚至允許出現(xiàn)小幅度的過沖。從數(shù)值上來看,就是讓數(shù)據(jù)朝著遠(yuǎn)離鄰近點均值的方向走,而且和鄰近點均值的差越大,走過的距離也越大,把當(dāng)前像素值和鄰近點均值的差記為d;另外,edge enhance的幅度還和整個edge的變化范圍有關(guān),可以認(rèn)為上圖中最大值和最小值的差,記為g;最后是用戶設(shè)定的銳利度s,這三者可以得出像素的edge enhance函數(shù)H(x)。
H(x)= x + f(d, g, s)
????? f(d, g, s)是一個和d,g,s三者都正相關(guān)的函數(shù),但并非線性關(guān)系。這里沒有統(tǒng)一的數(shù)學(xué)模型可以給出答案,只有仔細(xì)研究規(guī)律,多做實驗,可以說的是想要得到較好的視覺效果,這個模型非常復(fù)雜,參數(shù)眾多。通過不斷的對參數(shù)調(diào)試練習(xí),慢慢建立起數(shù)學(xué)計算模型和實際圖像效果之間的映射關(guān)系,才能較好的平衡銳利度MTF和roughness,overshort,undershort等因素。
?????? 為了避免把Noise enhance出來,edge enhance在實現(xiàn)中還需要判斷當(dāng)前像素處于光滑區(qū)域還是物體邊緣。當(dāng)處于光滑區(qū)域的時候,則不要做edge enhance運算,或者做的幅度很小;只有在較明顯的邊緣上才做處理,這樣避免不了邊緣上的noise的影響,所以在銳利度s設(shè)定較大的時候,可以發(fā)現(xiàn)邊緣上會有Noise閃動跳躍的情況。為了緩解這種Noise的跳躍,通常會對f(d, g, s)做最大值和最小值限制保護(hù),并且沿著edge 方向做低通濾波來緩解Noise。
??????? 整個Edge enhance的大致流程為先判斷平坦區(qū)域還是邊緣,對平坦區(qū)域可以不做或者少做edgeenhance(甚至做smooth處理),對邊緣要判斷幅度大小,邊緣方向,選則相對應(yīng)的高通濾波器處理,最后對enhance的幅度做一定程度的保護(hù)處理。
4.4False color
???? False color一般出現(xiàn)在物體邊緣上,特別是白紙黑字。如下,白紙上的黑色線條,一側(cè)偏黃,一側(cè)偏藍(lán)。
???????? False color的原因有兩個,一是bayer pattern中R和B信息丟失比較嚴(yán)重,插值出來的R和B分量帶有誤差;二是鏡頭對不同波長的光的折射率不一樣。前者比較容易理解,后者則可以通過觀察發(fā)現(xiàn)規(guī)律。對ISO12233測試紙拍攝圖片,我分別截取四周的局部圖片,放大比較來看。
?????? False color的原因有兩個,一是bayer pattern中R和B信息丟失比較嚴(yán)重,插值出來的R和B分量帶有誤差;二是鏡頭對不同波長的光的折射率不一樣。前者比較容易理解,后者則可以通過觀察發(fā)現(xiàn)規(guī)律。對ISO12233測試紙拍攝圖片,我分別截取四周的局部圖片,放大比較來看。
左下角
??? 從上圖中可以發(fā)現(xiàn),黑色方塊靠近圖像中心的邊緣有點橙色,背離中心的邊緣呈現(xiàn)藍(lán)色。以左上角的黑色方塊為例,三種顏色分量的數(shù)值曲線有位移,如果其位移的規(guī)律按照figure4.3.3的形狀,那么剛好可以解釋邊緣偏色的情況。
????? 如果可以糾正這種位移,那么false color就可以明顯消除。從原理上分析,解決方法比較簡單,只要把B分量向著中心位置收縮,收縮的距離和像素到鏡頭中心的距離有關(guān),這可以通過數(shù)學(xué)建模得到(例如拋物線)。同樣R分量則要向外擴張,擴張的方式也一樣用數(shù)學(xué)建模得到。實現(xiàn)起來則有不小難度,畢竟像素是按照矩陣方式排列的,而收縮或者擴張是360度的,需要復(fù)雜的三角函數(shù)和數(shù)據(jù)流控制機制。
????? 對位移較小的false color處理起來相對容易,畢竟我們已知其規(guī)律,并且有周邊像素作為參考。對于較大范圍的false color(上圖中位移較大的情況)則難有很好的解決方法,因為在當(dāng)前像素的一個小范圍內(nèi)都是異常的色彩,無法分辨到底是true or false。
4.5小結(jié)
???? 細(xì)節(jié)相關(guān)的function都比較復(fù)雜,較難像色彩和亮度那樣直觀的理解。我自己感覺細(xì)節(jié)設(shè)計其實就是數(shù)學(xué)和信號處理,需要細(xì)致的思考和探究,種種現(xiàn)象都可以從數(shù)學(xué)上找到對應(yīng)的關(guān)系。另外像自動對焦Auto focus和縮放Zoom也和細(xì)節(jié)設(shè)計相關(guān),前者需要邊緣檢測,后者需要多采樣濾波。
轉(zhuǎn)載于http://www.eefocus.com/component/m/375610/r0#comment-171860
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的基于IC设计的实用ISP算法介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.4多媒体技术的发展历史
- 下一篇: Intel(R) Matrix Stor