Beispiel #1
0
    def writeImage(self, filestem, format_type="analyze",
                   datatype="magnitude", **kwargs):
        """
        Export the image object in a medical file format (ANALYZE or NIFTI).
        format_type is one of the internal file format specifiers, which
        are currently %s.
        possible keywords are:
        datatype -- a datatype identifier, supported by the given format
        targetdim -- number of dimensions per file
        filetype -- differentiates single + dual formats for NIFTI
        suffix -- over-ride default suffix style (eg volume0001)

        If necessary, a scaling is found for integer types
        """%(" ; ".join(available_writers))

        new_dtype = recon_output2dtype.get(datatype.lower(), None)
        if new_dtype is None:
            raise ValueError("Unsupported data type: %s"%datatype)

        # The image writing tool does scaling only to preserve dynamic range
        # when saving an as integer data type. Therefore specifying a scale
        # in the writeImage kwargs is not appropriate, since it would
        # cause the image writing logic to "unscale" the data first--it
        # is not to be used as a "gain" knob.
        try:
            kwargs.pop('scale')
        except KeyError:
            pass
        if new_dtype in integer_ranges.keys():
            scale = float(scale_data(self[:], new_dtype))
        else:
            scale = float(1.0)

        _write(self, filestem, format_type, scale=scale,
               dtype=new_dtype,**kwargs)
Beispiel #2
0
    def load_image(self, filename, target_dtype, vrange):
        # bytes per pixel
        bytepix = self.bitpix / 8
        numtype = datatype2dtype[self.datatype]
        byteoffset = 0
        if target_dtype is not None and \
               not range_exceeds(target_dtype, numtype):
            raise ValueError("the dynamic range of the desired datatype does "\
                             "not exceed that of the raw data")
        # need to cook tdim if vrange is set
        if self.tdim and vrange:
            vend = (vrange[1]<0 or vrange[1]>=self.tdim) \
                   and self.tdim-1 or vrange[1]
            vstart = (vrange[0] > vend) and vend or vrange[0]
            self.tdim = vend - vstart + 1
            byteoffset = vstart * bytepix * np.product(
                (self.kdim, self.jdim, self.idim))

        dims = self.tdim > 1 and (self.tdim, self.kdim, self.jdim, self.idim) \
               or (self.kdim, self.jdim, self.idim)
        datasize = bytepix * np.product(dims)
        fp = file(filename, 'rb')
        fp.seek(byteoffset, 1)
        data = np.fromstring(fp.read(datasize), numtype).reshape(dims)
        if self.swapped: data = data.byteswap()
        if target_dtype is not None and target_dtype != numtype:
            if target_dtype not in integer_ranges.keys():
                scale = self.scale_factor or 1.0
                self.data = (data * scale).astype(target_dtype)
            else:
                self.data = data.astype(target_dtype)
        else:
            self.data = data
        fp.close()
Beispiel #3
0
    def load_image(self, filename, target_dtype, vrange):
        # bytes per pixel
        bytepix = self.bitpix / 8
        numtype = datatype2dtype[self.datatype]
        byteoffset = 0
        if target_dtype is not None and not range_exceeds(target_dtype, numtype):
            raise ValueError("the dynamic range of the desired datatype does " "not exceed that of the raw data")
        # need to cook tdim if vrange is set
        if self.tdim and vrange:
            vend = (vrange[1] < 0 or vrange[1] >= self.tdim) and self.tdim - 1 or vrange[1]
            vstart = (vrange[0] > vend) and vend or vrange[0]
            self.tdim = vend - vstart + 1
            byteoffset = vstart * bytepix * np.product((self.kdim, self.jdim, self.idim))

        dims = self.tdim > 1 and (self.tdim, self.kdim, self.jdim, self.idim) or (self.kdim, self.jdim, self.idim)
        datasize = bytepix * np.product(dims)
        fp = file(filename, "rb")
        fp.seek(byteoffset, 1)
        data = np.fromstring(fp.read(datasize), numtype).reshape(dims)
        if self.swapped:
            data = data.byteswap()
        if target_dtype is not None and target_dtype != numtype:
            if target_dtype not in integer_ranges.keys():
                scale = self.scale_factor or 1.0
                self.data = (data * scale).astype(target_dtype)
            else:
                self.data = data.astype(target_dtype)
        else:
            self.data = data
        fp.close()
Beispiel #4
0
    def writeImage(self,
                   filestem,
                   format_type="analyze",
                   datatype="magnitude",
                   **kwargs):
        """
        Export the image object in a medical file format (ANALYZE or NIFTI).
        format_type is one of the internal file format specifiers, which
        are currently %s.
        possible keywords are:
        datatype -- a datatype identifier, supported by the given format
        targetdim -- number of dimensions per file
        filetype -- differentiates single + dual formats for NIFTI
        suffix -- over-ride default suffix style (eg volume0001)

        If necessary, a scaling is found for integer types
        """ % (" ; ".join(available_writers))

        new_dtype = recon_output2dtype.get(datatype.lower(), None)
        if new_dtype is None:
            raise ValueError("Unsupported data type: %s" % datatype)

        # The image writing tool does scaling only to preserve dynamic range
        # when saving an as integer data type. Therefore specifying a scale
        # in the writeImage kwargs is not appropriate, since it would
        # cause the image writing logic to "unscale" the data first--it
        # is not to be used as a "gain" knob.
        try:
            kwargs.pop('scale')
        except KeyError:
            pass
        if new_dtype in integer_ranges.keys():
            scale = float(scale_data(self[:], new_dtype))
        else:
            scale = float(1.0)

        _write(self,
               filestem,
               format_type,
               scale=scale,
               dtype=new_dtype,
               **kwargs)
Beispiel #5
0
    def load_data(self, filestem, target_dtype, vrange):
        bytepix = self.bitpix/8
        numtype = datatype2dtype[self.datatype]
        byteoffset = 0
        if target_dtype is not None and \
               not range_exceeds(target_dtype, numtype):
            raise ValueError("the dynamic range of the desired datatype does "\
                             "not exceed that of the raw data")
        if self.filetype == 'single':
            fp = open(filestem+".nii", 'rb')
            fp.seek(self.vox_offset)
        else:
            fp = open(filestem+".img", 'rb')
        # need to cook tdim if vrange is set
        if self.tdim and vrange:
            vend = (vrange[1]<0 or vrange[1]>=self.tdim) \
                   and self.tdim-1 or vrange[1]
            vstart = (vrange[0] > vend) and vend or vrange[0]
            self.tdim = vend-vstart+1
            byteoffset = vstart*bytepix*N.product((self.kdim,
                                                   self.jdim,self.idim))

        dims = self.tdim > 1 and (self.tdim, self.kdim, self.jdim, self.idim) \
               or self.kdim > 1 and (self.kdim, self.jdim, self.idim) \
               or (self.jdim, self.idim)
        datasize = bytepix * N.product(dims)
        fp.seek(byteoffset, 1)
        data = N.fromstring(fp.read(datasize), numtype).reshape(dims)
        if self.swapped: data = data.byteswap()

        if target_dtype is not None and target_dtype != numtype:
            if target_dtype not in integer_ranges.keys():
                scaling = self.scl_slope or 1.0
                yinter = self.scl_inter
                self.data = (data*scaling+yinter).astype(target_dtype)
            else:
                self.data = data.astype(target_dtype)
        else:
            self.data = data
        fp.close()