diff options
Diffstat (limited to 'SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m')
-rwxr-xr-x | SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m b/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m new file mode 100755 index 0000000..3cccefb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m | |||
@@ -0,0 +1,82 @@ | |||
1 | function [A,D] = find_AD(I,J,mask,w) | ||
2 | % | ||
3 | % [A,D] = find_AD(I,J,mask,w) | ||
4 | % | ||
5 | % find the matrix affine transform A and displacement D, | ||
6 | % such that SSD difference of I(Ax-d)-J(x) is minimized, | ||
7 | % | ||
8 | |||
9 | % | ||
10 | % Jianbo Shi | ||
11 | % | ||
12 | |||
13 | |||
14 | [gy1,gx1] = grad(I,w); | ||
15 | [gy2,gx2] = grad(J,w); | ||
16 | |||
17 | gx = 0.5*(gx1+gx2); | ||
18 | gy = 0.5*(gy1+gy2); | ||
19 | |||
20 | [size_y,size_x] = size(I); | ||
21 | [center_y,center_x] = find_center(size_y,size_x); | ||
22 | mask = mask(w+1:size_y-w,w+1:size_x-w); | ||
23 | |||
24 | [x,y] = meshgrid(1:size_x,1:size_y); | ||
25 | x = x- center_x; | ||
26 | y = y-center_y; | ||
27 | |||
28 | x = x(w+1:size_y-w,w+1:size_x-w); | ||
29 | y = y(w+1:size_y-w,w+1:size_x-w); | ||
30 | |||
31 | gx_sqr = gx.*mask.*gx; | ||
32 | gx_gy = gx.*mask.*gy; | ||
33 | gy_sqr = gy.*mask.*gy; | ||
34 | |||
35 | x_sqr = x.*x; | ||
36 | x_y = x.*y; | ||
37 | y_sqr = y.*y; | ||
38 | |||
39 | T= zeros(6,6); | ||
40 | T(1,1) = 0.5*trapz(trapz(gx_sqr.*x_sqr)); | ||
41 | T(2,1) = trapz(trapz(gx_gy.*x_y)); | ||
42 | T(3,1) = trapz(trapz(gx_sqr.*x_y)); | ||
43 | T(4,1) = trapz(trapz(gx_gy.*x_sqr)); | ||
44 | T(5,1) = trapz(trapz(gx_sqr.*x)); | ||
45 | T(6,1) = trapz(trapz(gx_gy.*x)); | ||
46 | T(2,2) = 0.5*trapz(trapz(gy_sqr.*y_sqr)); | ||
47 | T(3,2) = trapz(trapz(gx_gy.*y_sqr)); | ||
48 | T(4,2) = trapz(trapz(gy_sqr.*x_y)); | ||
49 | T(5,2) = trapz(trapz(gx_gy.*y)); | ||
50 | T(6,2) = trapz(trapz(gy_sqr.*y)); | ||
51 | T(3,3) = 0.5*trapz(trapz(gx_sqr.*y_sqr)); | ||
52 | T(4,3) = trapz(trapz(gx_gy.*x_y)); | ||
53 | T(5,3) = trapz(trapz(gx_sqr.*y)); | ||
54 | T(6,3) = trapz(trapz(gx_gy.*y)); | ||
55 | T(4,4) = 0.5*trapz(trapz(gy_sqr.*x_sqr)); | ||
56 | T(5,4) = trapz(trapz(gx_gy.*x)); | ||
57 | T(6,4) = trapz(trapz(gy_sqr.*x)); | ||
58 | T(5,5) = 0.5*trapz(trapz(gx_sqr)); | ||
59 | T(6,5) = trapz(trapz(gx_gy)); | ||
60 | T(6,6) = 0.5*trapz(trapz(gy_sqr)); | ||
61 | |||
62 | T = T+T'; | ||
63 | |||
64 | J = J(w+1:size_y-w,w+1:size_x-w); | ||
65 | I = I(w+1:size_y-w,w+1:size_x-w); | ||
66 | |||
67 | |||
68 | diff = (J-I).*mask; | ||
69 | b(1) = trapz(trapz(diff.*gx.*x)); | ||
70 | b(2) = trapz(trapz(diff.*gy.*y)); | ||
71 | b(3) = trapz(trapz(diff.*gx.*y)); | ||
72 | b(4) = trapz(trapz(diff.*gy.*x)); | ||
73 | b(5) = trapz(trapz(diff.*gx)); | ||
74 | b(6) = trapz(trapz(diff.*gy)); | ||
75 | |||
76 | a = inv(T)*b'; | ||
77 | |||
78 | A = [1+a(1), a(3); | ||
79 | a(4),1+a(2)]; | ||
80 | |||
81 | D= [a(5),a(6)]; | ||
82 | |||