def __init__(self, param=None, hdr=None, orientation=None, absolutepath=None, dim=None, verbose=1): from nibabel import Nifti1Header # initialization of all parameters self.im_file = None self.data = None self._path = None self.ext = "" if hdr is None: hdr = self.hdr = Nifti1Header() # an empty header else: self.hdr = hdr if absolutepath is not None: self._path = os.path.abspath(absolutepath) self.verbose = verbose # load an image from file if isinstance(param, str) or (sys.hexversion < 0x03000000 and isinstance(param, unicode)): self.loadFromPath(param, verbose) # copy constructor elif isinstance(param, type(self)): self.copy(param) # create an empty image (full of zero) of dimension [dim]. dim must be [x,y,z] or (x,y,z). No header. elif isinstance(param, list): self.data = np.zeros(param) self.hdr = hdr # create a copy of im_ref elif isinstance(param, (np.ndarray, np.generic)): self.data = param self.hdr = hdr else: raise TypeError('Image constructor takes at least one argument.')
def test_output_dtypes(): shape = (4, 2, 3) rng = np.random.RandomState(19441217) # IN-S BD data = rng.normal(4, 20, size=shape) aff = np.diag([2.2, 3.3, 4.1, 1]) cmap = vox2mni(aff) img = Image(data, cmap) fname_root = 'my_file' with InTemporaryDirectory(): for ext in 'img', 'nii': out_fname = fname_root + '.' + ext # Default is for data to come from data dtype save_image(img, out_fname) img_back = load_image(out_fname) hdr = img_back.metadata['header'] assert_dt_no_end_equal(hdr.get_data_dtype(), np.float) del img_back # lets window re-use the file # All these types are OK for both output formats for out_dt in 'i2', 'i4', np.int16, '<f4', '>f8': # Specified output dtype save_image(img, out_fname, out_dt) img_back = load_image(out_fname) hdr = img_back.metadata['header'] assert_dt_no_end_equal(hdr.get_data_dtype(), out_dt) del img_back # windows file re-use # Output comes from data by default data_typed = data.astype(out_dt) img_again = Image(data_typed, cmap) save_image(img_again, out_fname) img_back = load_image(out_fname) hdr = img_back.metadata['header'] assert_dt_no_end_equal(hdr.get_data_dtype(), out_dt) del img_back # Even if header specifies otherwise in_hdr = Nifti1Header() in_hdr.set_data_dtype(np.dtype('c8')) img_more = Image(data_typed, cmap, metadata={'header': in_hdr}) save_image(img_more, out_fname) img_back = load_image(out_fname) hdr = img_back.metadata['header'] assert_dt_no_end_equal(hdr.get_data_dtype(), out_dt) del img_back # But can come from header if specified save_image(img_more, out_fname, dtype_from='header') img_back = load_image(out_fname) hdr = img_back.metadata['header'] assert_dt_no_end_equal(hdr.get_data_dtype(), 'c8') del img_back # u2 only OK for nifti save_image(img, 'my_file.nii', 'u2') img_back = load_image('my_file.nii') hdr = img_back.metadata['header'] assert_dt_no_end_equal(hdr.get_data_dtype(), 'u2') # Check analyze can't save u2 datatype assert_raises(HeaderDataError, save_image, img, 'my_file.img', 'u2') del img_back
def from_h5obj(cls, fileobj, check=True): """Read the struct from a file object.""" xfm_list = [] h5group = fileobj["TransformGroup"] typo_fallback = "Transform" try: h5group["1"][f"{typo_fallback}Parameters"] except KeyError: typo_fallback = "Tranform" for xfm in list(h5group.values())[1:]: if xfm["TransformType"][0].startswith(b"AffineTransform"): _params = np.asanyarray(xfm[f"{typo_fallback}Parameters"]) xfm_list.append( ITKLinearTransform( parameters=from_matvec(_params[:-3].reshape(3, 3), _params[-3:]), offset=np.asanyarray( xfm[f"{typo_fallback}FixedParameters"]), )) continue if xfm["TransformType"][0].startswith( b"DisplacementFieldTransform"): _fixed = np.asanyarray(xfm[f"{typo_fallback}FixedParameters"]) shape = _fixed[:3].astype("uint16").tolist() offset = _fixed[3:6].astype("uint16") zooms = _fixed[6:9].astype("float") directions = _fixed[9:].astype("float").reshape((3, 3)) affine = from_matvec(directions * zooms, offset) field = np.asanyarray( xfm[f"{typo_fallback}Parameters"]).reshape( tuple(shape + [1, -1])) hdr = Nifti1Header() hdr.set_intent("vector") hdr.set_data_dtype("float") xfm_list.append( ITKDisplacementsField.from_image( Nifti1Image(field.astype("float"), affine, hdr))) continue raise NotImplementedError( f"Unsupported transform type {xfm['TransformType'][0]}") return xfm_list
def save_ics(icas, mask, threshold, output_dir, header, mean=None): """ Save the independant compnents to Nifti. Parameters ----------- icas: 2D ndarray The independant components, as returned by CanICA. mask: 3D ndarray The 3D boolean array used to go from index to voxel space for each IC. threshold: float The threshold value used to threshold the ICs output_dir: string The directory in which maps and nifti files will be saved. header: dictionnary or Nifti1Header object The header for the nifti file, as returned by pynifti's header attribute, or nipy.io.imageformats.load().get_header(). """ # put in order n_ic, n_voxels icas = icas.T mask = mask.astype(np.bool) try: affine = header.get_best_affine() except: affine = header['sform'] # XXX: I don't know how to convert a dictionnary to a # Nifti1Header. h = Nifti1Header() for k, v in header.iteritems(): try: h[k] = v except ValueError: pass header = h header['cal_max'] = np.nanmax(icas) header['cal_min'] = np.nanmin(icas) if not os.path.exists(output_dir): os.mkdir(output_dir) icas = icas.copy() for ic in icas: ic *= auto_sign(ic, threshold=threshold) maps3d = np.zeros(list(mask.shape) + [len(icas)]) maps3d[mask] = icas.T save(Nifti1Image(maps3d, affine, header=header), pjoin(output_dir, 'icas_no_thr.nii')) maps3d[np.abs(maps3d) < threshold] = 0 save(Nifti1Image(maps3d, affine, header=header), pjoin(output_dir, 'icas.nii')) # Save the mask mask_header = header.copy() mask_header['cal_min'] = 0 mask_header['cal_max'] = 1 save(Nifti1Image(mask.astype(np.int), affine, header=mask_header), pjoin(output_dir, 'mask.nii')) if mean is not None: # save the mean mean_img = np.zeros(maps3d.shape[:-1]) mean_img[mask] = mean mean_header = header.copy() mean_header['cal_min'] = mean.min() mean_header['cal_max'] = mean.max() save(Nifti1Image(mean_img, affine, header=mean_header), pjoin(output_dir, 'mean.nii')) return maps3d, affine, mean_img return maps3d, affine