前言: 這篇文章是我從事ISP研究數(shù)年來的一些經(jīng)驗總結(jié),沒有用到深奧的理論知識,有的只是根據(jù)實際狀況來處理的一些常規(guī)方法,以及曾經(jīng)犯過的錯誤總結(jié)。我想把ISP function的原理用簡單淺顯的語言描述出來,希望對初學者有所幫助。這里的ISP主要是指從CMOS sensor輸出的bayer pattern,到轉(zhuǎn)換成通用的YUV或者YCbCr格式的過程,通常用于USB攝像頭/監(jiān)控攝像頭/手機/平板等芯片設(shè)計中。
4.細節(jié) 細節(jié)部分會介紹去噪denoise,Bayer pattern 轉(zhuǎn) RGB(即interpolation),Edge enhance(即Sharp)以及邊緣偽彩色false color。這部分內(nèi)容是ISP中最復雜的,需要較龐大的計算量和Memory。任何一個function都可以在網(wǎng)上找到不少的論文,這里我只說明一些基本原理和關(guān)鍵因素,不討論詳細的實現(xiàn)算法。 首先我們把Noise 分成三類,分別是高斯白噪聲,壞點,受傷點。這三類分別有不同的處理方法。 我所知道的可用于ISP中去除Noise的方法大概有以下一些分類(沒有廣泛研究過,肯定有疏漏,請包涵)。 1.首先是空間域和時間域的劃分。圖像是二維的,空間域是指僅對一幅圖像中的二維數(shù)據(jù)處理,一般照片的去噪都是在二維空間域。時間域是指多幀圖像之間的去噪,在視頻中,前后Frame有著較大的相關(guān)性,對于靜態(tài)場景來說就更加明顯。空間域去噪算法需要考慮的是Noise和圖像清晰度之間的權(quán)衡,而時間域去噪算法需要考慮的是Noise和移動物體的拖尾殘影現(xiàn)象的權(quán)衡。 2.其次是基于位置和基于數(shù)值的劃分。要消除Noise,一般人第一個想到的方法就是低通濾波器,以當前像素為中心,選擇一個一定范圍的中心對稱的低通濾波器,到中心距離越近,對應位置像素的weighting越高,越遠則越小,這就是基于位置的方法。另外一種是基于數(shù)值的方法,先同樣選擇以當前像素為中心的一個范圍,把這個范圍內(nèi)的像素按照數(shù)值大小來排成一個序列,然后再做處理,處理的方法可以是直接選擇某些點(例如最大值/最小值替換,中值濾波),也可以對這個序列再做低通濾波計算。鼎鼎有名的雙邊濾波就是結(jié)合了位置和數(shù)值兩種思想合二為一的算法,不過其公式計算太過復雜,不適合數(shù)字電路設(shè)計實現(xiàn),但是其思想是完全可以借用的。 3.各種變換域的處理方法。例如傅立葉變換,離散余弦變換,最有名的就是小波變換。這些域變換的基本原理都差不多,基于人眼對高頻分量較不敏感的特性,對轉(zhuǎn)換域中的部分數(shù)據(jù)進行歸0或者縮小,以達到消除Noise(或者圖像壓縮)的目的。小波變換效果較好,不過由于計算量很大,在ISP中實現(xiàn)有很大的難度。 在實際應用中,變換域的方法太過復雜,不適合實時視頻處理,所以常用的還是上面兩大類方法。一般來說Noise的幅度總是有限度的,和實際景物邊緣的變化程度有較大差距,所以通常會在平坦區(qū)域盡可能的多消除noise, 而在物體邊緣則盡量保護景物細節(jié),少做denoise處理,根據(jù)景物內(nèi)容動態(tài)調(diào)整去噪算法是必須的。在另一方面,Noise的幅度大小和sensor的增益相關(guān),當環(huán)境變換導致AE gain變化的時候,Noise的幅度變化非常大,有些sensor在低光照條件下會有64倍的AE gain,Noise滿屏跳躍,幾乎掩蓋實際景物。有時候常會說“評價ISP好壞,就是看暗光情況下的Noise大小”,不同的Noise 幅度意味著不同的ISP算法(或者算法中的參數(shù)),所以還需要SW根據(jù)實際情況來動態(tài)調(diào)整去噪算法。因此,在真實的ISP電路設(shè)計中,去噪算法的多樣性和可調(diào)整性是非常必要的。
Figure4.1.1 空間域去噪效果
除了去噪算法以外,抑制Noise根源也是去噪的一個重要手段。Noise本身無處不在,問題根源在于Noise被不斷放大,也就是各種增益Gain(或者說乘法)把Noise放大了許多倍。為了達到一定的亮度,Sensor的AE gain通常沒有辦法改變,能改變的只有ISP自身。常用的抑制Noise手段包括:
去噪方法可以說是ISP中牽涉最廣,實現(xiàn)難度最大的一個功能,它滲透進AE,LSC,Gamma,AWB,interpolation,edge enhance等多個function,是一個系統(tǒng)工程。
4.2 Interpolation 這里說的interpolation是指把Bayer pattern data 轉(zhuǎn)化為RGB data的過程,每個像素都要有完整的[R G B]三個分量。先看一下最簡單的雙線性插值算法。
Figure4.2.1 雙線性插值
這是最簡單原始的方法,確實可以得到一幅RGB圖像,不過存在一些問題,例如拉鏈現(xiàn)象,有些模糊,分辨率不高,邊緣有些彩色(false color)等。評價插值算法的好壞,通常用ISO12233測試紙,如下圖。
Figure4.2.2 ISO12233測試紙 觀察細節(jié)算法的好壞,必須把圖像放大到像素級別,直接研究數(shù)值大小,下面以拉鏈現(xiàn)象為例。拉鏈現(xiàn)象出現(xiàn)在水平或者垂直的邊緣上,是由于G分量計算不當所致。以一條水平邊為例,如下圖,用雙線性插值的話,在水平邊緣上就會出現(xiàn)[90, 82.5, 90, 82.5…]這樣的循環(huán)重復規(guī)律。
Figure4.2.3 從圖像效果來看就是類似拉鏈狀。
Figure4.2.4 拉鏈現(xiàn)象(雙線性插值和沿著edge方向插值)
要解決拉鏈現(xiàn)象,保持邊緣的光滑,很直觀的想法就是對G分量采取沿著邊緣方向去插值,在上圖中,就讓G5 =(G4 + G6)/2。這樣就意味著要做邊緣方向性的判斷,如果是垂直邊,那么就會是G=(G2+G8)/2,還有各種其他方向,則可以對周邊四個G分量采用不同的加權(quán)平均算法得到中心點G分量數(shù)值。邊緣方向判斷是interpolation算法中最重要的一個環(huán)節(jié),是各家ISP算法的核心之一,有興趣的同學可以查看這個方面的論文。評價圖像分辨率(清晰度)的一個指標,是看ISO12233中對細密紋理的識別程度。一個好的算法可以判斷出只有一個像素寬度的細條紋。
Figure4.2.5 interpolation識別細密紋理 在Bayer pattern中,一半像素是G,R和B都只占1/4,R和B信息缺失比較嚴重。在雙線性插值算法中,R分量的計算只和周圍的R相關(guān),如果用G分量的信息去修正缺失的R分量,那么清晰度會有不小的提升。以水平方向的邊緣為例:
Figure4.2.6 水平edge上利用G分量修正R或B 上圖中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.3 Edge 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方向來做增強,增強的方法也很有難度,既要達到一定的銳利度MTF,又要解決邊緣粗糙roughness,overshot和undershot等問題。 邊緣增強一般在YCbCr空間進行,并且只對Y分量處理,Cb和Cr保持不變,其原理如下:
Figure4.3.1 edge enhance 原理
淺藍色為原值,深藍色為enhance之后的數(shù)值。從波形上看,edge enhance就是要讓線條的斜率更陡一些,甚至允許出現(xiàn)小幅度的過沖。從數(shù)值上來看,就是讓數(shù)據(jù)朝著遠離鄰近點均值的方向走,而且和鄰近點均值的差越大,走過的距離也越大,把當前像素值和鄰近點均值的差記為d;另外,edge enhance的幅度還和整個edge的變化范圍有關(guā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ù)學模型可以給出答案,只有仔細研究規(guī)律,多做實驗,可以說的是想要得到較好的視覺效果,這個模型非常復雜,參數(shù)眾多。通過不斷的對參數(shù)調(diào)試練習,慢慢建立起數(shù)學計算模型和實際圖像效果之間的映射關(guān)系,才能較好的平衡銳利度MTF和roughness,overshort,undershort等因素。 為了避免把Noise enhance出來,edge enhance在實現(xiàn)中還需要判斷當前像素處于光滑區(qū)域還是物體邊緣。當處于光滑區(qū)域的時候,則不要做edge enhance運算,或者做的幅度很??;只有在較明顯的邊緣上才做處理,這樣避免不了邊緣上的noise的影響,所以在銳利度s設(shè)定較大的時候,可以發(fā)現(xiàn)邊緣上會有Noise閃動跳躍的情況。為了緩解這種Noise的跳躍,通常會對f(d, g, s)做最大值和最小值限制保護,并且沿著edge 方向做低通濾波來緩解Noise。
Figure 4.3.2 egde enhance 前后效果比對 整個Edge enhance的大致流程為先判斷平坦區(qū)域還是邊緣,對平坦區(qū)域可以不做或者少做edge enhance(甚至做smooth處理),對邊緣要判斷幅度大小,邊緣方向,選則相對應的高通濾波器處理,最后對enhance的幅度做一定程度的保護處理。
4.4 False color False color一般出現(xiàn)在物體邊緣上,特別是白紙黑字。如下,白紙上的黑色線條,一側(cè)偏黃,一側(cè)偏藍。
Figure 4.4.1 放大后的false color現(xiàn)象
Figure 4.3.2 flase color呈現(xiàn)中心對稱的特點
Figure4.3.3 RGB曲線位移 細節(jié)相關(guān)的function都比較復雜,較難像色彩和亮度那樣直觀的理解。我自己感覺細節(jié)設(shè)計其實就是數(shù)學和信號處理,需要細致的思考和探究,種種現(xiàn)象都可以從數(shù)學上找到對應的關(guān)系。另外像自動對焦Auto focus和縮放Zoom也和細節(jié)設(shè)計相關(guān),前者需要邊緣檢測,后者需要多采樣濾波。
|
|