def test_insignificant_difference_in_direction_cosines(self, axial_slices): """ We have seen DICOM series in the field where slices have lightly different direction cosines. """ axial_slices[0].ImageOrientationPatient[0] += 1e-6 combine_slices(axial_slices)
def test_missing_middle_slice_strict(self, axial_slices): """ By default, all slices must be present. Slice position is determined using the ImagePositionPatient (0020,0032) tag. """ with pytest.raises(DicomImportException): combine_slices([axial_slices[0], axial_slices[2], axial_slices[3]])
def test_slices_from_different_series(self, axial_slices): """ As a sanity check, slices that don't come from the same DICOM series should be rejected. """ axial_slices[2].SeriesInstanceUID += 'Ooops' with pytest.raises(DicomImportException): combine_slices(axial_slices, enforce_slice_spacing=False)
def test_instance_combination_fails_when_missing( self, axial_slices_missing_instance_numbers): """ Test that an exception is raised when slices are attempted to be sorted by instance number, but some instance numbers are missing. """ with pytest.raises(MissingInstanceNumberException): combine_slices(axial_slices_missing_instance_numbers, sort_by_instance=True)
def test_combine_with_instance_number(self, axial_slices): """ Test that a collection of slices can be identically assembled using the slice position or instance number, assuming the instance numbers are ordered sequentially along the slice axis. """ instance_sorted_voxels, _ = combine_slices(axial_slices, sort_by_instance=True) position_sorted_voxels, _ = combine_slices(axial_slices) assert np.array_equal(instance_sorted_voxels, position_sorted_voxels)
def test_missing_end_slice(self, axial_slices): """ Ideally, we would detect missing edge slices, however given that we don't know any way to determine the number of slices are in a DICOM series, this seems impossible. """ with pytest.raises(DicomImportException): combine_slices( [axial_slices[0], axial_slices[1], axial_slices[2]], enforce_slice_spacing=False, )
def test_single_slice_spacing(self, axial_slices): slice_spacing = 0.65 dataset = axial_slices[0] dataset.SpacingBetweenSlices = slice_spacing array, affine = combine_slices([dataset]) assert np.array_equal(array, dataset.pixel_array.T[:, :, None]) assert np.isclose(np.linalg.norm(affine[:, 2]), np.abs(slice_spacing))
def test_simple_axial_set_w_dicomdir(self, axial_slices): dicomdir_dataset = axial_slices[2] dicomdir_dataset.MediaStorageSOPClassUID = '1.2.840.10008.1.3.10' datasets = [dicomdir_dataset, axial_slices[0], axial_slices[1]] combined, _ = combine_slices(datasets) manually_combined = np.dstack( (axial_slices[0].pixel_array.T, axial_slices[1].pixel_array.T)) assert np.array_equal(combined, manually_combined)
def test_missing_middle_slice_lax(self, axial_slices): """ if `enforce_slice_spacing` is set to False, the no missing slices constraint is relaxed. In this case, slices are stacked together as if there were no missing slices. """ voxels, _transform = combine_slices( [axial_slices[0], axial_slices[2], axial_slices[3]], enforce_slice_spacing=False, ) assert voxels.shape[2] == 3
def test_instance_sorting_with_mixed_positions( self, axial_slices_mixed_instances): """ Test that a volume sorts slices by instance number and not by image position patient when instance sorting is selected. In practice, series like this tend to be multiple scans with different parameters within a single series, such as in the case of diffusion MRI. """ instance_sorted_voxels, _ = combine_slices( axial_slices_mixed_instances, sort_by_instance=True) position_sorted_voxels, _ = combine_slices( axial_slices_mixed_instances) assert np.array_equal(instance_sorted_voxels[:, :, 0], position_sorted_voxels[:, :, 0]) assert np.array_equal(instance_sorted_voxels[:, :, 1], position_sorted_voxels[:, :, 3]) assert np.array_equal(instance_sorted_voxels[:, :, 2], position_sorted_voxels[:, :, 2]) assert np.array_equal(instance_sorted_voxels[:, :, 3], position_sorted_voxels[:, :, 1])
def test_simple_axial_set(self, axial_slices): combined, _ = combine_slices(axial_slices[0:2]) manually_combined = np.dstack((axial_slices[0].pixel_array.T, axial_slices[1].pixel_array.T)) assert np.array_equal(combined, manually_combined)
def test_rgb_axial_set(self, axial_rgb_slices): combined, _ = combine_slices(axial_rgb_slices) manually_combined = np.stack( [ds.pixel_array for ds in axial_rgb_slices], axis=0).T assert np.array_equal(combined, manually_combined)
def test_single_slice(self, axial_slices): dataset = axial_slices[-1] array, _ = combine_slices([dataset]) assert np.array_equal(array, dataset.pixel_array.T[:, :, None])
def test_significant_difference_in_direction_cosines(self, axial_slices): axial_slices[0].ImageOrientationPatient[0] += 1e-4 with pytest.raises(DicomImportException): combine_slices(axial_slices, enforce_slice_spacing=False)