def embed_nifti(dcmfiles, niftifile, infofile, force=False): import dcmstack as ds import nibabel as nb import os stack = ds.parse_and_stack(dcmfiles, force=force).values() if len(stack) > 1: raise ValueError('Found multiple series') stack = stack[0] #Create the nifti image using the data array if not os.path.exists(niftifile): nifti_image = stack.to_nifti(embed_meta=True) nifti_image.to_filename(niftifile) return ds.NiftiWrapper(nifti_image).meta_ext.to_json() orig_nii = nb.load(niftifile) orig_hdr = orig_nii.get_header() aff = orig_nii.get_affine() ornt = nb.orientations.io_orientation(aff) axcodes = nb.orientations.ornt2axcodes(ornt) new_nii = stack.to_nifti(voxel_order=''.join(axcodes), embed_meta=True) new_hdr = new_nii.get_header() #orig_hdr.extensions = new_hdr.extensions #orig_nii.update_header() #orig_nii.to_filename(niftifile) meta = ds.NiftiWrapper(new_nii).meta_ext.to_json() with open(infofile, 'wt') as fp: fp.writelines(meta) return niftifile, infofile
def __init__(self, fname): # A directory containing DICOMs. Convert them to Nifti print("Converting DICOMS in %s..." % (os.path.basename(fname))) src_dcms = glob.glob('%s/*' % fname) nii = None try: if HAVE_DCMSTACK: # Give DCMSTACK a chance to do its thing stacks = dcmstack.parse_and_stack(src_dcms) stack = stacks.values()[0] nii = stack.to_nifti() except: warnings.warn("DCMSTACK failed - trying our method") if nii is None: # Try our top-secret in-house method nii = self.fallback_dcmstack(src_dcms) print("DONE\n") if len(nii.shape) > 3: nvols = nii.shape[3] else: nvols = 1 grid = DataGrid(nii.shape[:3], nii.header.get_best_affine()) self.dcmdata = nii.get_data() QpData.__init__(self, fname, grid, nvols, fname=fname)
def dcm_to_nii(dcm, nii_file_name): try: stacks = dcmstack.parse_and_stack(dcm) for stack in stacks.itervalues(): nii = stack.to_nifti() nii.to_filename(nii_file_name) break except: print 'dcmstack DICOM to NIFTI failed.'
def import_dicom(search_path, extension='IMA'): import dcmstack from glob import glob search_string = search_path + '/*.' + extension src_paths = glob(search_string) stacks = dcmstack.parse_and_stack(src_paths) images = [] for key in stacks.keys(): stack = stacks[key] image = nifti_to_occiput(stack.to_nifti()) images.append(image) return images
def import_dicom(search_path, extension='IMA'): if(not dcmstack_available): raise ("Pleast install dcmstack from https://github.com/moloney/dcmstack/tags") else: search_string = search_path + '/*.' + extension src_paths = glob(search_string) stacks = dcmstack.parse_and_stack(src_paths) images = [] for key in stacks.keys(): stack = stacks[key] image = nifti_to_occiput(stack.to_nifti()) images.append(image) return images
def test_default(self): res = dcmstack.parse_and_stack(self.in_paths) eq_(len(res), 1) ds = pydicom.read_file(self.in_paths[0]) group_key = list(res.keys())[0] for attr_idx, attr in enumerate(dcmstack.default_group_keys): if attr in dcmstack.default_close_keys: ok_(np.allclose(group_key[attr_idx], getattr(ds, attr))) else: eq_(group_key[attr_idx], getattr(ds, attr)) stack = list(res.values())[0] ok_(isinstance(stack, dcmstack.DicomStack)) stack_data = stack.get_data() eq_(stack_data.ndim, 4)
def _run_interface(self, runtime): src_paths = self._get_filelist(self.inputs.dicom_files) stacks = dcmstack.parse_and_stack(src_paths) self.out_list = [] for key, stack in stacks.iteritems(): nw = NiftiWrapper(stack.to_nifti(embed_meta=True)) const_meta = nw.meta_ext.get_class_dict(('global', 'const')) out_path = self._get_out_path(const_meta) if not self.inputs.embed_meta: nw.remove_extension() nb.save(nw.nii_img, out_path) self.out_list.append(out_path) return runtime
def _run_interface(self, runtime): src_paths = self._get_filelist(self.inputs.dicom_files) stacks = dcmstack.parse_and_stack(src_paths) self.out_list = [] for key, stack in list(stacks.items()): nw = NiftiWrapper(stack.to_nifti(embed_meta=True)) const_meta = nw.meta_ext.get_class_dict(("global", "const")) out_path = self._get_out_path(const_meta) if not self.inputs.embed_meta: nw.remove_extension() nb.save(nw.nii_img, out_path) self.out_list.append(out_path) return runtime
def load_dicom_old(search_path, extension='IMA'): progress_bar = ProgressBar(title='Reading src') progress_bar.set_percentage(0.1) if (not dcmstack_available): progress_bar.set_percentage(100.0) raise Exception("Pleast install dcmstack from https://github.com/moloney/dcmstack/tags") else: search_string = search_path + '/*.' + extension src_paths = glob(search_string) stacks = dcmstack.parse_and_stack(src_paths) images = [] for k, key in enumerate(stacks.keys()): stack = stacks[key] img = nipy2occiput(stack.to_nifti(embed_meta=True)) images.append(img) progress_bar.set_percentage((k + 1) * 100.0 / len(stacks.keys())) progress_bar.set_percentage(100.0) return images
def get_dicom_info(dicom_dir, dest): """Return a freesurfer style dicom info generator """ fl = sorted(glob(os.path.join(dicom_dir, '*.dcm'))) stack = parse_and_stack(fl, force=True, warn_on_except=True) info = {} for key in sorted(stack): key_fields = key.split('-') idx = int(key_fields[0]) name = key_fields[1] stack_object = stack[key] if not stack_object.error: size = list(stack_object.get_shape()) if len(size) == 3: size.append(1) err_status = 'ok' out_fn = sanitize_path_comp(key) + '.nii.gz' out_path = os.path.join(dest, out_fn) nii = stack_object.to_nifti(embed_meta=True) nii_wrp = NiftiWrapper(nii) meta_fn = out_fn + '.json' meta_path = os.path.join(dest, meta_fn) with open(meta_path, 'w') as fp: fp.write(nii_wrp.meta_ext.to_json()) nii.to_filename(out_path) else: size = [0, 0, 0, 0] err_status = 'err' out_fn = None meta_fn = None filepath = out_fn filename = stack_object._files_info[0][2] info[idx] = dict(idx=idx, name=name, err_status=err_status, size=size, filename=filename, filepath=filepath, metapath=meta_fn) size = [str(val) for val in size] print '\t'.join([str(idx), name, err_status] + size + [filename]) return info
""" import os os.chdir('/Users/m131199/Downloads/LGG-229/MRI_Hd/axial_T1/') from nipype.interfaces.dcmstack import DcmStack stacker = DcmStack() stacker.inputs.dicom_files = '/Users/m131199/Downloads/LGG-229/MRI_Hd/axial_T1/' stacker.run() #result.outputs.out_file import dcmstack from glob import glob src_dcms = glob('/Users/m131199/Downloads/LGG-229/MRI_Hd/axial_T1/*.dcm') stacks = dcmstack.parse_and_stack(src_dcms) stack = stacks.values[0] nii = stack.to_nifti() nii.to_filename('output.nii.gz') #import os #os.chdir('/Users/m131199/Downloads/LGG-229/MRI_Hd/AX_T2_OBL/') #from nipype.interfaces.freesurfer import DICOMConvert #cvt = DICOMConvert() #cvt.inputs.dicom_dir = '/Users/m131199/Downloads/LGG-229/MRI_Hd/AX_T2_OBL/' #cvt.inputs.file_mapping = [('nifti', '*.nii'), ('info', 'dicom*.txt'), ('dti', '*dti.bv*')] # #from nipype.interfaces.dcm2nii import Dcm2nii #converter = Dcm2nii() #converter.inputs.source_names = ['/Users/m131199/Downloads/LGG-229/MRI_Hd/AX_T2_OBL/9999.193444720349620986809184775663710556976.dcm'] #converter.inputs.gzip_output = True
def embed_nifti(dcmfiles, niftifile, infofile, bids_info, force, min_meta): """ If `niftifile` doesn't exist, it gets created out of the `dcmfiles` stack, and json representation of its meta_ext is returned (bug since should return both niftifile and infofile?) if `niftifile` exists, its affine's orientation information is used while establishing new `NiftiImage` out of dicom stack and together with `bids_info` (if provided) is dumped into json `infofile` Parameters ---------- dcmfiles niftifile infofile bids_info force min_meta Returns ------- niftifile, infofile """ # imports for nipype import nibabel as nb import os import os.path as op import json import re if not min_meta: import dcmstack as ds stack = ds.parse_and_stack(dcmfiles, force=force).values() if len(stack) > 1: raise ValueError('Found multiple series') stack = stack[0] #Create the nifti image using the data array if not op.exists(niftifile): nifti_image = stack.to_nifti(embed_meta=True) nifti_image.to_filename(niftifile) return ds.NiftiWrapper(nifti_image).meta_ext.to_json() orig_nii = nb.load(niftifile) aff = orig_nii.affine ornt = nb.orientations.io_orientation(aff) axcodes = nb.orientations.ornt2axcodes(ornt) new_nii = stack.to_nifti(voxel_order=''.join(axcodes), embed_meta=True) meta = ds.NiftiWrapper(new_nii).meta_ext.to_json() meta_info = None if min_meta else json.loads(meta) if bids_info: if min_meta: meta_info = bids_info else: # make nice with python 3 - same behavior? meta_info = meta_info.copy() meta_info.update(bids_info) # meta_info = dict(meta_info.items() + bids_info.items()) try: meta_info['TaskName'] = (re.search( '(?<=_task-)\w+', op.basename(infofile)).group(0).split('_')[0]) except AttributeError: pass # write to outfile with open(infofile, 'wt') as fp: json.dump(meta_info, fp, indent=3, sort_keys=True) return niftifile, infofile
import dcmstack from glob import glob src_paths = glob( '/media/gregory/Acer2/Users/grego/Documents/CNI/CNI_BOSTON_DATA/WOLFSON_SUBSET_REDUCED2/sub-005/ses-4yr/Rest210_2/*.dcm' ) stacks = dcmstack.parse_and_stack(src_paths, force=True)