matlab實現各向異性擴散
阿新 • • 發佈:2018-12-10
看書一直不理解各向異性擴散究竟是什麼,直到看了某大佬的解釋:
主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的(和雙邊濾波很像)。
通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有看作力場的。
這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫素和當前畫素差別較大,則代表這個鄰域畫素很可能是個邊界,那麼當前畫素就不向這個方向擴散了,這個邊界也就得到保留了。
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);
效果圖