summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m
blob: 3cccefb10cd5645468ebee30e93be8030be42a2c (plain) (blame)
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
71
72
73
74
75
76
77
78
79
80
81
82
function [A,D] = find_AD(I,J,mask,w)
%
%  [A,D] = find_AD(I,J,mask,w)
%
%    find the matrix affine transform A and displacement D,
%    such that SSD difference of  I(Ax-d)-J(x) is minimized,
%   

%
% Jianbo Shi
%


[gy1,gx1] = grad(I,w);
[gy2,gx2] = grad(J,w);

gx = 0.5*(gx1+gx2);
gy = 0.5*(gy1+gy2);

[size_y,size_x] = size(I);
[center_y,center_x] = find_center(size_y,size_x);
mask = mask(w+1:size_y-w,w+1:size_x-w);

[x,y] = meshgrid(1:size_x,1:size_y);
x = x- center_x;
y = y-center_y;

x = x(w+1:size_y-w,w+1:size_x-w);
y = y(w+1:size_y-w,w+1:size_x-w);

gx_sqr = gx.*mask.*gx;
gx_gy = gx.*mask.*gy;
gy_sqr = gy.*mask.*gy;

x_sqr = x.*x;
x_y = x.*y;
y_sqr = y.*y;

T= zeros(6,6);
T(1,1) = 0.5*trapz(trapz(gx_sqr.*x_sqr));
T(2,1) = trapz(trapz(gx_gy.*x_y));
T(3,1) = trapz(trapz(gx_sqr.*x_y));
T(4,1) = trapz(trapz(gx_gy.*x_sqr));
T(5,1) = trapz(trapz(gx_sqr.*x));
T(6,1) = trapz(trapz(gx_gy.*x));
T(2,2) = 0.5*trapz(trapz(gy_sqr.*y_sqr));
T(3,2) = trapz(trapz(gx_gy.*y_sqr));
T(4,2) = trapz(trapz(gy_sqr.*x_y));
T(5,2) = trapz(trapz(gx_gy.*y));
T(6,2) = trapz(trapz(gy_sqr.*y));
T(3,3) = 0.5*trapz(trapz(gx_sqr.*y_sqr));
T(4,3) = trapz(trapz(gx_gy.*x_y));
T(5,3) = trapz(trapz(gx_sqr.*y));
T(6,3) = trapz(trapz(gx_gy.*y));
T(4,4) = 0.5*trapz(trapz(gy_sqr.*x_sqr));
T(5,4) = trapz(trapz(gx_gy.*x));
T(6,4) = trapz(trapz(gy_sqr.*x));
T(5,5) = 0.5*trapz(trapz(gx_sqr));
T(6,5) = trapz(trapz(gx_gy));
T(6,6) = 0.5*trapz(trapz(gy_sqr));

T = T+T';

J = J(w+1:size_y-w,w+1:size_x-w);
I = I(w+1:size_y-w,w+1:size_x-w);


diff = (J-I).*mask;
b(1) = trapz(trapz(diff.*gx.*x));
b(2) = trapz(trapz(diff.*gy.*y));
b(3) = trapz(trapz(diff.*gx.*y));
b(4) = trapz(trapz(diff.*gy.*x));
b(5) = trapz(trapz(diff.*gx));
b(6) = trapz(trapz(diff.*gy));

a = inv(T)*b';

A = [1+a(1), a(3);
a(4),1+a(2)];

D= [a(5),a(6)];