均值、中值、高斯、non-local means算法詳解

文章僅爲個人理解,如有不妥之處歡迎指正。

寫幾個常見的圖像去噪濾波器。
1、均值濾波器
均值濾波器是最簡單的圖像平滑濾波器,其3*3的模板爲19[111111111]\frac{1}{9} \left[ \begin{matrix}1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] 模板中心的濾波值是模板內像素點的平均值,過程如下圖,填充幾行由模板大小來決定。如果想濾波輸出與原圖像大小一致,填充是必須的,下文中就不再贅述了。

在這裏插入圖片描述
2、中值濾波器
中值濾波器是對模板內的像素值進行排序,然後選取中值作爲模板中心的濾波值,均值噪聲能有效去除椒鹽噪聲。
中值濾波
3、高斯濾波器
高斯濾波器是一種線性濾波器,能夠有效的抑制噪聲,平滑圖像。其作用原理和均值濾波器類似,都是取濾波器窗口內的像素的均值作爲輸出。其窗口模板的係數和均值濾波器不同,均值濾波器的模板係數都是相同的爲1;而高斯濾波器的模板係數,則隨着距離模板中心的增大而係數減小。所以,高斯濾波器相比於均值濾波器對圖像個模糊程度較小。
高斯模板的係數計算公式爲:h(x,y)=ex2+y22σ2h(\triangle x,\triangle y)=e^{-\frac{\triangle x^2+\triangle y^2}{2\sigma^2}}其中,x,y\triangle x,\triangle y分別時模板內像素點到模板中心的相對距離。
以3*3高斯濾波器爲例,取σ=0.8\sigma=0.8,其上式計算得模板係數爲: [0.05210.11390.05210.11390.24870.11390.05210.113910.0521]\ \left[ \begin{matrix}0.0521 & 0.1139 & 0.0521 \\ 0.1139 & 0.2487 & 0.1139 \\ 0.0521 &0.11391 & 0.0521 \end{matrix} \right]

需要注意的是,最後歸一化的過程,使用模板左上角的係數的倒數作爲歸一化的係數(左上角的係數值被歸一化爲1),模板中的每個係數都乘以該值(左上角係數的倒數),然後將得到的值取整,就得到了整數型的高斯濾波器模板,就是我們常見的整數型3*3高斯濾波模板:116[121242121]\frac{1}{16}\left[ \begin{matrix}1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{matrix} \right] 高斯濾波器模板係數與標準差σ\sigma有着很大的關係,當σ\sigma取很小的值時,只有模板中心的值接近於1,其餘的接近於0;當σ\sigma取很大值時,模板係數全接近於1,相當於均值濾波。
在這裏插入圖片描述
上圖可以看到,隨着σ\sigma的增大,圖像去噪效果是明顯了,但同時圖像也更模糊了,這就需要我們在實際應用的時候平衡去噪效果和模糊程度。此外,模板尺寸越大,圖像也會更模糊,去噪效果也會更好。

4、NLM算法
NLM全稱爲non-local means,顧名思義,它是非局部平均算法,上面幾個算法都是利用濾波點周圍幾個像素點進行濾波,NLM對每個濾波點都利用了整張圖像的信息。比如,要對像素點ii做NLM處理,先遍歷整張圖像,求出ii與其他像素點的相似度,相似度越大,權重越大,最後再對整張圖像的像素點進行加權平均,就得到ii的濾波值。該方法充分利用了圖像中的冗餘信息,在去噪的同時能最大程度地保持圖像的細節特徵。
定義:假設vv是帶噪聲的圖像,v={v(i),iI}v=\{ v(i),i∈I\}NL(i)NL(i)表示對像素點ii的濾波值,就有:NL(i)=jIw(i,j)v(j)NL(i)=\sum_{j∈I}w(i,j)v(j) 0w(i,j)1jIw(i,j)=1且,0≤w(i,j)≤1,\sum_{j∈I}w(i,j)=1其中,v(j)v(j)表示像素點ii的灰度值,注意jIj∈I,要遍歷整張圖像,w(i,j)w(i,j)v(j)v(j)的權重,由i,ji,j兩像素點之間的相似度來得到。
如果僅僅比較i,ji,j像素值來作爲相似度的依據,不能正確反映i,ji,j的關係,所以算法提出者利用N(i),N(j)N(i),N(j)的歐式距離來衡量相似度,N(i),N(j)N(i),N(j)分別表示i,ji,j領域像素點,鄰域大小可以自己選擇;在這裏插入圖片描述
進一步就可以得到w(i,j)=1CeN(i)N(j)2h2w(i,j)=\frac{1}{C}e^{\frac{||N(i)-N(j)||_2}{h^2}} C=jIeN(i)N(j)2h2C=\sum_{j∈I}e^{\frac{||N(i)-N(j)||_2}{h^2}}其中,N(i)N(j)2||N(i)-N(j)||_2就是歐式距離,hh爲濾波器參數,引入C是爲了歸一化。
由上式可以看出,當ii的鄰域和jj的鄰域相似度高的時候,v(j)v(j)的加權係數w(i,j)w(i,j)也會比較大,下圖中,明顯可以看出q1q1點、q2q2點的鄰域與pp點鄰域比較相似,所以w(p,q1)w(p,q2)w(p,q1)、w(p,q2)比較大,而q3q3的鄰域與pp差別較大,所以w(q,p3)w(q,p3)就很小。
在這裏插入圖片描述
上面說過,對於每個ii,濾波值NL(i)NL(i)都需要用到整個的圖像,這樣就導致算法複雜度特別高,運算非常緩慢,所以通常在應用的時候,會選定一個搜索區域,在搜索區域內計算相似度,然後加權平均,而不是遍歷整個圖像了。在這裏插入圖片描述
上面圖像我選取鄰域大小33,搜索區域77,小於論文原文使用的77鄰域和2121搜索區域,即便如此,處理這幅512*512的圖像也需要兩分鐘。
對於參數hh的選取,論文原文給出了選取規則,h=10σh=10\sigmaσ\sigma表示噪聲標準差。但實際應用的時候,我發現hh的選取並不需要那麼嚴格,只要別選的太大或者太小就行。hh很大的時候,NLM就接近於均值濾波器了。

5、 改進的NLM算法
針對NLM算法耗時太長的問題,論文Parameter-Free Fast Pixelwise Non-Local Means Denoising 提出了改進算法,在另一位博主文章積分圖像的應用(二):非局部均值去噪(NL-means)中對論文做了一定的解釋,但是還是挺難懂的,我僅在此補充一些個人理解。在此之前你需要了解積分圖像。
在這裏插入圖片描述上圖中,左邊是經典NLM算法流程,右邊是改進後的大致流程。
我的理解:經典NLM對一個像素點點濾波完全結束後,纔會進行對下一個像素點的濾波;而改進的NLM不是這樣,它每次求出每個像素點鄰域內的一個權重,而且相對位置(圖中的(k,l)(k,l))是一樣的,然後遍歷整個鄰域位置,求出剩下權重,這樣就得到了全部權重,在得到全部權重的同時,完成對整個圖像的濾波,在此之前不會有任何像素點完成濾波,這一過程的實現需要用到積分圖像。可以把經典NLM看成“串行”計算,那麼改進NLM就是“並行”計算。
舉個例子,看上圖右上角的小圖,經典NLM需要把鄰域內25個權重都求出來,並且進行加權平均,才能對下一個像素進行濾波;改進的NLM每次求得所有像素點相對位置爲(k,l)(k,l)那一像素值的權重。
在這裏插入圖片描述
上圖是濾波結果圖像,改進之後的NLM與經典NLM效果是一模一樣的,但是耗時卻大大下降了,因爲核心思想是沒變的,只是不同的實現過程。

用語言還是挺難完全說清楚的,以上只是幫助理解,想真正搞清楚還需要看源碼,我把整篇文章的代碼都放在這裏了,可免費下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章