Hello,
I'm currently trying to measure the location of fiducial points in mwc1
images. Fiducials are extracted from the original image, which is then
segmented; the corresponding coordinates of those fiducial points in the
normalised segment would then be extracted. The original scan is 256x209x256
(0.86mm isotropic) and the final segment is standard 91x109x91 (2mm
isotropic), both rotated to match a compatible orientation.
My issue is that I can't seem to get this work: I'm using the
fname_seg_sn.mat file as an input for the registration parameters, together
with code extracted from the spm_write_sn.m script (see below). Somehow, the
coordinates in the resulting segment bear no relation to the original
fiducials.
load(fname_sn);
flags2 = struct('wrap',[0 0 0],'interp',1,'vox',[NaN NaN NaN],...
'bb',ones(2,3)*NaN,'preserve',0);
def_flags = struct('interp',1,'vox',NaN,'bb',NaN,'wrap',[0 0
0],'preserve',0);
[def_flags.bb, def_flags.vox] = bbvox_from_V(VG(1));
fnms = fieldnames(def_flags);
for i=1:length(fnms),
if isfield(flags2,fnms{i}),
flags2.(fnms{i}) = def_flags.(fnms{i});
end;
end;
[x,y,z,mat] = get_xyzmat(VG,flags2.bb,flags2.vox);
[X,Y] = ndgrid(x,y);
BX = spm_dctmtx(VG(1).dim(1),size(Tr,1),x-1);
BY = spm_dctmtx(VG(1).dim(2),size(Tr,2),y-1);
BZ = spm_dctmtx(VG(1).dim(3),size(Tr,3),z-1);
point = norm_points{i}; %Extracts original fiducial coordinates,
normalised (and rounded) to 91x109x91 space
spm_point = [0 0 0];
x = point(1); %sagital (91)
y = point(2); %coronal (109)
z = point(3); %axial (91)
tx = get_2Dtrans(Tr(:,:,:,1),BZ,z);
ty = get_2Dtrans(Tr(:,:,:,2),BZ,z);
tz = get_2Dtrans(Tr(:,:,:,3),BZ,z);
X1 = X + BX*tx*BY';
Y1 = Y + BX*ty*BY';
Z1 = z + BX*tz*BY'; %z=z(j)
[X2,Y2,Z2] = mmult(X1,Y1,Z1,mat\VF.mat*Affine); %Could it be
that mat or VF.mat are wrong?...
spm_point(1) = X2(x,y); %Are these coordinates in the right
order?
spm_point(2) = Y2(x,y); % "
spm_point(3) = Z2(x,y); % "
I would appreciate any advice you can give me.
Thank you very much in advance!
Best,
Joao Pereira
|