def degrade(reference, rotation, translation, scale, drop, duplications, noise): from numpy import delete from coherent_point_drift.geometry import rotationMatrix, rigidXform from itertools import chain, repeat points = delete(reference, drop, axis=0) rotation_matrix = rotationMatrix(*rotation) indices = chain.from_iterable(repeat(i, n) for i, n in enumerate(duplications)) return rigidXform(points, rotation_matrix, translation, scale)[list(indices)] + noise
def test_cpd_prior(): from coherent_point_drift.align import driftRigid rng = np.random.RandomState(4) ndim = 3 R = rotationMatrix(*next(randomRotations(ndim, rng))) t = rng.normal(size=ndim) s = rng.normal(size=1)[0] X = rng.normal(size=(10, ndim)) Y = RigidXform(R, t, s) @ X _, cpd = last(islice(driftRigid(X, Y, w=np.eye(len(X))), 200)) ls = align(X, Y) np.testing.assert_almost_equal(cpd.R, ls.R) np.testing.assert_almost_equal(cpd.t, ls.t) np.testing.assert_almost_equal(cpd.s, ls.s)
def test_least_squares(): rng = np.random.RandomState(4) ndim = 3 R = rotationMatrix(*next(randomRotations(ndim, rng))) t = rng.normal(size=ndim) s = rng.lognormal(size=1)[0] xform = RigidXform(R, t, s) X = rng.normal(size=(10, ndim)) Y = xform @ X alignment = align(X, Y) expected = xform.inverse np.testing.assert_almost_equal(alignment.R, expected.R) np.testing.assert_almost_equal(alignment.t, expected.t) np.testing.assert_almost_equal(alignment.s, expected.s) np.testing.assert_almost_equal(alignment @ Y, X)