ResampleImageFilter 4D Images

Looks like a good solution to me. I have done similar things when working with 4D XYZC images. This approach is really asking for a reusable solution something like a python function decorator to operate slice_by_slice. Here is what I came up with:


def slicing_decorator(func):
    """
    A function decorator which extracts image slices of N-1 dimensions and calls func on each slice. The resulting
     images are then concatenated together with JoinSeries.
     
    :param func: A function which take a SimpleITK Image as it's first argument
    :return: The result of running func on each slice of image.
    """
    @wraps(func)
    def slice_by_slice(image, *args, **kwargs):

        size = list(image.GetSize())

        number_of_slices = size[-1]
        extract_size = size
        extract_index = [0]*image.GetDimension()

        img_list = []

        extract_size[-1] = 0
        extractor = sitk.ExtractImageFilter()
        extractor.SetSize(extract_size)

        for slice_idx in range(0, number_of_slices):


            extract_index[-1] = slice_idx
            extractor.SetIndex(extract_index)

            img_list.append(func(extractor.Execute(image), *args, **kwargs))

        return sitk.JoinSeries(img_list, image.GetOrigin()[-1], image.GetSpacing()[-1])

    return slice_by_slice


@slicing_decorator
def my_algo(image):
    print("Executing image of size: {0}".format(image.GetSize()))
    return sitk.SmoothingRecursiveGaussian(image)

2 Likes