--- a +++ b/anisodiff_function.m @@ -0,0 +1,72 @@ +function diff_im = anisodiff(im, num_iter, delta_t, kappa, option) +fprintf('Removing noise\n'); + + +fprintf('Filtering Completed !!'); + +% Convert input image to double. +im = double(im); + +% PDE (partial differential equation) initial condition. +diff_im = im; + +% Center pixel distances. +dx = 1; +dy = 1; +dd = sqrt(2); + +% 2D convolution masks - finite differences. +hN = [0 1 0; 0 -1 0; 0 0 0]; +hS = [0 0 0; 0 -1 0; 0 1 0]; +hE = [0 0 0; 0 -1 1; 0 0 0]; +hW = [0 0 0; 1 -1 0; 0 0 0]; +hNE = [0 0 1; 0 -1 0; 0 0 0]; +hSE = [0 0 0; 0 -1 0; 0 0 1]; +hSW = [0 0 0; 0 -1 0; 1 0 0]; +hNW = [1 0 0; 0 -1 0; 0 0 0]; + +% Anisotropic diffusion. +for t = 1:num_iter + + % Finite differences. [imfilter(.,.,'conv') can be replaced by conv2(.,.,'same')] + nablaN = imfilter(diff_im,hN,'conv'); + nablaS = imfilter(diff_im,hS,'conv'); + nablaW = imfilter(diff_im,hW,'conv'); + nablaE = imfilter(diff_im,hE,'conv'); + nablaNE = imfilter(diff_im,hNE,'conv'); + nablaSE = imfilter(diff_im,hSE,'conv'); + nablaSW = imfilter(diff_im,hSW,'conv'); + nablaNW = imfilter(diff_im,hNW,'conv'); + + % Diffusion function. + if option == 1 + cN = exp(-(nablaN/kappa).^2); + cS = exp(-(nablaS/kappa).^2); + cW = exp(-(nablaW/kappa).^2); + cE = exp(-(nablaE/kappa).^2); + cNE = exp(-(nablaNE/kappa).^2); + cSE = exp(-(nablaSE/kappa).^2); + cSW = exp(-(nablaSW/kappa).^2); + cNW = exp(-(nablaNW/kappa).^2); + elseif option == 2 + cN = 1./(1 + (nablaN/kappa).^2); + cS = 1./(1 + (nablaS/kappa).^2); + cW = 1./(1 + (nablaW/kappa).^2); + cE = 1./(1 + (nablaE/kappa).^2); + cNE = 1./(1 + (nablaNE/kappa).^2); + cSE = 1./(1 + (nablaSE/kappa).^2); + cSW = 1./(1 + (nablaSW/kappa).^2); + cNW = 1./(1 + (nablaNW/kappa).^2); + end + + % Discrete PDE solution. + diff_im = diff_im + ... + delta_t*(... + (1/(dy^2))*cN.*nablaN + (1/(dy^2))*cS.*nablaS + ... + (1/(dx^2))*cW.*nablaW + (1/(dx^2))*cE.*nablaE + ... + (1/(dd^2))*cNE.*nablaNE + (1/(dd^2))*cSE.*nablaSE + ... + (1/(dd^2))*cSW.*nablaSW + (1/(dd^2))*cNW.*nablaNW ); + + + +end \ No newline at end of file