def test_cubic_spline_derivative(): # Test derivative of the cubic spline, as defined in [Mattes03] eq. (3) by # comparing the analytical and numerical derivatives # # [Mattes03] Mattes, D., Haynor, D. R., Vesselle, H., Lewellen, T. K., # & Eubank, W. PET-CT image registration in the chest using # free-form deformations. IEEE Transactions on Medical Imaging, # 22(1), 120-8, 2003. in_list = [] expected = [] for epsilon in [-1e-9, 0.0, 1e-9]: for t in [-2.0, -1.0, 0.0, 1.0, 2.0]: x = t + epsilon in_list.append(x) h = 1e-6 in_list = np.array(in_list) input_h = in_list + h s = np.array(cubic_spline(in_list)) s_h = np.array(cubic_spline(input_h)) expected = (s_h - s) / h actual = cubic_spline_derivative(in_list) assert_array_almost_equal(actual, expected)
def test_cubic_spline(): # Cubic spline as defined in [Mattes03] eq. (3) # # [Mattes03] Mattes, D., Haynor, D. R., Vesselle, H., Lewellen, T. K., # & Eubank, W. PET-CT image registration in the chest using # free-form deformations. IEEE Transactions on Medical Imaging, # 22(1), 120-8, 2003. in_list = [] expected = [] for epsilon in [-1e-9, 0.0, 1e-9]: for t in [-2.0, -1.0, 0.0, 1.0, 2.0]: x = t + epsilon in_list.append(x) absx = np.abs(x) sqrx = x * x if absx < 1: expected.append((4.0 - 6 * sqrx + 3.0 * (absx ** 3)) / 6.0) elif absx < 2: expected.append(((2 - absx) ** 3) / 6.0) else: expected.append(0.0) actual = cubic_spline(np.array(in_list, dtype=np.float64)) assert_array_almost_equal(actual, np.array(expected, dtype=np.float64))
def test_cubic_spline(): # Cubic spline as defined in [Mattes03] eq. (3) # # [Mattes03] Mattes, D., Haynor, D. R., Vesselle, H., Lewellen, T. K., # & Eubank, W. PET-CT image registration in the chest using # free-form deformations. IEEE Transactions on Medical Imaging, # 22(1), 120-8, 2003. in_list = [] expected = [] for epsilon in [-1e-9, 0.0, 1e-9]: for t in [-2.0, -1.0, 0.0, 1.0, 2.0]: x = t + epsilon in_list.append(x) absx = np.abs(x) sqrx = x * x if absx < 1: expected.append((4.0 - 6 * sqrx + 3.0 * (absx**3)) / 6.0) elif absx < 2: expected.append(((2 - absx)**3) / 6.0) else: expected.append(0.0) actual = cubic_spline(np.array(in_list, dtype=np.float64)) assert_array_almost_equal(actual, np.array(expected, dtype=np.float64))
def test_mattes_densities(): # Test the computation of the joint intensity distribution # using a dense and a sparse set of values seed = 1246592 nbins = 32 nr = 30 nc = 35 ns = 20 nvals = 50 for dim in [2, 3]: if dim == 2: shape = (nr, nc) static, moving = create_random_image_pair(shape, nvals, seed) else: shape = (ns, nr, nc) static, moving = create_random_image_pair(shape, nvals, seed) # Initialize mbase = MattesBase(nbins) mbase.setup(static, moving) # Get distributions computed by dense sampling mbase.update_pdfs_dense(static, moving) actual_joint_dense = mbase.joint actual_mmarginal_dense = mbase.mmarginal actual_smarginal_dense = mbase.smarginal # Get distributions computed by sparse sampling sval = static.reshape(-1) mval = moving.reshape(-1) mbase.update_pdfs_sparse(sval, mval) actual_joint_sparse = mbase.joint actual_mmarginal_sparse = mbase.mmarginal actual_smarginal_sparse = mbase.smarginal # Compute the expected joint distribution with dense sampling expected_joint_dense = np.zeros(shape=(nbins, nbins)) for index in ndindex(shape): sv = mbase.bin_normalize_static(static[index]) mv = mbase.bin_normalize_moving(moving[index]) sbin = mbase.bin_index(sv) # The spline is centered at mv, will evaluate for all row spline_arg = np.array([i - mv for i in range(nbins)]) contribution = cubic_spline(spline_arg) expected_joint_dense[sbin, :] += contribution # Compute the expected joint distribution with sparse sampling expected_joint_sparse = np.zeros(shape=(nbins, nbins)) for index in range(sval.shape[0]): sv = mbase.bin_normalize_static(sval[index]) mv = mbase.bin_normalize_moving(mval[index]) sbin = mbase.bin_index(sv) # The spline is centered at mv, will evaluate for all row spline_arg = np.array([i - mv for i in range(nbins)]) contribution = cubic_spline(spline_arg) expected_joint_sparse[sbin, :] += contribution # Verify joint distributions expected_joint_dense /= expected_joint_dense.sum() expected_joint_sparse /= expected_joint_sparse.sum() assert_array_almost_equal(actual_joint_dense, expected_joint_dense) assert_array_almost_equal(actual_joint_sparse, expected_joint_sparse) # Verify moving marginals expected_mmarginal_dense = expected_joint_dense.sum(0) expected_mmarginal_dense /= expected_mmarginal_dense.sum() expected_mmarginal_sparse = expected_joint_sparse.sum(0) expected_mmarginal_sparse /= expected_mmarginal_sparse.sum() assert_array_almost_equal(actual_mmarginal_dense, expected_mmarginal_dense) assert_array_almost_equal(actual_mmarginal_sparse, expected_mmarginal_sparse) # Verify static marginals expected_smarginal_dense = expected_joint_dense.sum(1) expected_smarginal_dense /= expected_smarginal_dense.sum() expected_smarginal_sparse = expected_joint_sparse.sum(1) expected_smarginal_sparse /= expected_smarginal_sparse.sum() assert_array_almost_equal(actual_smarginal_dense, expected_smarginal_dense) assert_array_almost_equal(actual_smarginal_sparse, expected_smarginal_sparse)