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