|
a |
|
b/anisodiff_function.m |
|
|
1 |
function diff_im = anisodiff(im, num_iter, delta_t, kappa, option) |
|
|
2 |
fprintf('Removing noise\n'); |
|
|
3 |
|
|
|
4 |
|
|
|
5 |
fprintf('Filtering Completed !!'); |
|
|
6 |
|
|
|
7 |
% Convert input image to double. |
|
|
8 |
im = double(im); |
|
|
9 |
|
|
|
10 |
% PDE (partial differential equation) initial condition. |
|
|
11 |
diff_im = im; |
|
|
12 |
|
|
|
13 |
% Center pixel distances. |
|
|
14 |
dx = 1; |
|
|
15 |
dy = 1; |
|
|
16 |
dd = sqrt(2); |
|
|
17 |
|
|
|
18 |
% 2D convolution masks - finite differences. |
|
|
19 |
hN = [0 1 0; 0 -1 0; 0 0 0]; |
|
|
20 |
hS = [0 0 0; 0 -1 0; 0 1 0]; |
|
|
21 |
hE = [0 0 0; 0 -1 1; 0 0 0]; |
|
|
22 |
hW = [0 0 0; 1 -1 0; 0 0 0]; |
|
|
23 |
hNE = [0 0 1; 0 -1 0; 0 0 0]; |
|
|
24 |
hSE = [0 0 0; 0 -1 0; 0 0 1]; |
|
|
25 |
hSW = [0 0 0; 0 -1 0; 1 0 0]; |
|
|
26 |
hNW = [1 0 0; 0 -1 0; 0 0 0]; |
|
|
27 |
|
|
|
28 |
% Anisotropic diffusion. |
|
|
29 |
for t = 1:num_iter |
|
|
30 |
|
|
|
31 |
% Finite differences. [imfilter(.,.,'conv') can be replaced by conv2(.,.,'same')] |
|
|
32 |
nablaN = imfilter(diff_im,hN,'conv'); |
|
|
33 |
nablaS = imfilter(diff_im,hS,'conv'); |
|
|
34 |
nablaW = imfilter(diff_im,hW,'conv'); |
|
|
35 |
nablaE = imfilter(diff_im,hE,'conv'); |
|
|
36 |
nablaNE = imfilter(diff_im,hNE,'conv'); |
|
|
37 |
nablaSE = imfilter(diff_im,hSE,'conv'); |
|
|
38 |
nablaSW = imfilter(diff_im,hSW,'conv'); |
|
|
39 |
nablaNW = imfilter(diff_im,hNW,'conv'); |
|
|
40 |
|
|
|
41 |
% Diffusion function. |
|
|
42 |
if option == 1 |
|
|
43 |
cN = exp(-(nablaN/kappa).^2); |
|
|
44 |
cS = exp(-(nablaS/kappa).^2); |
|
|
45 |
cW = exp(-(nablaW/kappa).^2); |
|
|
46 |
cE = exp(-(nablaE/kappa).^2); |
|
|
47 |
cNE = exp(-(nablaNE/kappa).^2); |
|
|
48 |
cSE = exp(-(nablaSE/kappa).^2); |
|
|
49 |
cSW = exp(-(nablaSW/kappa).^2); |
|
|
50 |
cNW = exp(-(nablaNW/kappa).^2); |
|
|
51 |
elseif option == 2 |
|
|
52 |
cN = 1./(1 + (nablaN/kappa).^2); |
|
|
53 |
cS = 1./(1 + (nablaS/kappa).^2); |
|
|
54 |
cW = 1./(1 + (nablaW/kappa).^2); |
|
|
55 |
cE = 1./(1 + (nablaE/kappa).^2); |
|
|
56 |
cNE = 1./(1 + (nablaNE/kappa).^2); |
|
|
57 |
cSE = 1./(1 + (nablaSE/kappa).^2); |
|
|
58 |
cSW = 1./(1 + (nablaSW/kappa).^2); |
|
|
59 |
cNW = 1./(1 + (nablaNW/kappa).^2); |
|
|
60 |
end |
|
|
61 |
|
|
|
62 |
% Discrete PDE solution. |
|
|
63 |
diff_im = diff_im + ... |
|
|
64 |
delta_t*(... |
|
|
65 |
(1/(dy^2))*cN.*nablaN + (1/(dy^2))*cS.*nablaS + ... |
|
|
66 |
(1/(dx^2))*cW.*nablaW + (1/(dx^2))*cE.*nablaE + ... |
|
|
67 |
(1/(dd^2))*cNE.*nablaNE + (1/(dd^2))*cSE.*nablaSE + ... |
|
|
68 |
(1/(dd^2))*cSW.*nablaSW + (1/(dd^2))*cNW.*nablaNW ); |
|
|
69 |
|
|
|
70 |
|
|
|
71 |
|
|
|
72 |
end |