圖像處理與RTL硬件實現(xiàn)|第2章:高斯濾波

1. 高斯濾波原理
高斯濾波器的本質(zhì)是一個二維低通系統(tǒng),它通常是以一個矩陣的形式出現(xiàn),比如式(1)這個5×5高斯核(又稱為kernel),用它對圖像做卷積,圖像的高頻分量會被打到低頻,最終呈現(xiàn)的效果就是圖像變模糊了。
生成它的是一個以e為底的指數(shù)函數(shù),通常用exp來標識,如(2)所示:
公式(2)就是常見的二維高斯函數(shù),它是一個和距離有關(guān)的函數(shù),以5×5的窗口大小為例,中心點作為坐標原點,x和y分別代表橫縱坐標,其坐標如下圖1(a)所示,x2+y2是當前坐標到圓心的歐式距離(高斯核的旋轉(zhuǎn)對稱性由此而來),x2+y2的結(jié)果如下圖1(b)所示,離中心點越遠,x2+y2的值越大。

0<1/e<1,所以f(x,y)是個單調(diào)減函數(shù),那么x2+y2的值越大,求出的值就會越小,所以高斯核呈現(xiàn)出中心點權(quán)重最大,依次向四周遞減的形狀。
公式里還有一個變量σ(方差),方差的物理意義是描述一組數(shù)據(jù)的分散程度,方差越小,數(shù)據(jù)就越聚攏;方差越大,數(shù)據(jù)就越分散。對高斯公式來說,σ越小,窗口內(nèi)權(quán)重越聚攏,得到的圖像就越清晰;σ越大,窗口內(nèi)權(quán)重越分散,得到的圖像就越模糊??梢該Q個角度來理解它,如果窗口內(nèi)的能量值固定為1,分配的越集中,每個位置能分到的能量就越多,高斯的波峰就會越高;分配的越分散,每個位置能分到的能量就越少,高斯的波峰就會越低,所以高斯的極限情況就是均值,所有的位置分配到了相同的能量。
為了進一步觀察窗口大小和σ之間的關(guān)系,用matlab寫一段代碼做個實驗,分別配置不同的窗口大小win_m、win_n和sigma,顯示出16個gauss kernel的三維分布圖,如圖2所示:

圖2有一個需要注意的地方,以sigma=1這列的三維圖為例,直觀感受會覺得窗口越小,高斯權(quán)重越分散,窗口越大,高斯權(quán)重越集中,好像在sigma一樣的情況下,5×5窗口對圖像的模糊力度似乎要比17×17的更佳?其實不是的,這里要注意三維圖的坐標,把sigma=1時5×5和17×17的三維圖單獨放大一下,如下圖3所示,右圖的17×17其實也只顯示了5×5的范圍,超過5×5的部分差不多被抑制為0了,所以理論上這兩個窗口的模糊力度應(yīng)該差不多。

再看一下sigma=10的情況,同樣是5×5和17×17的對比,把圖放大如下圖4所示,這個就更明顯了,直觀上好像5×5比17×17更分散,但是看坐標軸就能發(fā)現(xiàn),17×17的范圍顯然更大,而且z軸顯示出的歸一化權(quán)重也說明了這個問題,和5×5相比,17×17的權(quán)重更小一些,在窗口能量為1的情況下,窗口越大,每個位置能分到的能量也就越少,所以17×17的波峰要比5×5低。

從以上的分析可以看出,如果選擇了一個較大的窗口,要把sigma配置的大一些,才能發(fā)揮出大窗口的模糊效果,而且大窗口相對小窗口的調(diào)試范圍更大,可以滿足多種需求。
2. 圖像處理效果與對比
更進一步的,用以上16個kernel分別對下面的Lena圖進行高斯濾波(代碼在附錄中,需要可自行下載),做個濾波效果的對比。從圖5上看,sigma=10且窗口17×17的模糊效果最好;sigma=1時,受sigma分散度的限制,即使是大一些的窗口,也沒能發(fā)揮出更模糊的濾波效果,這很符合上面對高斯公式的分析。由此也能看出,如果對kernel的性質(zhì)掌握的足夠,是可以通過配置直接判斷圖像處理效果的。
進一步解釋圖像高斯濾波,其本質(zhì)是圖像和高斯核的二維卷積,以5×5高斯核為例,按照從上到下從左到右的順序,每次取圖像中一個5×5的窗口數(shù)據(jù)與高斯核進行卷積(乘加計算),得到的最終結(jié)果就是當前中心點的高斯濾波結(jié)果。圖像四周的邊界上會存在缺數(shù)據(jù)的情況,一般的做法是復(fù)制最邊界的圖像,如果窗口是5×5,那就是圖像的上下左右邊界各擴邊2次。

高斯核給中心點像素分配最大權(quán)重,周圍的權(quán)重離中心點的距離越遠其值越小,對于圖像細節(jié)來說,可以更好的被保留下來,而不是像均值濾波那樣被一視同仁的全部抹平。另外,高斯卷積核是實現(xiàn)尺度變換的唯一變換核,并且是唯一的線性核,這個后面如果有需要可以拿出來再詳細解釋一下。
3. 高斯kernel定點化
用公式(2)生成的5×5高斯核是一堆浮點數(shù)據(jù),假設(shè)生成的高斯kernel如式(4)所示(已歸一化)。
但是硬件是不能直接處理浮點數(shù)據(jù)的,需要對式(4)做個定點化,也就是給它乘以一個整數(shù),然后四舍五入取整。為了保證輸出圖像和輸入圖像的位寬一致,最后這個乘進來的整數(shù)是要在濾波后除掉的(歸一化),所以這個整數(shù)取2的n次方最合適,此時濾波后只要對結(jié)果右移n位就可以了。選擇n=8,也就是2^8=256對gaus_kernel做定點,就可以得到式(1)的結(jié)果。
另外二維高斯核還能拆成兩個一維高斯核相乘的樣子,如式(5)所示,這是個非常優(yōu)良的性質(zhì),在RTL硬件實現(xiàn)的時候可以節(jié)省功耗和面積,先寫在這里,后面再詳細介紹。
附錄: