Пример #1
0
def test_convert_itk_to_internal(image: Path):
    def assert_img_properties(img: SimpleITK.Image, internal_image: Image):
        color_space = {
            1: Image.COLOR_SPACE_GRAY,
            3: Image.COLOR_SPACE_RGB,
            4: Image.COLOR_SPACE_RGBA,
        }

        assert internal_image.color_space == color_space.get(
            img.GetNumberOfComponentsPerPixel())
        if img.GetDimension() == 4:
            assert internal_image.timepoints == img.GetSize()[-1]
        else:
            assert internal_image.timepoints is None
        if img.GetDepth():
            assert internal_image.depth == img.GetDepth()
            assert internal_image.voxel_depth_mm == img.GetSpacing()[2]
        else:
            assert internal_image.depth is None
            assert internal_image.voxel_depth_mm is None

        assert internal_image.width == img.GetWidth()
        assert internal_image.height == img.GetHeight()
        assert internal_image.voxel_width_mm == approx(img.GetSpacing()[0])
        assert internal_image.voxel_height_mm == approx(img.GetSpacing()[1])
        assert internal_image.resolution_levels is None

    img_ref = load_sitk_image(image)
    internal_image = convert_itk_to_internal(img_ref)
    assert_img_properties(img_ref, internal_image[0])
Пример #2
0
    def get_sitk_image(self):
        """
        Return the image that belongs to this model as an SimpleITK image.

        Requires that exactly one MHD/RAW file pair is associated with the model.
        Otherwise it wil raise a MultipleObjectsReturned or ObjectDoesNotExist
        exception.

        Returns
        -------
            A SimpleITK image
        """
        # self.files should contain 1 .mhd file

        try:
            mhd_file = self.files.get(image_type=ImageFile.IMAGE_TYPE_MHD,
                                      file__endswith=".mha")
            files = [mhd_file]
        except ObjectDoesNotExist:
            # Fallback to files that are still stored as mhd/(z)raw
            mhd_file = self.files.get(image_type=ImageFile.IMAGE_TYPE_MHD,
                                      file__endswith=".mhd")
            raw_file = self.files.get(image_type=ImageFile.IMAGE_TYPE_MHD,
                                      file__endswith="raw")
            files = [mhd_file, raw_file]

        file_size = 0
        for file in files:
            if not file.file.storage.exists(name=file.file.name):
                raise FileNotFoundError(f"No file found for {file.file}")

            # Add up file sizes of mhd and raw file to get total file size
            file_size += file.file.size

        # Check file size to guard for out of memory error
        if file_size > settings.MAX_SITK_FILE_SIZE:
            raise IOError(
                f"File exceeds maximum file size. (Size: {file_size}, Max: {settings.MAX_SITK_FILE_SIZE})"
            )

        with TemporaryDirectory() as tempdirname:
            for file in files:
                with file.file.open("rb") as infile, open(
                        Path(tempdirname) / Path(file.file.name).name,
                        "wb") as outfile:
                    buffer = True
                    while buffer:
                        buffer = infile.read(1024)
                        outfile.write(buffer)

            try:
                hdr_path = Path(tempdirname) / Path(mhd_file.file.name).name
                sitk_image = load_sitk_image(mhd_file=hdr_path)
            except RuntimeError as e:
                logging.error(
                    f"Failed to load SimpleITK image with error: {e}")
                raise

        return sitk_image
    def convert_itk_file(headers: Mapping[str, Union[str, None]],
                         filename: Path) -> Tuple[Image, Sequence[ImageFile]]:
        try:
            simple_itk_image = load_sitk_image(filename.absolute())
            simple_itk_image: SimpleITK.Image
        except RuntimeError:
            raise ValueError("SimpleITK cannot open file")

        return convert_itk_to_internal(simple_itk_image, name=filename.name)