1. 程式人生 > >matlab實現各向異性擴散

matlab實現各向異性擴散

看書一直不理解各向異性擴散究竟是什麼,直到看了某大佬的解釋:

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

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

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

matlab指令碼

pic = imread('C:\Users\lenovo\Desktop\素材\test.jpg', 'jpg');
pic = rgb2gray(pic);
picNew = PM(pic);
figure;
imshow(pic);
title('原圖');
figure;
imshow(picNew);
title('各向異性擴散');

matlab各向異性擴散函式

function newPic = PM(pic)
[m n] = size(pic);
lambda = 0.15;
K = 15;
N = 20;
newPic = zeros(m, n);
pic = double(pic);
for t = 1 : N
    for i = 2 : m-1
        for j = 2 : n-1
            NI = pic(i-1, j) - pic(i, j);
            SI = pic(i+1, j) - pic(i, j);
            EI = pic(i, j-1) - pic(i, j);
            WI = pic(i, j+1) - pic(i, j);
            cN = exp(-NI^2/K^2);
            cS = exp(-SI^2/K^2);
            cE = exp(-EI^2/K^2);
            cW = exp(-WI^2/K^2);
            %fprintf('%d %d\n', i, j);
            newPic(i, j) = pic(i, j) + lambda*(NI*cN + SI*cS + EI*cE + WI*cW);
        end;
    end
    pic = newPic;
end;
newPic = pic;
newPic = uint8(newPic);
           

 效果圖