-
Notifications
You must be signed in to change notification settings - Fork 0
/
generate_stencil.m
71 lines (60 loc) · 2.45 KB
/
generate_stencil.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
function distance = generate_stencil(neighborhood_size, step_size,stencil_shape)
% NOTE: We use the full 5x5 neighborhood and set unnecessary pixels with a
% negative distance.
% define negative value for invalid elements
inval = nan;-1e+05;
if strcmp(stencil_shape, 'diamond')
% building the distance function for the following 5x5 stencil:
% 6 16
% 2 7 12 17 22
% 8 x 18
% 4 9 14 19 24
% 10 20
distance = step_size * ...
[ inval, sqrt(5), inval, sqrt(5), inval, ...
sqrt(5), sqrt(2), 1, sqrt(2), sqrt(5), ...
inval, 1, inval, 1, inval, ...
sqrt(5), sqrt(2), 1, sqrt(2), sqrt(5), ...
inval, sqrt(5), inval, sqrt(5), inval];
elseif strcmp(stencil_shape, 'full')
% building the distance function for the following 5x5 stencil:
% 1 6 11 16 21
% 2 7 12 17 22
% 3 8 x 18 23
% 4 9 14 19 24
% 5 10 15 20 25
% NOTE: We use the full 5x5 neighborhood and set unnecessary pixels with a
% negative distance.
% distance = step_size * ...
% [sqrt(8), sqrt(5), 2, sqrt(5), sqrt(8), ...
% sqrt(5), sqrt(2), 1, sqrt(2), sqrt(5), ...
% 2, 1, inval, 1, 2, ...
% sqrt(5), sqrt(2), 1, sqrt(2), sqrt(5), ...
% sqrt(8), sqrt(5), 2, sqrt(5), sqrt(8)];
distance = zeros(neighborhood_size);
distance(ceil(end/2), ceil(end/2)) = 1;
distance = double(step_size * bwdist(distance));
distance(ceil(end/2), ceil(end/2)) = inval;
distance = reshape(distance,[1 numel(distance)]);
elseif strcmp(stencil_shape, 'square')
% building the distance function for the following 5x5 stencil:
% 1 6 11 16 21
% 2 22
% 3 x 23
% 4 24
% 5 10 15 20 25
% NOTE: We use the full 5x5 neighborhood and set unnecessary pixels with a
% negative distance.
% distance = step_size * ...
% [sqrt(8), sqrt(5), 2, sqrt(5), sqrt(8), ...
% sqrt(5), inval, inval, inval, sqrt(5), ...
% 2, inval, inval, inval, 2, ...
% sqrt(5), inval, inval, inval, sqrt(5), ...
% sqrt(8), sqrt(5), 2, sqrt(5), sqrt(8)];
distance = zeros(neighborhood_size);
distance(ceil(end/2), ceil(end/2)) = 1;
distance = double(step_size * bwdist(distance));
distance(2:end-1, 2:end-1) = inval;
distance = reshape(distance,[1 numel(distance)]);
end
end