1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
# ==========================================================================
#
# Copyright NumFOCUS
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0.txt
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# ==========================================================================*/
# also test the import callback feature
import sys
import os
import numpy as np
import pathlib
import itk
filename = sys.argv[1]
# xarray conversion
try:
import xarray as xr
print("Testing xarray conversion")
image = itk.imread(filename)
image.SetSpacing((0.1, 0.2))
image.SetOrigin((30.0, 44.0))
theta = np.radians(30)
cosine = np.cos(theta)
sine = np.sin(theta)
rotation = np.array(((cosine, -sine), (sine, cosine)))
image.SetDirection(rotation)
image["MyMeta"] = 4.0
data_array = itk.xarray_from_image(image)
# Default name
assert data_array.name == "image"
image.SetObjectName("test_image")
data_array = itk.xarray_from_image(image)
assert data_array.name == "test_image"
assert data_array.dims[0] == "y"
assert data_array.dims[1] == "x"
assert data_array.dims[2] == "c"
assert np.array_equal(data_array.values, itk.array_from_image(image))
assert len(data_array.coords["x"]) == 256
assert len(data_array.coords["y"]) == 256
assert len(data_array.coords["c"]) == 3
assert data_array.coords["x"][0] == 30.0
assert data_array.coords["x"][1] == 30.1
assert data_array.coords["y"][0] == 44.0
assert data_array.coords["y"][1] == 44.2
assert data_array.coords["c"][0] == 0
assert data_array.coords["c"][1] == 1
assert data_array.attrs["direction"][0, 0] == cosine
assert data_array.attrs["direction"][0, 1] == sine
assert data_array.attrs["direction"][1, 0] == -sine
assert data_array.attrs["direction"][1, 1] == cosine
assert data_array.attrs["MyMeta"] == 4.0
round_trip = itk.image_from_xarray(data_array)
assert round_trip.GetObjectName() == "test_image"
assert np.array_equal(itk.array_from_image(round_trip), itk.array_from_image(image))
spacing = round_trip.GetSpacing()
assert np.isclose(spacing[0], 0.1)
assert np.isclose(spacing[1], 0.2)
origin = round_trip.GetOrigin()
assert np.isclose(origin[0], 30.0)
assert np.isclose(origin[1], 44.0)
direction = round_trip.GetDirection()
assert np.isclose(direction(0, 0), cosine)
assert np.isclose(direction(0, 1), -sine)
assert np.isclose(direction(1, 0), sine)
assert np.isclose(direction(1, 1), cosine)
assert round_trip["MyMeta"] == 4.0
wrong_order = data_array.swap_dims({"y": "z"})
try:
round_trip = itk.image_from_xarray(wrong_order)
assert False
except ValueError:
pass
# Check empty array
empty_array = np.array([], dtype=np.uint8)
empty_array.shape = (0, 0, 0)
empty_image = itk.image_from_array(empty_array)
empty_da = itk.xarray_from_image(empty_image)
empty_image_round = itk.image_from_xarray(empty_da)
# Check order
arr = np.random.randint(0, 255, size=(4, 5, 6), dtype=np.uint8)
data_array = xr.DataArray(arr, dims=["z", "y", "x"])
image = itk.image_from_xarray(data_array)
assert np.allclose(arr, itk.array_view_from_image(image))
assert np.allclose(arr.shape, itk.array_view_from_image(image).shape)
data_array = xr.DataArray(arr, dims=["x", "y", "z"])
image = itk.image_from_xarray(data_array)
assert np.allclose(arr.transpose(), itk.array_view_from_image(image))
assert np.allclose(arr.shape[::-1], itk.array_view_from_image(image).shape)
data_array = xr.DataArray(arr, dims=["y", "x", "c"])
image = itk.image_from_xarray(data_array)
assert np.allclose(arr, itk.array_view_from_image(image))
assert np.allclose(arr.shape, itk.array_view_from_image(image).shape)
data_array = xr.DataArray(arr, dims=["c", "x", "y"])
image = itk.image_from_xarray(data_array)
assert np.allclose(arr.transpose(), itk.array_view_from_image(image))
assert np.allclose(arr.shape[::-1], itk.array_view_from_image(image).shape)
# Test in-place "view" where xarray data is valid only as long as ITK image
data_array = itk.xarray_from_image(image, view=True)
assert data_array.name == image.GetObjectName()
# verify we can run a computation on xarray data
assert 0 <= data_array.min().compute() <= 255
data_array = xr.DataArray(arr, dims=["q", "x", "y"])
try:
image = itk.image_from_xarray(data_array)
assert False
except ValueError:
pass
if "(<itkCType unsigned char>, 4)" in itk.Image.GetTypesAsList():
arr = np.random.randint(0, 255, size=(4, 5, 6, 3), dtype=np.uint8)
data_array = xr.DataArray(arr, dims=["t", "z", "y", "x"])
image = itk.image_from_xarray(data_array)
assert np.allclose(arr, itk.array_view_from_image(image))
assert np.allclose(arr.shape, itk.array_view_from_image(image).shape)
except ImportError:
print("xarray not imported. Skipping xarray conversion tests")
pass
|