【轉】基於IC設計的實用ISP介紹

来源:https://www.cnblogs.com/andrew-pig-76/archive/2018/04/19/8884187.html
-Advertisement-
Play Games

前言: 這篇文章是我從事ISP研究數年來的一些經驗總結,沒有用到深奧的理論知識,有的只是根據實際狀況來處理的一些常規方法,以及曾經犯過的錯誤總結。我想把ISP function的原理用簡單淺顯的語言描述出來,希望對初學者有所幫助。這裡的ISP主要是指從CMOS sensor輸出的bayer patt ...


前言:
        這篇文章是我從事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

轉載於https://blog.csdn.net/lz0499/article/details/76795981

如有侵權,請通知,立即刪除。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 16 Managing Undo 官網:http://docs.oracle.com/cd/E11882_01/server.112/e25494/undo.htm#ADMIN013 從Oracle11g開始,在預設安裝中oracle會自動管理undo, 典型安裝中不需要DBA介入配置,然而,如果選 ...
  • 並行複製從庫更新的記錄不存在實際卻存在 背景 開了並行複製的半同步從庫SQL 線程報1032錯誤,非同步複製從庫沒有報錯,偶爾會出現這種 分析 版本mysql 5.7.16 mysql show variables like '%slave_para%'; + + + | Variable_name ...
  • 並行複製從庫發生自動重啟分析 背景 半同步複製從庫在晚上凌晨2點半發生自動重啟,另一個非同步複製從庫在第二天凌晨3點也發生了自動重啟。 分析 版本mysql 5.7.16 mysql show variables like '%slave_para%'; + + + | Variable_name | ...
  • Getting Started Getting Started. 1 1. Introduction. 1 2.Quick Start-Strandalone HBase. 1 2.1 JDK版本選擇... 1 2.2 Get Started With HBase. 1 2.3 偽分散式本地安裝.. ...
  • 正則表達式通常稱為regexes,是文本處理中模式匹配的一個標準,也是處理字元串的一個強有力的工具。使用正則表達式時,需要指定一個字元串作為模式串去檢索目標字元串。你可以使用正則表達式來查找字元串中匹配該正則表達式表示的模式的子串,也可以進行文本替換或者從目標文本中提取子串。 參考資料《iOS編程指 ...
  • 一個曲線 圖例: 多個曲線 圖例: ...
  • 一個簡單的界面: item.xml: 代碼: 開許可權: ...
  • 首先,我們都知道NSObject是大多數類的根類,但是,這個類的是怎麼實現的呢?我們可以去下載開源的Runtime源碼,探究下NSObject類的實現。 1. NSObject.h文件 我們可以直接使用Command點NSOject進去看到它的頭文件,可以看到,NSObject.h文件中有兩塊內容: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...