1. 程式人生 > >影象處理的幾種濾波

影象處理的幾種濾波

均值濾波

均值濾波,是影象處理中最常用的手段,從頻率域觀點來看均值濾波是一種低通濾波器,高頻訊號將會去掉,因此可以幫助消除影象尖銳噪聲,實現影象平滑,模糊等功能。理想的均值濾波是用每個畫素和它周圍畫素計算出來的平均值替換影象中每個畫素。取樣Kernel資料通常是3X3的矩陣,如下表示:

從左到右從上到下計算影象中的每個畫素,最終得到處理後的影象。均值濾波可以加上兩個引數,即迭代次數,Kernel資料大小。一個相同的Kernel,但是多次迭代就會效果越來越好。同樣,迭代次數相同,Kernel矩陣越大,均值濾波的效果就越明顯。


中值濾波

中值濾波也是消除影象噪聲最常見的手段之一,特別是消除椒鹽噪聲,中值濾波的效果要比均值濾波更好。中值濾波是跟均值濾波唯一不同是,不是用均值來替換中心每個畫素,而是將周圍畫素和中心畫素排序以後,取中值,一個3X3大小的中值濾波如下:

 


最大最小值濾波

最大最小值濾波是一種比較保守的影象處理手段,與中值濾波類似,首先要排序周圍畫素和中心畫素值,然後將中心畫素值與最小和最大畫素值比較,如果比最小值小,則替換中心畫素為最小值,如果中心畫素比最大值大,則替換中心畫素為最大值。一個Kernel矩陣為3X3的最大最小值濾波如下:

 


雙邊濾波

一種同時考慮了畫素空間差異與強度差異的濾波器,因此具有保持影象邊緣的特性。

先看看高斯濾波器


其中W是權重,i和j是畫素索引,K是歸一化常量。公式中可以看出,權重只和畫素之間的空間距離有關係,無論影象的內容是什麼,都有相同的濾波效果。

再來看看雙邊濾波器,它只是在原有高斯函式的基礎上加了一項,如下


其中 I 是畫素的強度值,所以在強度差距大的地方(邊緣),權重會減小,濾波效應也就變小。總體而言,在畫素強度變換不大的區域,雙邊濾波有類似於高斯濾波的效果,而在影象邊緣等強度梯度較大的地方,可以保持梯度

引導濾波

與雙邊濾波最大的相似之處,就是同樣具有保持邊緣特性。在引導濾波的定義中,用到了區域性線性模型,至於該模型,可以暫時用下圖簡單的理解


該模型認為,某函式上一點與其鄰近部分的點成線性關係,一個複雜的函式就可以用很多區域性的線性函式來表示,當需要求該函式上某一點的值時,只需計算所有包含該點的線性函式的值並做平均即可。這種模型,在表示非解析函式上,非常有用。

同理,我們可以認為影象是一個二維函式,而且沒法寫出解析表示式,因此我們假設該函式的輸出與輸入在一個二維視窗內滿足線性關係,如下


其中,q是輸出畫素的值,I是輸入影象的值,i和k是畫素索引,a和b是當視窗中心位於k時該線性函式的係數。其實,輸入影象不一定是待濾波的影象本身,也可以是其他影象即引導影象,這也是為何稱為引導濾波的原因。對上式兩邊取梯度,可以得到


即當輸入影象I有梯度時,輸出q也有類似的梯度,現在可以解釋為什麼引導濾波有邊緣保持特性了。

下一步是求出線性函式的係數,也就是線性迴歸,即希望擬合函式的輸出值與真實值p之間的差距最小,也就是讓下式最小


這裡p只能是待濾波影象,並不像I那樣可以是其他影象。同時,a之前的係數(以後都寫為e)用於防止求得的a過大,也是調節濾波器濾波效果的重要引數。通過最小二乘法,我們可以得到


其中,是I在視窗w_k中的平均值,是I在視窗w_k中的方差,是視窗w_k中畫素的數量,是待濾波影象p在視窗w_k中的均值。

在計算每個視窗的線性係數時,我們可以發現一個畫素會被多個視窗包含,也就是說,每個畫素都由多個線性函式所描述。因此,如之前所說,要具體求某一點的輸出值時,只需將所有包含該點的線性函式值平均即可,如下


這裡,w_k是所有包含畫素i的視窗,k是其中心位置。

當把引導濾波用作邊緣保持濾波器時,往往有 I = p ,如果e=0,顯然a=1, b=0是E(a,b)為最小值的解,從上式可以看出,這時的濾波器沒有任何作用,將輸入原封不動的輸出。如果e>0,在畫素強度變化小的區域(或單色區域),有a近似於(或等於)0,而b近似於(或等於),即做了一個加權均值濾波;而在變化大的區域,a近似於1,b近似於0,對影象的濾波效果很弱,有助於保持邊緣。而e的作用就是界定什麼是變化大,什麼是變化小。在視窗大小不變的情況下,隨著e的增大,濾波效果越明顯。

在濾波效果上,引導濾波和雙邊濾波差不多,在一些細節上,引導濾波較好。引導濾波最大的優勢在於,可以寫出時間複雜度與視窗大小無關的演算法,因此在使用大視窗處理圖片時,其效率更高。


def guidedfilter(I,p,r,eps):
    '''I:引導圖圖;
    p:輸入圖(p=I);
    r :半徑:
    eps:regulation 
    f:為視窗半徑為r的均值濾波器;
    corr:相關;
    var:方差;
    cov:協方差
    '''
    height,width = I.reshape()
    m_I = cv2.boxFilter(I,-1,(r,r))  #f_mean(I) 均值濾波blur和盒式濾波一樣
    m_p = cv2.boxFilter(p,-1,(r,r))  #f_mean(p)


    m_II = cv2.boxFilter(I*I,-1,(r,r)) #f_mean(I.*I)
    m_Ip = cv2.boxFilter(I * p, -1, (r, r))  #f_mean(I.*p)

    var_I = m_II-m_I*m_I   #求方差:corr_I -mean_I.*mean_I
    cov_Ip = m_Ip - m_I * m_p  #協方差: #cov_Ip-mean_I.*mean_p

    a = cov_Ip/(var_I+eps)  #cov_Ip./(var_I+eps)
    b = m_p-a*m_I   #mean_p -a.*mean_I
    m_a = cv2.boxFilter(a,-1,(r,r))  #mean_a
    m_b = cv2.boxFilter(b,-1,(r,r))  #mean_b
    return m_a*I+m_b