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)
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()
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()
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)
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()