Пример #1
0
def test_generate_from_matrix_from_algebra_element_3d_3d_matrix():
    r = np.random.randn(3, 3)
    m = np.eye(4)
    m[:3, :3] = r
    m[:3, 3] = np.array([3, 4, 5])

    vf = gen.generate_from_matrix((10, 10, 5), m, t=1, structure='algebra')
    vf_expected = np.zeros((10, 10, 5, 1, 3))

    for x in range(10):
        for y in range(10):
            for z in range(5):
                vf_expected[x, y, z, 0, :] = list(m.dot(np.array([x, y, z,
                                                                  1])))[:3]

    assert_array_equal(vf, vf_expected)
Пример #2
0
def test_generate_from_matrix_from_algebra_element_2d():
    theta, tx, ty = np.pi / 8, 5, 5
    a1 = [0, -theta, tx]
    a2 = [theta, 0, ty]
    a3 = [0, 0, 0]
    m = np.array([a1, a2, a3])

    vf = gen.generate_from_matrix((10, 10), m, t=1, structure='algebra')

    vf_expected = np.zeros((10, 10, 1, 1, 2))

    for x in range(10):
        for y in range(10):
            vf_expected[x, y, 0, 0, :] = m.dot(np.array([x, y, 1]))[:2]

    assert_array_equal(vf, vf_expected)
Пример #3
0
def test_generate_from_matrix_from_group_element_2d():
    theta, tx, ty = np.pi / 10, 5, 5
    a1 = [np.cos(theta), -np.sin(theta), tx]
    a2 = [np.sin(theta), np.cos(theta), ty]
    a3 = [0, 0, 1]
    m = np.array([a1, a2, a3])

    vf = gen.generate_from_matrix((10, 10), m, t=1, structure='group')

    vf_expected = np.zeros((10, 10, 1, 1, 2))

    # move to lagrangian coordinates to compute the ground truth:
    m = m - np.eye(3)

    for x in range(10):
        for y in range(10):
            vf_expected[x, y, 0, 0, :] = m.dot(np.array([x, y, 1]))[:2]

    assert_array_equal(vf, vf_expected)
Пример #4
0
def test_generate_from_matrix_from_group_element_3d_3d_matrix():
    r = np.random.randn(3, 3)
    m = np.eye(4)
    m[:3, :3] = r
    m[:3, 3] = np.array([3, 4, 5])

    vf = gen.generate_from_matrix((10, 10, 5), m, t=1, structure='group')
    vf_expected = np.zeros((10, 10, 5, 1, 3))

    # move to lagrangian coordinates to compute the ground truth:
    m = m - np.eye(4)

    for x in range(10):
        for y in range(10):
            for z in range(5):
                vf_expected[x, y, z, 0, :] = list(m.dot(np.array([x, y, z,
                                                                  1])))[:3]

    assert_array_equal(vf, vf_expected)
Пример #5
0
            x_c, y_c = [c / 2 for c in omega]

            theta = np.pi / 8

            tx = (1 - np.cos(theta)) * x_c + np.sin(theta) * y_c
            ty = -np.sin(theta) * x_c + (1 - np.cos(theta)) * y_c

            m_0 = se2.Se2G(theta, tx, ty)
            dm_0 = se2.se2g_log(m_0)

            print(m_0.get_matrix)
            print('')
            print(dm_0.get_matrix)

            # Generate subsequent vector fields
            flow = gen.generate_from_matrix(list(omega)[::-1], m_0.get_matrix, structure='group')
            svf_0 = gen.generate_from_matrix(list(omega)[::-1], dm_0.get_matrix, structure='algebra')

        elif params['deformation_model'] == 'linear':

            taste = 1
            beta = 0.5

            x_c, y_c = [c / 2 for c in omega]

            dm = beta * linear.randomgen_linear_by_taste(1, taste, (x_c, y_c))
            svf_0 = gen.generate_from_matrix(omega[::-1], dm, structure='algebra')
            flow = l_exp.gss_aei(svf_0)

        elif params['deformation_model'] == 'homography':
Пример #6
0
    from calie.transformations import linear
    from calie.fields import generate as gen
    from calie.operations import lie_exp

    # --- Linear example

    beta = 0.1
    omega = (10, 12, 13)

    # generate matrix
    dm1 = beta * linear.randomgen_linear_by_taste(1, 1,
                                                  [int(c / 2) for c in omega])
    m1 = scipy.linalg.expm(dm1)

    # generate SVF
    svf1 = gen.generate_from_matrix(omega, dm1, t=1, structure='algebra')
    flow1_ground = gen.generate_from_matrix(omega, m1, t=1, structure='group')

    quiver_3d(svf1, flow1_ground)

    plt.show(block=False)

    # --- Gaussian example

    # generate SVF
    svf1 = gen.generate_random(omega, 1, (1, 1))

    l_exp = lie_exp.LieExp()
    l_exp.s_i_o = 3
    flow1_ground = l_exp.gss_aei(svf1)
    theta = np.pi / 8

    tx = (1 - np.cos(theta)) * x_c + np.sin(theta) * y_c
    ty = -np.sin(theta) * x_c + (1 - np.cos(theta)) * y_c

    passepartout = 2

    m_0 = se2.Se2G(theta, tx, ty)
    dm_0 = se2.se2g_log(m_0)

    print(dm_0.get_matrix)
    print(m_0.get_matrix)

    # -> generate subsequent vector fields
    svf_0 = gen.generate_from_matrix(omega,
                                     dm_0.get_matrix,
                                     structure='algebra')
    sdisp_0 = gen.generate_from_matrix(omega,
                                       m_0.get_matrix,
                                       structure='group')

    # -> compute exponential with different available methods:

    spline_interpolation_order = 3

    l_exp = lie_exp.LieExp()
    l_exp.s_i_o = spline_interpolation_order

    sdisp_ss = l_exp.scaling_and_squaring(svf_0)
    sdisp_ss_pa = l_exp.gss_aei(svf_0)
    sdisp_euler = l_exp.euler(svf_0)
Пример #8
0
if __name__ == '__main__':

    pyplot.close('all')
    l_exp = lie_exp.LieExp()

    # ----------------------------
    # ---- First example ---------
    # ----------------------------

    taste = 3
    alpha = 1
    beta = 0.1

    dm = beta * linear.randomgen_linear_by_taste(1, taste, (20, 20))
    svf = alpha * gen.generate_from_matrix((40, 40), dm, structure='algebra')

    # get integral of the SVF with generalised scaling and squaring.
    sdisp = l_exp.gss_aei(svf)
    see_field(svf, subtract_id=False, input_color='r', fig_tag=1)
    see_field(sdisp,
              subtract_id=False,
              input_color='b',
              title_input='Unstable node exp',
              fig_tag=1)

    pyplot.show(block=False)

    # get integral of the SVF with the matrix exponential
    m = scipy.linalg.expm(dm)
    sdisp_expm = alpha * gen.generate_from_matrix(
Пример #9
0
    passepartout = 4
    sio = 3  # spline interpolation order

    # -> model <- #

    m_0 = se2.Se2G(theta, tx, ty)
    dm_0 = se2.se2g_log(m_0)

    print(m_0.get_matrix)
    print('')
    print(dm_0.get_matrix)

    # Generate subsequent vector fields

    sdisp_0 = gen.generate_from_matrix(domain, m_0.get_matrix, structure='group')
    svf_0 = gen.generate_from_matrix(domain, dm_0.get_matrix, structure='algebra')

    # Compute exponential with different available methods:

    l_exp = lie_exp.LieExp()
    l_exp.s_i_o = sio

    methods = [l_exp.euler,
               l_exp.midpoint,
               l_exp.scaling_and_squaring,
               l_exp.gss_ei,
               l_exp.gss_aei,
               l_exp.trapeziod_euler,
               l_exp.gss_trapezoid_euler,
               l_exp.trapezoid_midpoint,
Пример #10
0
def test_visual_assessment_method_one_se2(show=False):
    """
    :param show: to add the visualisation of a figure.

    This test is for visual assessment. Please put show to True.

    Aimed to test the prototyping of the computation of the exponential map
    with some methods.

    (Nothing is saved in external folder.)
    """

    ##############
    # controller #
    ##############

    domain = (20, 20)

    x_c = 10
    y_c = 10
    theta = np.pi / 8

    tx = (1 - np.cos(theta)) * x_c + np.sin(theta) * y_c
    ty = -np.sin(theta) * x_c + (1 - np.cos(theta)) * y_c

    passepartout = 5
    spline_interpolation_order = 3

    l_exp = lie_exp.LieExp()
    l_exp.s_i_o = spline_interpolation_order

    methods_list = [
        l_exp.scaling_and_squaring, l_exp.gss_ei, l_exp.gss_ei_mod,
        l_exp.gss_aei, l_exp.midpoint, l_exp.series, l_exp.euler,
        l_exp.euler_aei, l_exp.euler_mod, l_exp.heun, l_exp.heun_mod,
        l_exp.rk4, l_exp.gss_rk4, l_exp.trapeziod_euler,
        l_exp.trapezoid_midpoint, l_exp.gss_trapezoid_euler,
        l_exp.gss_trapezoid_midpoint
    ]

    # -----
    # model
    # -----

    m_0 = se2.Se2G(theta, tx, ty)
    dm_0 = se2.se2g_log(m_0)

    # -- generate subsequent vector fields

    svf_0 = gen.generate_from_matrix(domain,
                                     dm_0.get_matrix,
                                     structure='algebra')
    sdisp_0 = gen.generate_from_matrix(domain,
                                       m_0.get_matrix,
                                       structure='group')

    # -- compute exponential with different available methods:

    sdisp_list = []
    res_time = np.zeros(len(methods_list))

    for num_met, met in enumerate(methods_list):
        start = time.time()
        sdisp_list.append(met(svf_0, input_num_steps=10))
        res_time[num_met] = (time.time() - start)

    # ----
    # view
    # ----

    print('--------------------')
    print('Norm of the svf: ')
    print(qr.norm(svf_0, passe_partout_size=4))

    print('--------------------')
    print("Norm of the displacement field:")
    print(qr.norm(sdisp_0, passe_partout_size=4))

    print('--------------------')
    print('Norm of the errors: ')
    print('--------------------')

    for num_met in range(len(methods_list)):
        err = qr.norm(sdisp_list[num_met] - sdisp_0,
                      passe_partout_size=passepartout)
        print('|{0:>22} - disp|  = {1}'.format(methods_list[num_met].__name__,
                                               err))

        if methods_list[num_met].__name__ == 'euler':
            assert err < 3
        else:
            assert err < 0.5

    print('---------------------')
    print('Computational Times: ')
    print('---------------------')

    if show:
        title_input_l = ['Sfv Input', 'Ground Output'] + methods_list
        fields_list = [svf_0, sdisp_0] + sdisp_list

        list_fields_of_field = [[svf_0], [sdisp_0]]
        list_colors = ['r', 'b']
        for third_field in fields_list[2:]:
            list_fields_of_field += [[svf_0, sdisp_0, third_field]]
            list_colors += ['r', 'b', 'm']

        fields_comparisons.see_n_fields_special(
            list_fields_of_field,
            fig_tag=50,
            row_fig=5,
            col_fig=5,
            input_figsize=(14, 7),
            colors_input=list_colors,
            titles_input=title_input_l,
            sample=(1, 1),
            zoom_input=[0, 20, 0, 20],
            window_title_input='matrix generated svf')

        plt.show()
Пример #11
0
def test_generate_from_matrix_incompatible_matrix_omega_3d():
    with assert_raises(IOError):
        gen.generate_from_matrix((10, 10, 12), np.eye(5), t=1)
Пример #12
0
def test_generate_from_matrix_wrong_structure():
    with assert_raises(IOError):
        gen.generate_from_matrix((10, 11), np.eye(4), t=1, structure='spam')
Пример #13
0
def test_generate_from_matrix_wrong_timepoints():
    with assert_raises(IndexError):
        gen.generate_from_matrix((10, 11), np.eye(4), t=2)
Пример #14
0
        d = 2
        omega = (x_1, y_1)
        shape = list(omega) + [1, 1, 2]

        # center of the homography
        x_c = x_1 / 2
        y_c = y_1 / 2
        z_c = 1

        centre_hom = [x_c, y_c]

        # generate matrices homography
        scale_factor = 15. / (np.max(omega) * 10)
        hom_attributes = [d, scale_factor, 1.3, special]

        hom_a, hom_g = get_random_hom_matrices(d=hom_attributes[0],
                                               scale_factor=hom_attributes[1],
                                               sigma=hom_attributes[2],
                                               special=hom_attributes[3],
                                               projective_center=None)

        # Generate SVF and flow
        svf1 = gen.generate_from_matrix(omega, hom_a, t=1, structure='algebra')
        flow1 = gen.generate_from_matrix(omega, hom_g, t=1, structure='group')

        plt.close()
        see_field(svf1, fig_tag=1, input_color='r')
        see_field(flow1, fig_tag=1, input_color='b')
        plt.show()