def test_align_2d_similarity(): linear_component = np.array([[2, -6], [6, 2]]) translation_component = np.array([7, -8]) h_matrix = np.eye(3, 3) h_matrix[:-1, :-1] = linear_component h_matrix[:-1, -1] = translation_component similarity = SimilarityTransform(h_matrix) source = PointCloud(np.array([[0, 1], [1, 1], [-1, -5], [3, -5]])) target = similarity.apply(source) # estimate the transform from source and target estimate = SimilarityTransform.align(source, target) # check the estimates is correct assert_allclose(similarity.h_matrix, estimate.h_matrix)
def noisy_align(source, target, noise_std=0.05, rotation=False): r""" Constructs and perturbs the optimal similarity transform between source to the target by adding white noise to its parameters. Parameters ---------- source: :class:`menpo.shape.PointCloud` The source pointcloud instance used in the alignment target: :class:`menpo.shape.PointCloud` The target pointcloud instance used in the alignment noise_std: float The standard deviation of the white noise Default: 0.05 rotation: boolean If False the second parameter of the SimilarityTransform, which captures captures inplane rotations, is set to 0. Default:False Returns ------- noisy_transform : :class: `menpo.transform.SimilarityTransform` The noisy Similarity Transform """ transform = SimilarityTransform.align(source, target) parameters = transform.as_vector() if not rotation: parameters[1] = 0 parameter_range = np.hstack((parameters[:2], target.range())) noise = (parameter_range * noise_std * np.random.randn(transform.n_parameters)) parameters += noise return SimilarityTransform.identity(source.n_dims).from_vector_inplace( parameters)