Пример #1
0
    def test_itk_registration(self):
        import os
        os.environ["FOOTSTEPS_NAME"] = "test"
        import footsteps

        icon_registration.test_utils.download_test_data()

        model = icon_registration.pretrained_models.OAI_knees_registration_model(
            pretrained=True)

        image_A = itk.imread(
            str(icon_registration.test_utils.TEST_DATA_DIR /
                "knees_diverse_sizes" /
                #"9126260_20060921_SAG_3D_DESS_LEFT_11309302_image.nii.gz")
                "9487462_20081003_SAG_3D_DESS_RIGHT_11495603_image.nii.gz"))

        image_B = itk.imread(
            str(icon_registration.test_utils.TEST_DATA_DIR /
                "knees_diverse_sizes" /
                "9225063_20090413_SAG_3D_DESS_RIGHT_12784112_image.nii.gz"))
        print(image_A.GetLargestPossibleRegion().GetSize())
        print(image_B.GetLargestPossibleRegion().GetSize())
        print(image_A.GetSpacing())
        print(image_B.GetSpacing())

        phi_AB, phi_BA = icon_registration.itk_wrapper.register_pair(
            model, image_A, image_B)

        assert (isinstance(phi_AB, itk.CompositeTransform))
        interpolator = itk.LinearInterpolateImageFunction.New(image_A)

        warped_image_A = itk.resample_image_filter(
            image_A,
            transform=phi_AB,
            interpolator=interpolator,
            size=itk.size(image_B),
            output_spacing=itk.spacing(image_B),
            output_direction=image_B.GetDirection(),
            output_origin=image_B.GetOrigin())

        plt.imshow(
            np.array(itk.checker_board_image_filter(warped_image_A,
                                                    image_B))[40])
        plt.colorbar()
        plt.savefig(footsteps.output_dir + "grid.png")
        plt.clf()
        plt.imshow(np.array(warped_image_A)[40])
        plt.savefig(footsteps.output_dir + "warped.png")
        plt.clf()

        reference = np.load(icon_registration.test_utils.TEST_DATA_DIR /
                            "warped.npy")

        np.save(footsteps.output_dir + "warped.npy",
                itk.array_from_image(warped_image_A)[40])

        self.assertLess(
            np.mean(
                np.abs(reference - itk.array_from_image(warped_image_A)[40])),
            1e-6)
Пример #2
0
def downsample_images(images:list, ratio:float) -> list:
    assert(ratio > 1.0)

    downsampled_image_list = list()
    for image in images:
        new_spacing = [spacing * ratio for spacing in itk.spacing(image)]
        new_size = [int(size / ratio) for size in itk.size(image)]
        downsampled_image = itk.resample_image_filter(image,
                                                      size=new_size,
                                                      output_origin=itk.origin(image),
                                                      output_spacing=new_spacing)
        downsampled_image_list.append(downsampled_image)
    return downsampled_image_list
def spine_slice(image, params):
    """
    image is the ITK image to slice from
    params is a SliceParams object"""
    output_spacing = [params.height / params.px, params.width / params.px, 1]

    output_origin = [
        val + params.direction[j, 0] * -params.height / 2 +
        params.direction[j, 1] * -params.width / 2
        for j, val in enumerate(params.origin)
    ]

    #print(output_origin)
    #print(output_spacing)

    return itk.resample_image_filter(image,
                                     output_origin=output_origin,
                                     output_spacing=output_spacing,
                                     OutputDirection=itk.matrix_from_array(
                                         np.ascontiguousarray(
                                             params.direction)),
                                     size=[params.px, params.px, 1])
Пример #4
0
fixed_landmarks.push_back(fixed_point)
moving_landmarks.push_back(moving_point)

fixed_point[0] = 20
fixed_point[1] = 20
moving_point[0] = 60
moving_point[1] = 60
fixed_landmarks.push_back(fixed_point)
moving_landmarks.push_back(moving_point)

TransformInitializerType = itk.LandmarkBasedTransformInitializer[itk.Transform[
    itk.D, Dimension, Dimension]]
transform_initializer = TransformInitializerType.New()

transform_initializer.SetFixedLandmarks(fixed_landmarks)
transform_initializer.SetMovingLandmarks(moving_landmarks)

transform = itk.Rigid2DTransform[itk.D].New()
transform_initializer.SetTransform(transform)
transform_initializer.InitializeTransform()

output = itk.resample_image_filter(
    moving_image,
    transform=transform,
    use_reference_image=True,
    reference_image=fixed_image,
    default_pixel_value=200,
)

itk.imwrite(output, "outputPython.png")
Пример #5
0
parser = argparse.ArgumentParser(description="Resample A Scalar Image.")
parser.add_argument("input_image")
parser.add_argument("output_image")
parser.add_argument("size_x", type=int)
parser.add_argument("size_y", type=int)
args = parser.parse_args()

output_size = [args.size_x, args.size_y]

input_image = itk.imread(args.input_image)

input_spacing = itk.spacing(input_image)
input_size = itk.size(input_image)
dimension = input_image.GetImageDimension()
output_spacing = [
    input_spacing[dim] * input_size[dim] / output_size[dim]
    for dim in range(dimension)
]

transform = itk.IdentityTransform[itk.D, dimension].New()

output_image = itk.resample_image_filter(
    input_image,
    size=output_size,
    output_spacing=output_spacing,
    output_origin=itk.origin(input_image),
    transform=transform,
)

itk.imwrite(output_image, args.output_image)
Пример #6
0
import itk
import argparse

parser = argparse.ArgumentParser(description="Resample A Vector Image.")
parser.add_argument("input_image")
parser.add_argument("output_image")
args = parser.parse_args()

PixelType = itk.RGBPixel[itk.UC]

input_image = itk.imread(args.input_image, pixel_type=PixelType)

ImageType = type(input_image)
interpolator = itk.LinearInterpolateImageFunction[ImageType, itk.D].New()

Dimension = input_image.GetImageDimension()
transform = itk.IdentityTransform[itk.D, Dimension].New()

output_image = itk.resample_image_filter(
    input_image,
    interpolator=interpolator,
    transform=transform,
    default_pixel_value=[50, 50, 50],
    output_spacing=[0.5, 0.5],
    output_origin=[30, 40],
    size=[300, 300],
)

itk.imwrite(output_image, args.output_image)
Пример #7
0
expected_point = itk.Point[itk.D,2]([-22.7057, 13.4688])
point = image.TransformContinuousIndexToPhysicalPoint(continuous_index)
print(f'Expected point: Transformed point: {point}')
assert all([abs(el1 - el2) < 1e-3 for el1, el2 in zip(list(point), list(expected_point))]), f'Output point {point} differs from expectation {expected_point}'

transformed_continuous_index = image.TransformPhysicalPointToContinuousIndex(point)
print(f'Transformed continuous index: {continuous_index}')
assert transformed_continuous_index == continuous_index, f'Output {transformed_continuous_index} differs from expectation {continuous_index}'

# Try transforming last index [2047, 240]
continuous_index[0] = 2047
continuous_index[1] = 240
print(f'Continuous index: {continuous_index}')

expected_point = itk.Point[itk.D,2]([113.099, 67.0891])
point = image.TransformContinuousIndexToPhysicalPoint(continuous_index)
print(f'Transformed point: {point}')
assert all([abs(el1 - el2) < 1e-3 for el1, el2 in zip(list(point), list(expected_point))]), f'Output point {point} differs from expectation {expected_point}'

transformed_continuous_index = image.TransformPhysicalPointToContinuousIndex(point)
print(f'Transformed continuous index: {continuous_index}')
assert transformed_continuous_index == continuous_index, f'Output {transformed_continuous_index} differs from expectation {continuous_index}'

# Verify resampling works with curvilinear image input
output_size = [800] * dimension
output_spacing = [0.15] * dimension
output_origin = [output_size[0] * output_spacing[0] / -2.0,
                 radius_start * math.cos(math.pi / 4.0)]
_ = itk.resample_image_filter(image, size=output_size, output_spacing=output_spacing, output_origin=output_origin)
Пример #8
0
# objects in the image, omit the transform and instead supply:
#
# output_size = [int(input_size[d] * scale) for d in range(Dimension)]
# output_spacing = [input_spacing[d] / scale for d in range(Dimension)]
# output_origin = [input_origin[d] + 0.5 * (output_spacing[d] - input_spacing[d])
#                  for d in range(Dimension)]

output_size = input_size
output_spacing = input_spacing
output_origin = input_origin
scale_transform = itk.ScaleTransform[itk.D, Dimension].New()
scale_transform_parameters = scale_transform.GetParameters()
for i in range(len(scale_transform_parameters)):
    scale_transform_parameters[i] = scale
scale_transform_center = [float(int(s / 2)) for s in input_size]
scale_transform.SetParameters(scale_transform_parameters)
scale_transform.SetCenter(scale_transform_center)

interpolator = itk.LinearInterpolateImageFunction.New(input_image)

resampled = itk.resample_image_filter(
    input_image,
    transform=scale_transform,
    interpolator=interpolator,
    size=output_size,
    output_spacing=output_spacing,
    output_origin=output_origin,
)

itk.imwrite(resampled, output_file_name)
Пример #9
0
#
# Get the final parameters of the transformation
#
final_parameters = registration.GetOutput().Get().GetParameters()

print("\nFinal Registration Parameters: ")
print(f"Translation X =  {final_parameters[0]:f}")
print(f"Translation Y =  {final_parameters[1]:f}")

#
# Now, we use the final transform for resampling the
# moving image.
#
resampled_moving = itk.resample_image_filter(
    moving_image,
    transform=registration.GetTransform(),
    use_reference_image=True,
    reference_image=fixed_image,
    default_pixel_value=100)

#
# Cast to 8-bit unsigned integer pixels, supported by the PNG file format
#
OutputPixelType = itk.ctype('unsigned char')
resampled_cast = resampled_moving.astype(OutputPixelType)

#
#  Write the resampled image
#
itk.imwrite(resampled_cast, output_image_file)