def loadImage(self, ImageFilePath, MaskFilePath): """ Preprocess the image and labelmap. If ImageFilePath is a string, it is loaded as SimpleITK Image and assigned to image, if it already is a SimpleITK Image, it is just assigned to image. All other cases are ignored (nothing calculated). Equal approach is used for assignment of mask using MaskFilePath. If normalizing is enabled image is first normalized before any resampling is applied. If resampling is enabled, both image and mask are resampled and cropped to the tumor mask (with additional padding as specified in padDistance) after assignment of image and mask. """ self.logger.info('Loading image and mask') if isinstance(ImageFilePath, six.string_types) and os.path.isfile(ImageFilePath): image = sitk.ReadImage(ImageFilePath) elif isinstance(ImageFilePath, sitk.SimpleITK.Image): image = ImageFilePath else: self.logger.warning( 'Error reading image Filepath or SimpleITK object') return None, None # this function is expected to always return a tuple of 2 elements if isinstance(MaskFilePath, six.string_types) and os.path.isfile(MaskFilePath): mask = sitk.ReadImage(MaskFilePath) elif isinstance(MaskFilePath, sitk.SimpleITK.Image): mask = MaskFilePath else: self.logger.warning( 'Error reading mask Filepath or SimpleITK object') return None, None # this function is expected to always return a tuple of 2 elements # This point is only reached if image and mask loaded correctly if self.settings['normalize']: image = imageoperations.normalizeImage( image, self.settings['normalizeScale'], self.settings['removeOutliers']) if self.settings['interpolator'] is not None and self.settings[ 'resampledPixelSpacing'] is not None: image, mask = imageoperations.resampleImage( image, mask, self.settings['resampledPixelSpacing'], self.settings['interpolator'], self.settings['label'], self.settings['padDistance']) elif self.settings['preCrop']: bb, correctedMask = imageoperations.checkMask( image, mask, **self.settings) if correctedMask is not None: # Update the mask if it had to be resampled mask = correctedMask if bb is None: # Mask checks failed return None, None image, mask = imageoperations.cropToTumorMask( image, mask, bb, self.settings['padDistance']) return image, mask
def loadImage(self, ImageFilePath, MaskFilePath): """ Preprocess the image and labelmap. If ImageFilePath is a string, it is loaded as SimpleITK Image and assigned to image, if it already is a SimpleITK Image, it is just assigned to image. All other cases are ignored (nothing calculated). Equal approach is used for assignment of mask using MaskFilePath. If normalizing is enabled image is first normalized before any resampling is applied. If resampling is enabled, both image and mask are resampled and cropped to the tumor mask (with additional padding as specified in padDistance) after assignment of image and mask. """ if isinstance(ImageFilePath, six.string_types) and os.path.exists(ImageFilePath): image = sitk.ReadImage(ImageFilePath) elif isinstance(ImageFilePath, sitk.SimpleITK.Image): image = ImageFilePath else: self.logger.warning( 'Error reading image Filepath or SimpleITK object') if self.kwargs['verbose']: print("Error reading image Filepath or SimpleITK object") image = None if isinstance(MaskFilePath, six.string_types) and os.path.exists(MaskFilePath): mask = sitk.ReadImage(MaskFilePath) elif isinstance(MaskFilePath, sitk.SimpleITK.Image): mask = MaskFilePath else: self.logger.warning( 'Error reading mask Filepath or SimpleITK object') if self.kwargs['verbose']: print("Error reading mask Filepath or SimpleITK object") mask = None if image is not None and mask is not None: if self.kwargs['normalize']: image = imageoperations.normalizeImage( image, self.kwargs['normalizeScale'], self.kwargs['removeOutliers']) if self.kwargs['interpolator'] is not None and self.kwargs[ 'resampledPixelSpacing'] is not None: image, mask = imageoperations.resampleImage( image, mask, self.kwargs['resampledPixelSpacing'], self.kwargs['interpolator'], self.kwargs['label'], self.kwargs['padDistance']) return image, mask
def loadImage(self, ImageFilePath, MaskFilePath): """ Preprocess the image and labelmap. If ImageFilePath is a string, it is loaded as SimpleITK Image and assigned to image, if it already is a SimpleITK Image, it is just assigned to image. All other cases are ignored (nothing calculated). Equal approach is used for assignment of mask using MaskFilePath. If normalizing is enabled image is first normalized before any resampling is applied. If resampling is enabled, both image and mask are resampled and cropped to the tumor mask (with additional padding as specified in padDistance) after assignment of image and mask. """ normalize = self.settings.get('normalize', False) interpolator = self.settings.get('interpolator') resampledPixelSpacing = self.settings.get('resampledPixelSpacing') preCrop = self.settings.get('preCrop', False) label = self.settings.get('label', 1) self.logger.info('Loading image and mask') if isinstance(ImageFilePath, six.string_types) and os.path.isfile(ImageFilePath): image = sitk.ReadImage(ImageFilePath) elif isinstance(ImageFilePath, sitk.SimpleITK.Image): image = ImageFilePath else: raise ValueError( 'Error reading image Filepath or SimpleITK object') if isinstance(MaskFilePath, six.string_types) and os.path.isfile(MaskFilePath): mask = sitk.ReadImage(MaskFilePath, sitk.sitkUInt32) elif isinstance(MaskFilePath, sitk.SimpleITK.Image): mask = sitk.Cast(MaskFilePath, sitk.sitkUInt32) else: raise ValueError('Error reading mask Filepath or SimpleITK object') if self.generalInfo is not None: self.generalInfo.addImageElements(image) # Do not include the image here, as the overlap between image and mask have not been checked # It is therefore possible that image and mask do not align, or even have different sizes. self.generalInfo.addMaskElements(None, mask, label) # This point is only reached if image and mask loaded correctly if normalize: image = imageoperations.normalizeImage(image, **self.settings) if interpolator is not None and resampledPixelSpacing is not None: image, mask = imageoperations.resampleImage( image, mask, **self.settings) if self.generalInfo is not None: self.generalInfo.addImageElements(image, 'interpolated') self.generalInfo.addMaskElements(image, mask, self.settings.get('label', 1), 'interpolated') elif preCrop: bb, correctedMask = imageoperations.checkMask( image, mask, **self.settings) if correctedMask is not None: # Update the mask if it had to be resampled mask = correctedMask if bb is None: # Mask checks failed raise ValueError('Mask checks failed during pre-crop') image, mask = imageoperations.cropToTumorMask( image, mask, bb, **self.settings) return image, mask
def loadImage(ImageFilePath, MaskFilePath, otherImageFilePath, generalInfo=None, **kwargs): """ Load and pre-process the image and labelmap. If ImageFilePath is a string, it is loaded as SimpleITK Image and assigned to ``image``, if it already is a SimpleITK Image, it is just assigned to ``image``. All other cases are ignored (nothing calculated). Equal approach is used for assignment of ``mask`` using MaskFilePath. If necessary, a segmentation object (i.e. mask volume with vector-image type) is then converted to a labelmap (=scalar image type). Data type is forced to UInt32. See also :py:func:`~imageoperations.getMask()`. If normalizing is enabled image is first normalized before any resampling is applied. If resampling is enabled, both image and mask are resampled and cropped to the tumor mask (with additional padding as specified in padDistance) after assignment of image and mask. :param ImageFilePath: SimpleITK.Image object or string pointing to SimpleITK readable file representing the image to use. :param MaskFilePath: SimpleITK.Image object or string pointing to SimpleITK readable file representing the mask to use. :param generalInfo: GeneralInfo Object. If provided, it is used to store diagnostic information of the pre-processing. :param kwargs: Dictionary containing the settings to use for this particular image type. :return: 2 SimpleITK.Image objects representing the loaded image and mask, respectively. """ global logger normalize = kwargs.get('normalize', False) interpolator = kwargs.get('interpolator') resampledPixelSpacing = kwargs.get('resampledPixelSpacing') preCrop = kwargs.get('preCrop', False) label = kwargs.get('label', 1) logger.info('Loading image and mask') if isinstance(ImageFilePath, six.string_types) and os.path.isfile(ImageFilePath): image = sitk.ReadImage(ImageFilePath) elif isinstance(ImageFilePath, sitk.SimpleITK.Image): image = ImageFilePath else: raise ValueError( 'Error reading image Filepath or SimpleITK object') if isinstance(MaskFilePath, six.string_types) and os.path.isfile(MaskFilePath): mask = sitk.ReadImage(MaskFilePath) elif isinstance(MaskFilePath, sitk.SimpleITK.Image): mask = MaskFilePath else: raise ValueError('Error reading mask Filepath or SimpleITK object') # Read other image for washin if otherImageFilePath is not None: if isinstance( otherImageFilePath, six.string_types) and os.path.isfile(otherImageFilePath): imageOther = sitk.ReadImage(otherImageFilePath) elif isinstance(otherImageFilePath, sitk.SimpleITK.Image): imageOther = otherImageFilePath else: raise ValueError( 'Error reading image Filepath or SimpleITK object') # Align input types caster = sitk.CastImageFilter() caster.SetOutputPixelType(sitk.sitkFloat64) image = caster.Execute(image) imageOther = caster.Execute(imageOther) # t1 - t0 f_subtract = sitk.SubtractImageFilter() wash = f_subtract.Execute(imageOther, image) # (t1 - t0) / t0 f_divide = sitk.DivideImageFilter() wash = f_divide.Execute(wash, image) # Replace max Values with 0 f_less = sitk.LessEqualImageFilter() value_mask = f_less.Execute(wash, sys.float_info.max / 2) f_mask = sitk.MaskImageFilter() image = f_mask.Execute(wash, value_mask) # process the mask mask = imageoperations.getMask(mask, **kwargs) if generalInfo is not None: generalInfo.addImageElements(image) # Do not include the image here, as the overlap between image and mask have not been checked # It is therefore possible that image and mask do not align, or even have different sizes. generalInfo.addMaskElements(None, mask, label) # This point is only reached if image and mask loaded correctly if normalize: image = imageoperations.normalizeImage(image, **kwargs) if interpolator is not None and resampledPixelSpacing is not None: image, mask = imageoperations.resampleImage(image, mask, **kwargs) if generalInfo is not None: generalInfo.addImageElements(image, 'interpolated') generalInfo.addMaskElements(image, mask, label, 'interpolated') elif preCrop: bb, correctedMask = imageoperations.checkMask( image, mask, **kwargs) if correctedMask is not None: # Update the mask if it had to be resampled mask = correctedMask if bb is None: # Mask checks failed raise ValueError('Mask checks failed during pre-crop') image, mask = imageoperations.cropToTumorMask( image, mask, bb, **kwargs) return image, mask