>> I have now got a script that does what you suggested (ie use medcon to
>> make a 3D data set then run MriCRoN's dcm2nii to make nifti) and that
>> does the trick!
>
> I've been playing with dcm2nii a bit, and it should be able to do the
> sorting itself, including correctly making separate NIfTIs from
> directories that contain unsorted slices from different volumes. This
> should be more reliable than my suggestion of stacking with medcon,
> since it's possible to mis-order the files when stacking.
>
> If dcm2nii fails for your particular data, I'd suggest contacting Chris
> Rorden, to see if the problem can be fixed.
Well, find attached my latest script, i.e.
DICOM slices -> DICOM 3D
DICOM 3D -> NifTI 3D
Which leaves all the matrices in, shows the coronal scan as a coronal
scan, and shows the head upright instead of upside down :)
>> Chris Rorden has a very nice page that explains of dcm2nii is
>> swap-aware (between DICOM and NifTI/Analyze, it's apparently like
>> reading Arabic vs. reading English!).
>
> I had a quick look, and couldn't find that, could you post the URL, please?
Hmm, I don't seem to be able to find it either now. It was a pipcture of
a matrix with 1,2,3 ; a,b,c in it (or something like that) and it showed
how that would look in a radiological, neurological, and Dicom image,
respectively.
Maybe someone knows where that page is?
> but I believe it's quite possible under the standard to specify "scanner
> anatomical" intent for the sform and MNI for the qform. The latter might
> be a bad idea, since the qform can only represent a 9 DF transformation
> (with no shearing of axes) whereas the sform can represent a full 12 DF
> affine transformation. But the former -- having scanner-anatomical
> coords in the sform -- seems fine.
Ah. I thought that Q-form and S-form had different roles. I usually try
to leave the Q-form alone, and doing all the standard space work in the
S-form.
> [I don't actually know why the more limited qform is present, instead of
> offering two sform-type transformations; I'd guess there might have been
> some motivation to use quaternions to represent rotation, but I can't
> see why an optional skewing couldn't have followed that, but anyway...]
The only explanation I can offer is that the Q-form represents the
orientation in the scanner...
>> Another reason for being afraid of SPM is that apparently Templaye ==
>> MNI, so I'm not sure what happens if I use a coronal template, or one
>> that's x-flipped wrt the MNI template? Does either SPM or FSL allow
>> for these `deviations from normality'?
>
> The benefit of having a voxel-world mapping and then working in voxel
> coordinates is that this kind of thing shouldn't matter any more. You
> can, for example, use SPM5 to reorient your image to be aligned to MNI
> world-space, without resampling the voxel data. It doesn't matter
> whether the two fastest-changing voxel dimensions give an axial or
> coronal plane, as long as the voxel-world mapping in the Q/S-form gives
> (x,y,z) mm coordinates that are aligned with MNI.
Ah, and it is possible to do your analysis in these `world' coordinates
without resampling to standard space?
If so, I wonder what format the computed maps will have...
> At the moment, FSL doesn't really fully support NIfTI world-coordinates.
> FSLview uses them to label its axes (which is extremely helpful BTW!)
> but tools like FLIRT don't currently take account of them, so you might
> need to use e.g. avwswapdim to roughly align your data with your desired
> template.
That's what I thought happened everywhere (ie for viewing, the
coordinate transforms are used, but when the analysis starts, everything
needs to be resampled in the same space.
>>> Note these are both right-handed coordinate systems, but I think the
>>> determinant of the Q/S-form can be positive or negative negative
>>> depending on the handedness of the voxel storage convention in NIfTI.
>>> While it sounds to me that DICOM should always have a right-handed
>>> voxel storage order
>>> http://nifti.nimh.nih.gov/board/read.php?f=1&i=532&t=508
>>> where I understand from the FAQ that the fastest changing voxel index
>>> is along the rows (i.e. column index i), followed by down columns
>>> (row index j), and then slice (k) is slowest changing. I.e.
>>> Voxels[k][j][i] in C++ notation
>>> http://www.vtk.org/Wiki/Proposals:Orientation
>>> http://grahamwideman.com/gw/brain/orientation/orientterms.htm
>>
>> ... you seem to have stopped here mid-sentence?
>
> No, just forgot the full-stop after notation. So far, no-one has replied
> to me (hopefully anyone who does will go via (or CC) the list) about
> this, so I'm still a little confused. But maybe the stuff you found on
> Chris Rorden's webpage might clear this up for me...
I still don't understand the sentence... But I hope I'll find that page
again...
>> I wonder how FSL and SPM compare in that respect? What would happen if
>> I combine an acquisition with axial slices, and an acquisition with
>> coronal slices, in the same study?
>
> I think this would probably be a bad idea, due to things like MR
> gradient non-uniformities and differences in motion/pulse artefact, etc.
> But I'm only guessing here -- MR Physicists, feel free to shout at me!
Well, I was more thinking of re-ordering an axial image as a coronal
image, changing the orientation matrix appropriately and then see if any
of the analysis programs survives...
Have a good weekend
AM
######################################################################################
#!/bin/bash
# this is a BASH script
CD=$PWD
DCM2NII="/home/amw71/usr/local/mricron/dcm2nii -a N -d N -e N -g N -p N
-i N"
ONEIMDIR=$CD/DirForOneImage
mkdir -p $ONEIMDIR
# remove all header/image/nifti files
rm -f `find $CD -name \*.\[hni\]\?\?`
# relink -make sure that all numbers have the same #digits
# i.e., 1 -> 001, 10 -> 010, etc, for ordering of slices
# (this only needs to be done once)
RELINK="YES"
if [[ "$RELINK" == "YES" ]]; then
# first, find all the image directories
# basically, look for "IM1". The IM2 etc will be at similar places
IMDIRS=""
imdirs=0;
for d in `find $CD -name IM1 -type f`; do
# add directory name minus the last "/<string>"
IMDIRS="$IMDIRS ${d%/*}";
let imdirs=$imdirs+1;
done
echo "$imdirs image directories found before renaming"
echo "Renaming 1-digit directories:"
# make links from IM1 to IM01, etc
for d in `find $CD -name IM\?`; do
mv -i $d ${d//IM/IM0};
printf "."
done
printf "\n"
echo "Renaming 2-digit directories:"
# make links from IM10 to IM010, etc
for d in `find $CD -name IM\?\?`; do
mv -i $d ${d//IM/IM0};
printf "."
done
printf "\n"
fi
# first, find all the image directories
# basically, look for "IM1". The IM2 etc will be at similar places
IMDIRS="";
imdirs=0;
for d in `find $CD -name IM001`; do
# add directory name minus the last "/<string>"
IMDIRS="$IMDIRS ${d%/*}";
let imdirs=$imdirs+1;
done
echo "$imdirs image directories found (after renaming)"
# then, cycle over all directories with slices
# (keeping track with counter imdir)
imdir=0;
for IMDIR in $IMDIRS; do
let imdir=$imdir+1;
# reset all slice counters
echo "gathering data for subject $IMDIR ($imdir of $imdirs)"
IMAGES="";
PDIMAGES="";
T2IMAGES="";
i=0;
# add slice images to main volume, PD volume and T2 volume
for f in `find $IMDIR -name IM\?\?\? | sort -g`; do
IMAGES="$IMAGES $f";
if (( $i % 2 == 0 )); then
PDIMAGES="$PDIMAGES $f";
else
T2IMAGES="$T2IMAGES $f";
fi
let i=($i+1)%2;
done
images=`echo $IMAGES|wc -w`;
# building the medcon command to make a dicom volume
echo "adding $images slice images in $IMDIR into a NifTI volume"
COMMAND="$HOME/usr/local/bin/medcon" # program call
COMMAND="$COMMAND -n" # do not discard negative values
COMMAND="$COMMAND -b16" # generate 16-bit output
COMMAND="$COMMAND -c dicom" # output format: dicom
COMMAND="$COMMAND -cor" # coronal slices
COMMAND="$COMMAND -stack3d" # combine slices
COMMAND="$COMMAND -w " # overwrite data
COMMAND="$COMMAND -alias " # use string with patient ID
COMMAND="$COMMAND -noprefix" # don't use other strings
#COMMAND="$COMMAND -o $CD/image3D.dcm" # output filename
COMMAND="$COMMAND -f $IMAGES" # list of input images
# empty directory of (unknown) .dcm files
rm -rf $CD/*.dcm
# dual-echo (PD + T2) image
echo "combining all slices into one volume"
$COMMAND;
# obtain ID
NAME=`ls *.dcm`;
NAME=${NAME##*+????????+}
NAME=${NAME%%+*}
if (( $images > 100 )); then
NEWNAME=$ONEIMDIR/${NAME}dualecho.dcm;
else
NEWNAME=$ONEIMDIR/${NAME}anatomy.dcm;
fi
mv $CD/*.dcm $NEWNAME
$DCM2NII $NEWNAME
mv $ONEIMDIR/* $IMDIR
# do this only for dual-echo images
if (( $images > 100 )); then
# PD image
echo "making separate proton-density weighted image"
PDCOMMAND=${COMMAND%%-f*};
PDCOMMAND="$PDCOMMAND -f $PDIMAGES"
$PDCOMMAND;
NEWNAME=$ONEIMDIR/${NAME}pd.dcm;
mv $CD/*.dcm $NEWNAME
$DCM2NII $NEWNAME
mv $ONEIMDIR/* $IMDIR
# T2 image
echo "making separete T2-weighted image"
T2COMMAND=${COMMAND%%-f*};
T2COMMAND="$T2COMMAND -f $T2IMAGES"
$T2COMMAND;
NEWNAME=$ONEIMDIR/${NAME}t2.dcm;
mv $CD/*.dcm $NEWNAME
$DCM2NII $NEWNAME
mv $ONEIMDIR/* $IMDIR
fi
done
######################################################################################
|