|
3 | 3 |
|
4 | 4 | import numpy as np
|
5 | 5 |
|
6 |
| -from nibabel.spatialimages import ImageFileError |
| 6 | +from nibabel.spatialimages import ImageFileError, HeaderDataError |
| 7 | +from nibabel import Nifti1Header |
7 | 8 |
|
8 | 9 | from ..api import load_image, save_image, as_image
|
9 | 10 | from nipy.core.api import AffineTransform as AfT, Image, vox2mni
|
@@ -125,9 +126,65 @@ def test_scaling_io_dtype():
|
125 | 126 | del img
|
126 | 127 |
|
127 | 128 |
|
128 |
| -def test_from_data(): |
129 |
| - # Default data dtype comes from data |
130 |
| - pass |
| 129 | +def assert_dt_no_end_equal(a, b): |
| 130 | + """ Assert two numpy dtype specifiers are equal apart from byte order |
| 131 | +
|
| 132 | + Avoids failed comparison between int32 / int64 and intp |
| 133 | + """ |
| 134 | + a = np.dtype(a).newbyteorder('=') |
| 135 | + b = np.dtype(b).newbyteorder('=') |
| 136 | + assert_equal(a.str, b.str) |
| 137 | + |
| 138 | + |
| 139 | +def test_output_dtypes(): |
| 140 | + shape = (4, 2, 3) |
| 141 | + rng = np.random.RandomState(19441217) # IN-S BD |
| 142 | + data = rng.normal(4, 20, size=shape) |
| 143 | + aff = np.diag([2.2, 3.3, 4.1, 1]) |
| 144 | + cmap = vox2mni(aff) |
| 145 | + img = Image(data, cmap) |
| 146 | + fname_root = 'my_file' |
| 147 | + with InTemporaryDirectory(): |
| 148 | + for ext in 'img', 'nii': |
| 149 | + out_fname = fname_root + '.' + ext |
| 150 | + # Default is for data to come from data dtype |
| 151 | + save_image(img, out_fname) |
| 152 | + img_back = load_image(out_fname) |
| 153 | + hdr = img_back.metadata['header'] |
| 154 | + assert_dt_no_end_equal(hdr.get_data_dtype(), np.float) |
| 155 | + # All these types are OK for both output formats |
| 156 | + for out_dt in 'i2', 'i4', np.int16, '<f4', '>f8': |
| 157 | + # Specified output dtype |
| 158 | + save_image(img, out_fname, out_dt) |
| 159 | + img_back = load_image(out_fname) |
| 160 | + hdr = img_back.metadata['header'] |
| 161 | + assert_dt_no_end_equal(hdr.get_data_dtype(), out_dt) |
| 162 | + # Output comes from data by default |
| 163 | + data_typed = data.astype(out_dt) |
| 164 | + img_again = Image(data_typed, cmap) |
| 165 | + save_image(img_again, out_fname) |
| 166 | + img_back = load_image(out_fname) |
| 167 | + hdr = img_back.metadata['header'] |
| 168 | + assert_dt_no_end_equal(hdr.get_data_dtype(), out_dt) |
| 169 | + # Even if header specifies otherwise |
| 170 | + in_hdr = Nifti1Header() |
| 171 | + in_hdr.set_data_dtype(np.dtype('c8')) |
| 172 | + img_more = Image(data_typed, cmap, metadata={'header': in_hdr}) |
| 173 | + save_image(img_more, out_fname) |
| 174 | + img_back = load_image(out_fname) |
| 175 | + hdr = img_back.metadata['header'] |
| 176 | + assert_dt_no_end_equal(hdr.get_data_dtype(), out_dt) |
| 177 | + # But can come from header if specified |
| 178 | + save_image(img_more, out_fname, dtype_from='header') |
| 179 | + img_back = load_image(out_fname) |
| 180 | + hdr = img_back.metadata['header'] |
| 181 | + assert_dt_no_end_equal(hdr.get_data_dtype(), 'c8') |
| 182 | + # u2 only OK for nifti |
| 183 | + save_image(img, 'my_file.nii', 'u2') |
| 184 | + img_back = load_image('my_file.nii') |
| 185 | + hdr = img_back.metadata['header'] |
| 186 | + assert_dt_no_end_equal(hdr.get_data_dtype(), 'u2') |
| 187 | + assert_raises(HeaderDataError, save_image, img, 'my_file.img', 'u2') |
131 | 188 |
|
132 | 189 |
|
133 | 190 | def test_header_roundtrip():
|
|
0 commit comments