-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspm_extrapolate_def.m
44 lines (39 loc) · 1.54 KB
/
spm_extrapolate_def.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
function Y = spm_extrapolate_def(Y,M)
% Fill in non-finite values in a deformation field
% FORMAT Y = spm_extrapolate_def(Y,M)
% Y - the deformation field
% M - voxel-to-world transform associated with the deformation
% (for deriving voxel sizes)
%
% This function is typically used after generating an inverse deformation,
% as these may contain missing locations.
%__________________________________________________________________________
% Copyright (C) 2014 Wellcome Trust Centre for Neuroimaging
% John Ashburner
% $Id: spm_extrapolate_def.m 6137 2014-08-19 12:43:11Z john $
msk = isfinite(Y(:,:,:,1)); % Identify existing points
if ~all(msk(:)), % See if needed
if nargin>=2,
vx = sqrt(sum(M(1:3,1:3).^2)); % Voxel sizes
else
vx = [1 1 1];
end
% Determine affine transform to factor out
[x1,x2,x3] = ndgrid(single(1:size(Y,1)),single(1:size(Y,2)),single(1:size(Y,3)));
X = cat(4,x1,x2,x3);
M1 = spm_get_closest_affine(X,Y);
clear X
bnd = spm_field('boundary'); % For tidying up afterwards
spm_field('boundary',1); % Free boundary conditions
for d=1:3,
x = M1(d,1)*x1 + M1(d,2)*x2 + M1(d,3)*x3 + M1(d,4);
u = Y(:,:,:,d) - x; % Displacement field
u(~msk) = 0;
u = spm_field(single(msk),u,[vx 0 0.00001 0 1 1]); % Extrapolate displacements
y = Y(:,:,:,d);
y(~msk) = u(~msk) + x(~msk);
Y(:,:,:,d) = y;
clear x y u
end
spm_field('boundary',bnd);
end