If you analyze 2-time point longitudinal data, you will eventually observe that it is easier to create and analyze difference data (e.g. data from time 2 minus data from time 1). However, if you’re not a scripting guru this might be an annoying task.
This PairDiff.m
script will take an even number of images and produce a set of paired difference images, even minus odd.
function PairDiff(Imgs,BaseNm)
% PairDiff(Imgs,BaseNm)
% Imgs - Matrix of (even-number of) filenames
% BaseNm - Basename for difference images
%
% Create pairwise difference for a set of images (img2-img1, img4-img3, etc),
% named according to BaseNm (BaseNm_0001, BaseNm_0002, BaseNm_0003, etc).
%______________________________________________________________________
% $Id: PairDiff.m,v 1.2 2012/02/16 21:36:41 nichols Exp $
if nargin<1 | isempty(Imgs)
Imgs = spm_select(Inf,'image','Select n*2 images');
end
if nargin<2 | isempty(BaseNm)
BaseNm = spm_input('Enter difference basename','+1','s','Diff');
end
V = spm_vol(Imgs);
n = length(V);
if rem(n,2)~=0
error('Must specify an even number of images')
end
V1 = V(1);
V1 = rmfield(V1,{'fname','descrip','n','private'});
V1.dt = [spm_type('float32') spm_platform('bigend')];
for i=1:n/2
V1.fname = sprintf('%s_%04d.img',BaseNm,i);
V1.descrip = sprintf('Difference %d',i);
Vo(i) = spm_create_vol(V1);
end
%
% Do the differencing
%
fprintf('Creating differenced data ')
for i=1:2:n
img1 = spm_read_vols(V(i));
img2 = spm_read_vols(V(i+1));
img = img2-img1;
spm_write_vol(Vo((i+1)/2),img);
end
After I created this I realized that Ged Ridgway also has a similar script, make_diffs.m , that takes two lists of images (baseline, followup) and does the same thing, though with perhaps more intuitive filenames.