forked from pdollar/toolbox
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tpsGetWarp.m
77 lines (72 loc) · 2.45 KB
/
tpsGetWarp.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
71
72
73
74
75
76
77
function [warp,L,LnInv,bendE] = tpsGetWarp( lambda, xsS, ysS, xsD, ysD )
% Given two sets of corresponding points, calculates warp between them.
%
% Uses booksteins PAMI89 method. Can then apply warp to a new set of
% points (tpsInterpolate), or even an image (tpsInterpolateIm).
% "Principal Warps: Thin-Plate Splines and the Decomposition of
% Deformations". Bookstein. PAMI 1989.
%
% USAGE
% [warp,L,LnInv,bendE] = tpsGetWarp( lambda, xsS, ysS, xsD, ysD )
%
% INPUTS
% lambda - rigidity of warp (inf means warp becomes affine)
% xsS, ysS - [1xn] correspondence points from source image
% xsD, ysD - [1xn] correspondence points from destination image
%
% OUTPUTS
% warp - bookstein warping parameters
% L, LnInv - see bookstein
% bendE - bending energy
%
% EXAMPLE - 1
% xsS=[0 -1 0 1]; ysS=[1 0 -1 0]; xsD=xsS; ysD=[3/4 1/4 -5/4 1/4];
% warp = tpsGetWarp( 0, xsS, ysS, xsD, ysD );
% [gxs, gys] = meshgrid(-1.25:.25:1.25,-1.25:.25:1.25);
% tpsInterpolate( warp, gxs, gys, 1 );
%
% EXAMPLE - 2
% xsS = [3.6929 6.5827 6.7756 4.8189 5.6969];
% ysS = [10.3819 8.8386 12.0866 11.2047 10.0748];
% xsD = [3.9724 6.6969 6.5394 5.4016 5.7756];
% ysD = [6.5354 4.1181 7.2362 6.4528 5.1142];
% warp = tpsGetWarp( 0, xsS, ysS, xsD, ysD );
% [gxs, gys] = meshgrid(3.5:.25:7, 8.5:.25: 12.5);
% tpsInterpolate( warp, gxs, gys, 1 );
%
% See also TPSINTERPOLATE, TPSINTERPOLATEIM, TPSRANDOM
%
% Piotr's Computer Vision Matlab Toolbox Version 2.0
% Copyright 2014 Piotr Dollar. [pdollar-at-gmail.com]
% Licensed under the Simplified BSD License [see external/bsd.txt]
dim = size( xsS );
if( all(size(xsS)~=dim) || all(size(ysS)~=dim) || all(size(xsD)~=dim))
error( 'argument sizes do not match' );
end
% get L
n = size(xsS,2);
deltaXs = xsS'*ones(1,n) - ones(n,1) * xsS;
deltaYs = ysS'*ones(1,n) - ones(n,1) * ysS;
Rsq = (deltaXs .* deltaXs + deltaYs .* deltaYs);
Rsq = Rsq+eye(n); K = Rsq .* log( Rsq ); K( isnan(K) )=0;
K = K + lambda * eye( n );
P = [ ones(n,1), xsS', ysS' ];
L = [ K, P; P', zeros(3,3) ];
LInv = L^(-1);
LnInv = LInv(1:n,1:n);
% recover W's
wx = LInv * [xsD 0 0 0]';
affinex = wx(n+1:n+3);
wx = wx(1:n);
wy = LInv * [ysD 0 0 0]';
affiney = wy(n+1:n+3);
wy = wy(1:n);
% record warp
warp.wx = wx; warp.affinex = affinex;
warp.wy = wy; warp.affiney = affiney;
warp.xsS = xsS; warp.ysS = ysS;
warp.xsD = xsD; warp.ysD = ysD;
% get bending energy (without regularization)
w = [wx'; wy'];
K = K - lambda * eye( n );
bendE = trace(w*K*w')/2;