| function [mri] = ft_read_mri(filename, varargin) |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| filename = fetch_url(filename); |
|
|
| |
| dataformat = ft_getopt(varargin, 'dataformat'); |
|
|
| |
| format = ft_getopt(varargin, 'format'); |
| if ~isempty(format) |
| warning('the option ''format'' will be deprecated soon, please use ''dataformat'' instead'); |
| if isempty(dataformat) |
| dataformat = format; |
| end |
| end |
|
|
| if isempty(dataformat) |
| |
| dataformat = ft_filetype(filename); |
| end |
|
|
| if strcmp(dataformat, 'compressed') |
| |
| inflated = true; |
| filename = inflate_file(filename); |
| dataformat = ft_filetype(filename); |
| else |
| inflated = false; |
| end |
|
|
| |
| if ~exist(filename, 'file') |
| error('file ''%s'' does not exist', filename); |
| end |
|
|
| |
| hasspm2 = ft_hastoolbox('spm2'); |
| hasspm5 = ft_hastoolbox('spm5'); |
| hasspm8 = ft_hastoolbox('spm8'); |
| hasspm12 = ft_hastoolbox('spm12'); |
|
|
| switch dataformat |
| case 'ctf_mri' |
| [img, hdr] = read_ctf_mri(filename); |
| transform = hdr.transformMRI2Head; |
| coordsys = 'ctf'; |
|
|
| case 'ctf_mri4' |
| [img, hdr] = read_ctf_mri4(filename); |
| transform = hdr.transformMRI2Head; |
| coordsys = 'ctf'; |
|
|
| case 'ctf_svl' |
| [img, hdr] = read_ctf_svl(filename); |
| transform = hdr.transform; |
|
|
| case 'asa_mri' |
| [img, seg, hdr] = read_asa_mri(filename); |
| transform = hdr.transformMRI2Head; |
| if isempty(seg) |
| |
| clear seg |
| end |
|
|
| case 'minc' |
| if ~(hasspm2 || hasspm5) |
| fprintf('the SPM2 or SPM5 toolbox is required to read *.mnc files\n'); |
| ft_hastoolbox('spm2',1); |
| end |
| |
| hdr = spm_vol_minc(filename); |
| img = spm_read_vols(hdr); |
| transform = hdr.mat; |
|
|
| case 'nifti_spm' |
| if ~(hasspm5 || hasspm8 || hasspm12) |
| fprintf('the SPM5 or newer toolbox is required to read *.nii files\n'); |
| ft_hastoolbox('spm8', 1); |
| end |
| |
| hdr = spm_vol_nifti(filename); |
| img = spm_read_vols(hdr); |
| transform = hdr.mat; |
|
|
| case {'analyze_img' 'analyze_hdr'} |
| if ~(hasspm8) |
| fprintf('the SPM8 toolbox is required to read analyze files\n'); |
| ft_hastoolbox('spm8', 1); |
| end |
|
|
| |
| filename((end-2):end) = 'img'; |
| |
| hdr = spm_vol(filename); |
| img = spm_read_vols(hdr); |
| transform = hdr.mat; |
|
|
| case 'analyze_old' |
| |
| ft_hastoolbox('mri', 1); |
|
|
| avw = avw_img_read(filename, 0); |
| img = avw.img; |
| hdr = avw.hdr; |
| |
| |
| |
| |
| |
| |
| warning('flipping 1st dimension (L-R) to obtain volume in neurological convention'); |
| img = flipdim(img, 1); |
|
|
| transform = diag(hdr.dime.pixdim(2:4)); |
| transform(4,4) = 1; |
|
|
| case {'afni_brik' 'afni_head'} |
| |
| ft_hastoolbox('afni', 1); |
|
|
| [err, img, hdr, ErrMessage] = BrikLoad(filename); |
| if err |
| error('could not read AFNI file'); |
| end |
|
|
| |
| |
| warning('homogenous transformation might be incorrect for AFNI file'); |
| transform = eye(4); |
| transform(1:3,4) = hdr.ORIGIN(:); |
| transform(1,1) = hdr.DELTA(1); |
| transform(2,2) = hdr.DELTA(2); |
| transform(3,3) = hdr.DELTA(3); |
|
|
| |
| img = flipdim(img,1); |
| img = flipdim(img,2); |
| dim = size(img); |
| transform(1,4) = -dim(1) - transform(1,4); |
| transform(2,4) = -dim(2) - transform(2,4); |
|
|
| case 'neuromag_fif' |
| |
| ft_hastoolbox('mne', 1); |
|
|
| |
| hdr = fiff_read_mri(filename); |
| img_t = cat(3, hdr.slices.data); |
| img = permute(img_t,[2 1 3]); |
| hdr.slices = rmfield(hdr.slices, 'data'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| transform = eye(4); |
| if isfield(hdr, 'trans') && issubfield(hdr.trans, 'trans') |
| if (hdr.trans.from == 4) && (hdr.trans.to == 5) |
| transform = hdr.trans.trans; |
| else |
| warning('W: trans does not transform from 4 to 5.'); |
| warning('W: Please check the MRI fif-file'); |
| end |
| else |
| warning('W: trans structure is not defined.'); |
| warning('W: Maybe coregistration is missing?'); |
| end |
| if isfield(hdr, 'voxel_trans') && issubfield(hdr.voxel_trans, 'trans') |
| |
| |
| if (hdr.voxel_trans.from == 2001) && (hdr.voxel_trans.to == 5) |
| |
| |
|
|
| |
| |
| |
| |
| |
|
|
| |
| matlab_shift = eye(4); |
| matlab_shift(1:3,4) = [-1,-1,-1]; |
| transform = transform\(hdr.voxel_trans.trans * matlab_shift); |
|
|
| coordsys = 'neuromag'; |
| mri.unit = 'm'; |
| else |
| warning('W: voxel_trans does not transform from 2001 to 5.'); |
| warning('W: Please check the MRI fif-file'); |
| end |
| else |
| warning('W: voxel_trans structure is not defined.'); |
| warning('W: Please check the MRI fif-file'); |
| end |
|
|
| case 'neuromag_fif_old' |
| |
| ft_hastoolbox('meg-pd', 1); |
|
|
| |
| [img,coords] = loadmri(filename); |
| dev = loadtrans(filename,'MRI','HEAD'); |
| transform = dev*coords; |
| hdr.coords = coords; |
| hdr.dev = dev; |
|
|
| case 'dicom' |
| |
| |
|
|
| |
| ft_hastoolbox('freesurfer', 1); |
| [dcmdir,junk1,junk2] = fileparts(filename); |
| if isempty(dcmdir), |
| dcmdir = '.'; |
| end |
| [img,transform,hdr,mr_params] = load_dicom_series(dcmdir,dcmdir,filename); |
| transform = vox2ras_0to1(transform); |
|
|
| case 'dicom_old' |
| |
| |
|
|
| |
| |
| orig = dicominfo(filename); |
| dim(1) = orig.Rows; |
| dim(2) = orig.Columns; |
|
|
| [p, f] = fileparts(filename); |
|
|
| |
| tok = tokenize(f, '.'); |
| for i=5:length(tok) |
| tok{i} = '*'; |
| end |
| filename = sprintf('%s.', tok{:}); |
| filename = filename(1:end-1); |
| dirlist = dir(fullfile(p, filename)); |
| dirlist = {dirlist.name}; |
|
|
| if length(dirlist)==1 |
| |
| dirlist = dir(fullfile(p, '*')); |
| dirlist = {dirlist(~[dirlist.isdir]).name}; |
| end |
|
|
| keep = false(1, length(dirlist)); |
| for i=1:length(dirlist) |
| filename = char(fullfile(p, dirlist{i})); |
| if ~strcmp(dataformat, 'dicom') |
| keep(i) = false; |
| fprintf('skipping ''%s'' because of incorrect filetype\n', filename); |
| end |
| |
| info = dicominfo(filename); |
| if info.SeriesNumber~=orig.SeriesNumber |
| keep(i) = false; |
| fprintf('skipping ''%s'' because of different SeriesNumber\n', filename); |
| else |
| keep(i) = true; |
| hdr(i) = info; |
| end |
| end |
| |
| hdr = hdr(keep); |
| dirlist = dirlist(keep); |
|
|
| |
| dim(3) = length(dirlist); |
| img = zeros(dim(1), dim(2), dim(3)); |
| for i=1:length(dirlist) |
| filename = char(fullfile(p, dirlist{i})); |
| fprintf('reading image data from ''%s''\n', filename); |
| img(:,:,i) = dicomread(hdr(i)); |
| end |
|
|
| |
| [z, indx] = sort(cell2mat({hdr.SliceLocation})); |
| hdr = hdr(indx); |
| img = img(:,:,indx); |
|
|
| try |
| |
| dx = hdr(1).PixelSpacing(1); |
| dy = hdr(1).PixelSpacing(2); |
| dz = hdr(2).SliceLocation - hdr(1).SliceLocation; |
| transform = eye(4); |
| transform(1,1) = dx; |
| transform(2,2) = dy; |
| transform(3,3) = dz; |
| end |
|
|
| case {'nifti', 'freesurfer_mgz', 'freesurfer_mgh', 'nifti_fsl'} |
| if strcmp(dataformat, 'freesurfer_mgz') && ispc |
| error('Compressed .mgz files cannot be read on a PC'); |
| end |
|
|
| ft_hastoolbox('freesurfer', 1); |
| tmp = MRIread(filename); |
| ndims = numel(size(tmp.vol)); |
| if ndims==3 |
| img = permute(tmp.vol, [2 1 3]); |
| |
| |
| |
| elseif ndims==4 |
| img = permute(tmp.vol, [2 1 3 4]); |
| end |
| hdr = rmfield(tmp, 'vol'); |
| transform = tmp.vox2ras1; |
|
|
| case 'yokogawa_mri' |
| ft_hastoolbox('yokogawa', 1); |
| fid = fopen(filename, 'rb'); |
| mri_info = GetMeg160MriInfoM(fid); |
| patient_info = GetMeg160PatientInfoFromMriFileM(fid); |
| [data_style, model, marker, image_parameter, normalize, besa_fiducial_point] = GetMeg160MriFileHeaderInfoM(fid); |
| fclose(fid); |
|
|
| |
| hdr.mri_info = mri_info; |
| hdr.patient_info = patient_info; |
| hdr.data_style = data_style; |
| hdr.model = model; |
| hdr.marker = marker; |
| hdr.image_parameter = image_parameter; |
| hdr.normalize = normalize; |
| hdr.besa_fiducial_point = besa_fiducial_point; |
|
|
| error('FIXME yokogawa_mri implementation is incomplete'); |
|
|
| case 'matlab' |
| mri = loadvar(filename, 'mri'); |
|
|
| otherwise |
| error(sprintf('unrecognized filetype ''%s'' for ''%s''', dataformat, filename)); |
| end |
|
|
| if exist('img', 'var') |
| |
| nx = size(img,1); |
| ny = size(img,2); |
| nz = size(img,3); |
| mri.dim = [nx ny nz]; |
| |
| mri.anatomy = img; |
| end |
|
|
| if exist('seg', 'var') |
| |
| mri.seg = seg; |
| end |
|
|
| if exist('hdr', 'var') |
| |
| mri.hdr = hdr; |
| end |
|
|
| try |
| |
| mri.transform = transform; |
| end |
|
|
| try |
| |
| mri = ft_convert_units(mri); |
| end |
|
|
| try |
| |
| mri.coordsys = coordsys; |
| end |
|
|
| if inflated |
| |
| delete(filename); |
| end |
|
|
| |
| |
| |
| function value = loadvar(filename, varname) |
| var = whos('-file', filename); |
| if length(var)==1 |
| filecontent = load(filename); |
| value = filecontent.(var.name); |
| clear filecontent |
| else |
| filecontent = load(filename, varname); |
| value = filecontent.(varname); |
| clear filecontent |
| end |
|
|