matlab練習程序(各向異性擴散)


主要是用來平滑圖像的,克服了高斯模糊的缺陷,各向異性擴散在平滑圖像時是保留圖像邊緣的(和雙邊濾波很像)。

通常我們有將圖像看作矩陣的,看作圖的,看作隨機過程的,記得過去還有看作力場的。

這次新鮮,將圖像看作熱量場了。每個像素看作熱流,根據當前像素和周圍像素的關系,來確定是否要向周圍擴散。比如某個鄰域像素和當前像素差別較大,則代表這個鄰域像素很可能是個邊界,那么當前像素就不向這個方向擴散了,這個邊界也就得到保留了。

先看下效果吧:

具體的推導公式都是熱學上的,自己也不太熟悉,感興趣的可以去看原論文,引用量超7000吶。

我這里只介紹一下最終結論用到的公式。

主要迭代方程如下:

 I就是圖像了,因為是個迭代公式,所以有迭代次數t。

四個散度公式是在四個方向上對當前像素求偏導,news就是東南西北嘛,公式如下:

 而cN/cS/cE/cW則代表四個方向上的導熱系數,邊界的導熱系數都是小的。公式如下:

 

 最后整個公式需要先前設置的參數主要有三個,迭代次數t,根據情況設置;導熱系數相關的k,取值越大越平滑,越不易保留邊緣;lambda同樣也是取值越大越平滑。

最后是matlab代碼:

clear all;
close all;
clc;

k=15;           %導熱系數,控制平滑
lambda=0.15;    %控制平滑
N=20;           %迭代次數
img=double(imread('lena.jpg'));
imshow(img,[]);
[m n]=size(img);

imgn=zeros(m,n);
for i=1:N

    for p=2:m-1
        for q=2:n-1
            %當前像素的散度,對四個方向分別求偏導,局部不同方向上的變化量,
            %如果變化較多,就證明是邊界,想方法保留邊界
            NI=img(p-1,q)-img(p,q);
            SI=img(p+1,q)-img(p,q);
            EI=img(p,q-1)-img(p,q);
            WI=img(p,q+1)-img(p,q);
            
            %四個方向上的導熱系數,該方向變化越大,求得的值越小,從而達到保留邊界的目的
            cN=exp(-NI^2/(k*k));
            cS=exp(-SI^2/(k*k));
            cE=exp(-EI^2/(k*k));
            cW=exp(-WI^2/(k*k));
            
            imgn(p,q)=img(p,q)+lambda*(cN*NI+cS*SI+cE*EI+cW*WI);  %擴散后的新值      
        end
    end
    
    img=imgn;       %整個圖像擴散完畢,用已擴散圖像的重新擴散。
end

figure;
imshow(imgn,[]);

參考:

《特征提取與圖像處理(第二版)》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM