Exemplo n.º 1
0
    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.')
Exemplo n.º 2
0
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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
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