def test_smooth_image(caplog): # Test image smoothing data = np.arange(24).reshape((2, 3, 4)) aff = np.diag([-4, 5, 6, 1]) img = Nifti1Image(data, aff) # Zero smoothing is no-op out_img = smooth_image(img, 0) assert_array_equal(out_img.affine, img.affine) assert_array_equal(out_img.shape, img.shape) assert_array_equal(out_img.dataobj, data) # Isotropic smoothing sd = fwhm2sigma(np.true_divide(8, [4, 5, 6])) exp_out = spnd.gaussian_filter(data, sd, mode='nearest') assert_array_equal(smooth_image(img, 8).dataobj, exp_out) assert_array_equal(smooth_image(img, [8, 8, 8]).dataobj, exp_out) with pytest.raises(ValueError): smooth_image(img, [8, 8]) # Not isotropic mixed_sd = fwhm2sigma(np.true_divide([8, 7, 6], [4, 5, 6])) exp_out = spnd.gaussian_filter(data, mixed_sd, mode='nearest') assert_array_equal(smooth_image(img, [8, 7, 6]).dataobj, exp_out) # In 2D img_2d = Nifti1Image(data[0], aff) exp_out = spnd.gaussian_filter(data[0], sd[:2], mode='nearest') assert_array_equal(smooth_image(img_2d, 8).dataobj, exp_out) assert_array_equal(smooth_image(img_2d, [8, 8]).dataobj, exp_out) with pytest.raises(ValueError): smooth_image(img_2d, [8, 8, 8]) # Isotropic in 4D has zero for last dimension in scalar case data_4d = np.arange(24 * 5).reshape((2, 3, 4, 5)) img_4d = Nifti1Image(data_4d, aff) exp_out = spnd.gaussian_filter(data_4d, list(sd) + [0], mode='nearest') assert_array_equal(smooth_image(img_4d, 8).dataobj, exp_out) # But raises error for vector case with pytest.raises(ValueError): smooth_image(img_4d, [8, 8, 8]) # mode, cval exp_out = spnd.gaussian_filter(data, sd, mode='constant') assert_array_equal(smooth_image(img, 8, mode='constant').dataobj, exp_out) exp_out = spnd.gaussian_filter(data, sd, mode='constant', cval=99) assert_array_equal( smooth_image(img, 8, mode='constant', cval=99).dataobj, exp_out) # out_class img_ni1 = Nifti1Image(data, np.eye(4)) img_ni2 = Nifti2Image(data, np.eye(4)) # Default is Nifti1Image with caplog.at_level( logging.CRITICAL ): # Here and below, suppress logs when changing classes assert smooth_image(img_ni2, 0).__class__ == Nifti1Image # Can be overridden with caplog.at_level(logging.CRITICAL): assert smooth_image(img_ni1, 0, out_class=Nifti2Image).__class__ == Nifti2Image # None specifies out_class from input assert smooth_image(img_ni2, 0, out_class=None).__class__ == Nifti2Image
def test_sigma2fwhm(): # Test from constant assert_almost_equal(sigma2fwhm(1), 2.3548200) assert_almost_equal(sigma2fwhm([1, 2, 3]), np.arange(1, 4) * 2.3548200) assert_almost_equal(fwhm2sigma(2.3548200), 1) assert_almost_equal(fwhm2sigma(np.arange(1, 4) * 2.3548200), [1, 2, 3]) # direct test fwhm2sigma and sigma2fwhm are inverses of each other fwhm = np.arange(1.0, 5.0, 0.1) sigma = np.arange(1.0, 5.0, 0.1) assert np.allclose(sigma2fwhm(fwhm2sigma(fwhm)), fwhm) assert np.allclose(fwhm2sigma(sigma2fwhm(sigma)), sigma)
def test_sigma2fwhm(): # Test from constant assert_almost_equal(sigma2fwhm(1), 2.3548200) assert_almost_equal(sigma2fwhm([1, 2, 3]), np.arange(1, 4) * 2.3548200) assert_almost_equal(fwhm2sigma(2.3548200), 1) assert_almost_equal(fwhm2sigma(np.arange(1, 4) * 2.3548200), [1, 2, 3]) # direct test fwhm2sigma and sigma2fwhm are inverses of each other fwhm = np.arange(1.0, 5.0, 0.1) sigma = np.arange(1.0, 5.0, 0.1) assert_true(np.allclose(sigma2fwhm(fwhm2sigma(fwhm)), fwhm)) assert_true(np.allclose(fwhm2sigma(sigma2fwhm(sigma)), sigma))
def test_smooth_image(): # Test image smoothing data = np.arange(24).reshape((2, 3, 4)) aff = np.diag([-4, 5, 6, 1]) img = Nifti1Image(data, aff) # Zero smoothing is no-op out_img = smooth_image(img, 0) assert_array_equal(out_img.affine, img.affine) assert_array_equal(out_img.shape, img.shape) assert_array_equal(out_img.dataobj, data) # Isotropic smoothing sd = fwhm2sigma(np.true_divide(8, [4, 5, 6])) exp_out = spnd.gaussian_filter(data, sd, mode='nearest') assert_array_equal(smooth_image(img, 8).dataobj, exp_out) assert_array_equal(smooth_image(img, [8, 8, 8]).dataobj, exp_out) assert_raises(ValueError, smooth_image, img, [8, 8]) # Not isotropic mixed_sd = fwhm2sigma(np.true_divide([8, 7, 6], [4, 5, 6])) exp_out = spnd.gaussian_filter(data, mixed_sd, mode='nearest') assert_array_equal(smooth_image(img, [8, 7, 6]).dataobj, exp_out) # In 2D img_2d = Nifti1Image(data[0], aff) exp_out = spnd.gaussian_filter(data[0], sd[:2], mode='nearest') assert_array_equal(smooth_image(img_2d, 8).dataobj, exp_out) assert_array_equal(smooth_image(img_2d, [8, 8]).dataobj, exp_out) assert_raises(ValueError, smooth_image, img_2d, [8, 8, 8]) # Isotropic in 4D has zero for last dimension in scalar case data_4d = np.arange(24 * 5).reshape((2, 3, 4, 5)) img_4d = Nifti1Image(data_4d, aff) exp_out = spnd.gaussian_filter(data_4d, list(sd) + [0], mode='nearest') assert_array_equal(smooth_image(img_4d, 8).dataobj, exp_out) # But raises error for vector case assert_raises(ValueError, smooth_image, img_4d, [8, 8, 8]) # mode, cval exp_out = spnd.gaussian_filter(data, sd, mode='constant') assert_array_equal(smooth_image(img, 8, mode='constant').dataobj, exp_out) exp_out = spnd.gaussian_filter(data, sd, mode='constant', cval=99) assert_array_equal(smooth_image(img, 8, mode='constant', cval=99).dataobj, exp_out) # out_class img_ni1 = Nifti2Image(data, np.eye(4)) img_ni2 = Nifti2Image(data, np.eye(4)) # Default is Nifti1Image assert_equal( smooth_image(img_ni2, 0).__class__, Nifti1Image) # Can be overriden assert_equal( smooth_image(img_ni1, 0, out_class=Nifti2Image).__class__, Nifti2Image) # None specifies out_class from input assert_equal( smooth_image(img_ni2, 0, out_class=None).__class__, Nifti2Image)