burg算法的matlab代码实现_导向滤波算法及其matlab代码实现
導向濾波同樣是一種平滑濾波算法,其與最小二乘濾波和雙邊濾波相比,同樣是一種具有邊緣保持的功能的圖形濾波算法,可以用于處理圖形噪點較多的圖像,而且此種濾波算法與最小二乘濾波和雙邊濾波相比,有其獨特的特點,讓我們來首先簡述一下其濾波的基本原理:
濾波過程示意圖這是來源于Kaiming He(何愷明教授)其文章中的原理圖,其中的p為輸入圖像,其中的q為輸出圖像,I為輸入的引導圖像,其中引導圖像經過一個雙邊濾波核與輸入圖像進行結合,最終獲得輸出的圖像。
導向濾波其基本的算法原理可以見下圖:
算法原理其中輸出圖像q有:
其中的輸出圖像q又有如下表達:
我們可以看到的是Wij為權值,這個權值限定了圖像q的輸出,而這個權值的來源是引導圖像I,所以W是一個與I有關的數值,且其為一個濾波核,其中i與j為圖像的像素坐標引導,由此表達式我們可以直觀的看出,輸出圖像和輸入圖像p,存在的是一種線性關系。
在導向濾波中,核心的假設在于,在一個以k為核心的處理窗口中,輸出圖像的q是一種線性的模式,也即:
其中的ak和bk為窗口中的常系數,同時我們需要設定一個正方形的窗格,此窗格的半徑為r。同時ak和bk的來源,我們都通過上文得知,其由輸入的圖像來進行限制,我們認為,輸出的圖像是輸入圖像減去噪聲而形成的,故有:
其中的ni為圖像中的噪聲,而我們需要將此圖像中的噪聲降低到最低,所以需要找到一種比較好的方法來達到這一點:
我們可以看到上式為一個關于ak和bk的像素損失函數,同時我們又有一個調整參數,我們將調整參數設定為e,這個調整參數限定了ak。在何凱明教授之后的文中提到,此函數是一種脊回歸模型,我們可以獲取ak和bk其顯式解為:
其中uk為引導圖I中的窗口中的像素均值,而
為窗口中的像素方差,而下式的e則為調整參數,而w為窗口的像素點的個數,而下式中的pk為:
那么當我們將此應用于具體的圖像中時,對于一個N*N的處理窗格,一個像素點就會被包含N次,也即我們需要利用w,來進行取均值的處理:
同時我們注意到ak和bk,所以我們可以將上式改寫為:
這樣我們就建立了一個,從p,再依據I,最后到q的一種映射的過程,這也就是導向濾波整體算法原理,而當我們的導向圖I和輸入圖片為同一張圖片時,此種濾波算法就具有邊緣保持的能力。
我們總結一下此種算法即:其輸入端有4個輸入:
輸入圖像p,引導圖像I,處理窗口半徑r,調整參數e。
而其輸出為一張圖像:
輸出圖像q。
其具體的算法實現過程:
我們利用matlab進行對原始的噪點較多的圖形進行處理,首先我們是可以得知,此處我們輸入圖像和引導圖像為同一張圖像,此處我們設置三種窗口的規格
r0=2;r1=3;r2=4;
而對于調整參數,我們同樣設置三種:
Eps0=0.01,eps1=0.04,eps2=0.09;
故對于此濾波器的調用方式為:
subplot(3,3,1);
gfout1_1=guidedfilter(gfI,gfp,r0,eps0);
imshow(gfout1_1);
title('r=2,eps=0.01');
lena女神Guidedfilter.h: function q = guidedfilter(I, p, r, eps)% - guidance image: I (should be a gray-scale/single channel image) % - filtering input image: p (should be a gray-scale/single channel image) % - local window radius: r % - regularization parameter: eps[hei, wid] = size(I); N = boxfilter(ones(hei, wid), r); mean_I = boxfilter(I, r) ./ N; mean_p = boxfilter(p, r) ./ N; mean_Ip = boxfilter(I.*p, r) ./ N; % this is the covariance of (I, p) in each local patch. cov_Ip = mean_Ip - mean_I .* mean_p; mean_II = boxfilter(I.*I, r) ./ N; var_I = mean_II - mean_I .* mean_I;a = cov_Ip ./ (var_I + eps); b = mean_p - a .* mean_I; mean_a = boxfilter(a, r) ./ N; mean_b = boxfilter(b, r) ./ N;q = mean_a .* I + mean_b; endboxfilter.h: function imDst = boxfilter(imSrc, r)% BOXFILTER O(1) time box filtering using cumulative sum % % - Definition imDst(x, y)=sum(sum(imSrc(x-r:x+r,y-r:y+r))); % - Running time independent of r; % - Equivalent to the function: colfilt(imSrc, [2*r+1, 2*r+1], 'sliding', @sum); % - But much faster.[hei, wid] = size(imSrc); imDst = zeros(size(imSrc));%cumulative sum over Y axis imCum = cumsum(imSrc, 1); %difference over Y axis imDst(1:r+1, :) = imCum(1+r:2*r+1, :); imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :); imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);%cumulative sum over X axis imCum = cumsum(imDst, 2); %difference over Y axis imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1); imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1); imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1); end算法總體評價:導向濾波作為三大邊緣保持濾波器之一,其平滑效果和邊緣保持能力值得肯定,但是其同時因為其算法原因會產生光暈(halo)此點何愷明教授也在其文章中詳細說明,其與另外兩種邊緣保持濾波算法相比,其一大特點就在于其輸入,其輸入為一張輸入圖像和一張引導圖像,所以這點是一個非常鮮明的特點,同時需注意的是,要是其存在邊緣保持的濾波效果,需要使引導圖像和輸入圖像為同一張圖像,而且其處理窗口和損失參數的設置對其濾波效果的影響較大,此點可詳見上文。
參考文獻
____________________________________________________________________________________________
- Guided Image Filtering, by Kaiming He, Jian Sun, and Xiaoou Tang, in TPAMI 2013.
SANGHUSUN
2020.02.10
總結
以上是生活随笔為你收集整理的burg算法的matlab代码实现_导向滤波算法及其matlab代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为钱包可借款?内部人士回应:不参与实际
- 下一篇: 法拉第未来迎来历史性时刻:FF 91 F