예제 #1
0
    def testMakeD(self):
        """
        Tests makeD()
        """

        af = Affine()
        np_test.assert_almost_equal(af.makeD(d=None), 0)
        np_test.assert_almost_equal(af.makeD(d=None, ndim=4), [0, 0, 0, 0])
        np_test.assert_almost_equal(af.makeD(d=3, ndim=2), [3, 3])
예제 #2
0
    def testInverse(self):
        """
        Tests inverse method
        """

        #################################################
        #
        # parallelogram, scale, rotation, parity, exact
        #

        #
        af = Affine.find(x=self.x1, y=self.y1m)

        # test inverse
        af_inverse = af.inverse()
        np_test.assert_almost_equal(numpy.dot(af.gl, af_inverse.gl),
                                    numpy.identity(2))
        afi = Affine.find(x=self.y1m, y=self.x1)
        np_test.assert_almost_equal(af_inverse.gl, afi.gl)
        np_test.assert_almost_equal(af_inverse.d, afi.d)
        np_test.assert_almost_equal(self.x1, af_inverse.transform(self.y1m))

        # error
        np_test.assert_almost_equal(af_inverse.error, afi.error)
        np_test.assert_almost_equal(af_inverse.rmsError, afi.rmsError)

        #################################################
        #
        # parallelogram, scale, rotation, parity, not exact
        #
        # Note: only approximate comparisons because inverse of an optimal
        # (least squares) x->y transformation is not the optimal y->x.

        af = Affine.find(x=self.x2, y=self.y2m)

        # test inverse
        af_inverse = af.inverse()
        np_test.assert_almost_equal(numpy.dot(af.gl, af_inverse.gl),
                                    numpy.identity(2))
        afi = Affine.find(x=self.y2m, y=self.x2)
        np_test.assert_almost_equal(af_inverse.gl, afi.gl, decimal=1)
        np_test.assert_almost_equal(af_inverse.d, afi.d, decimal=1)
        np_test.assert_almost_equal(self.x2,
                                    af_inverse.transform(self.y2m),
                                    decimal=0)

        # error
        np_test.assert_almost_equal(af_inverse.error, afi.error, decimal=1)
        np_test.assert_almost_equal(af_inverse.rmsError,
                                    afi.rmsError,
                                    decimal=1)
예제 #3
0
    def testScale(self):
        """
        Tests getScale and setScale
        """

        af1m_desired = Affine.find(x=self.x1, y=self.y1m)
        af1m_changed = Affine.find(x=self.x1, y=self.y1m)
        af1m_changed.scale = [1, 2]
        np_test.assert_almost_equal(af1m_changed.s, [[1, 0], [0, 2]])
        np_test.assert_almost_equal(af1m_changed.scale, [1, 2])
        np_test.assert_almost_equal(af1m_changed.q, af1m_desired.q)
        np_test.assert_almost_equal(af1m_changed.p, af1m_desired.p)
        np_test.assert_almost_equal(af1m_changed.m, af1m_desired.m)
        np_test.assert_almost_equal(af1m_changed.d, af1m_desired.d)
예제 #4
0
    def testFind(self):
        """
        Tests find() method
        """

        af = Affine.find(x=self.x1, y=self.y1m)
        desired = numpy.inner(self.x1, af.gl) + af.d
        np_test.assert_almost_equal(self.y1m, desired)
예제 #5
0
    def testRemoveMasked(self):
        """
        Tests removeMasked()
        """

        x = numpy.array([[1, 2], [3, 4], [5, 6]])
        x_mask = numpy.array([1, 0, 0])
        y = numpy.array([[2, 4], [6, 8], [10, 12]])
        y_mask = numpy.array([0, 0, 1])

        data, total_mask = Affine.removeMasked(arrays=[x, y],
                                               masks=(x_mask, y_mask))
        np_test.assert_equal(data[0], numpy.array([[3, 4]]))
        np_test.assert_equal(data[1], numpy.array([[6, 8]]))
        np_test.assert_equal(total_mask, numpy.array([1, 0, 1]))

        data, total_mask = Affine.removeMasked(arrays=[x, y])
        np_test.assert_equal(data[0], x)
        np_test.assert_equal(data[1], y)
        np_test.assert_equal(total_mask, numpy.array([0, 0, 0]))
예제 #6
0
    def testIdentity(self):
        """
        Tests identity()
        """

        ndim = 3
        ident = Affine.identity(ndim=ndim)
        ident.decompose(order='qpsm')
        np_test.assert_almost_equal(ident.scale, numpy.ones(ndim))
        np_test.assert_almost_equal(ident.parity, 1)
        np_test.assert_almost_equal(ident.translation, numpy.zeros(shape=ndim))
        np_test.assert_almost_equal(ident.gl, numpy.identity(ndim))
예제 #7
0
    def testFindTranslation(self):
        """
        Tests findTranslation()
        """

        af = Affine.findTranslation(x=numpy.array([[1, 2, 3], [2, 3, 4]]),
                                    y=numpy.array([[2, 4, 6], [3, 6, 9]]))

        np_test.assert_almost_equal(af.translation, [1., 2.5, 4.])
        af.decompose(order='qpsm')
        np_test.assert_almost_equal(af.scale, numpy.ones(3))
        np_test.assert_almost_equal(af.parity, 1)
        np_test.assert_almost_equal(af.gl, numpy.identity(3))
예제 #8
0
    def testFindTwoStep(self):
        """
        Tests findTwoStep()
        """

        # parallelogram, rotation, scale, exact
        af = Affine.findTwoStep(x=self.x1[0:1],
                                y=self.y1[0:1],
                                x_gl=self.x1,
                                y_gl=self.y1 + 3)
        af_desired = Affine.find(x=self.x1, y=self.y1)
        np_test.assert_almost_equal(af.gl, af_desired.gl)
        np_test.assert_almost_equal(af.d, af_desired.d)
        np_test.assert_almost_equal(af.glError, numpy.zeros_like(self.x1))
        np_test.assert_almost_equal(af.dError, numpy.zeros_like(self.x1[0:1]))
        np_test.assert_almost_equal(af.rmsErrorEst, 0)

        # parallelogram, rotation, scale, parity, exact
        af = Affine.findTwoStep(x=self.x1[0:2],
                                y=self.y1m[0:2],
                                x_gl=self.x1,
                                y_gl=self.y1m + [2, -3])
        af_desired = Affine.find(x=self.x1, y=self.y1m)
        np_test.assert_almost_equal(af.gl, af_desired.gl)
        np_test.assert_almost_equal(af.d, af_desired.d)
        np_test.assert_almost_equal(af.glError, numpy.zeros_like(self.x1))
        np_test.assert_almost_equal(af.dError, numpy.zeros_like(self.x1[0:2]))
        np_test.assert_almost_equal(af.rmsErrorEst, 0)

        # parallelogram, rotation, scale, parity, not exact
        af = Affine.findTwoStep(x=self.x2,
                                y=self.y2m,
                                x_gl=self.x2,
                                y_gl=self.y2m + [2, -3])
        af_desired = Affine.find(x=self.x2, y=self.y2m)
        np_test.assert_almost_equal(af.gl, af_desired.gl)
        np_test.assert_almost_equal(af.d, af_desired.d)
        np_test.assert_almost_equal(af.rmsErrorEst,
                                    af_desired.rmsError,
                                    decimal=0)
예제 #9
0
    def testTransformArray(self):
        """
        Tests transformArray() for 1D and 2D. Tests for 3D are in
        test_rigid_3d.
        """

        # 1D
        ar1 = numpy.arange(5, dtype=float)
        af = Affine(gl=[[1.]], d=[1.])
        trans = af.transformArray(array=ar1, center=[0], cval=50)
        np_test.assert_almost_equal(trans, [50, 0, 1, 2, 3])

        # 1D fractional
        ar1 = numpy.arange(5, dtype=float)
        af = Affine(gl=[[1.]], d=[0.5])
        trans = af.transformArray(array=ar1, center=[0], cval=50)
        np_test.assert_almost_equal(trans, [50, 0.5, 1.5, 2.5, 3.5])

        # 2D array
        ar2 = numpy.arange(20, dtype=float).reshape(4, 5)

        # translation
        af = Affine2D(phi=0, scale=1, d=[0, 1])
        trans = af.transformArray(array=ar2, center=[0, 0], cval=50)
        desired = numpy.array([[50, 0, 1, 2, 3], [50, 5, 6, 7, 8],
                               [50, 10, 11, 12, 13], [50, 15, 16, 17, 18]])
        np_test.assert_almost_equal(trans, desired)

        # translation
        af = Affine2D(phi=0, scale=1, d=[0, -1])
        trans = af.transformArray(array=ar2, center=[0, 0], cval=50)
        desired = numpy.array([[1, 2, 3, 4, 50], [6, 7, 8, 9, 50],
                               [11, 12, 13, 14, 50], [16, 17, 18, 19, 50]])
        np_test.assert_almost_equal(trans, desired)

        # translation
        af = Affine2D(phi=0, scale=1, d=[1, -2])
        trans = af.transformArray(array=ar2, center=[0, 0], cval=50)
        desired = numpy.array([[50, 50, 50, 50, 50], [2, 3, 4, 50, 50],
                               [7, 8, 9, 50, 50], [12, 13, 14, 50, 50]])
        np_test.assert_almost_equal(trans, desired)

        # translation float
        af = Affine2D(phi=0, scale=1, d=[0, 0.5])
        trans = af.transformArray(array=ar2, center=[0, 0], cval=50)
        desired = numpy.array([[50, 0.5, 1.5, 2.5, 3.5],
                               [50, 5.5, 6.5, 7.5, 8.5],
                               [50, 10.5, 11.5, 12.5, 13.5],
                               [50, 15.5, 16.5, 17.5, 18.5]])
        np_test.assert_almost_equal(trans, desired)

        # translation float
        af = Affine2D(phi=0, scale=1, d=[-0.5, 0.5])
        trans = af.transformArray(array=ar2, center=[0, 0], cval=50)
        desired = numpy.array([[50, 3, 4, 5, 6], [50, 8, 9, 10, 11],
                               [50, 13, 14, 15, 16], [50, 50, 50, 50, 50]])
        np_test.assert_almost_equal(trans, desired)

        # 2D rotations different center
        af = Affine2D(phi=numpy.pi / 2, scale=1)
        trans = af.transformArray(array=ar2, center=[0, 0], cval=50)
        np_test.assert_almost_equal(trans[0, :], [0, 5, 10, 15, 50])
        np_test.assert_almost_equal(trans[1:4, :], numpy.zeros((3, 5)) + 50)
        trans = af.transformArray(array=ar2, center=[2, 1], cval=50)
        desired = numpy.array([[8, 13, 18, 50, 50], [7, 12, 17, 50, 50],
                               [6, 11, 16, 50, 50], [5, 10, 15, 50, 50]])
        np_test.assert_almost_equal(trans, desired)

        # 2D rotation + translation
        af = Affine2D(phi=numpy.pi / 2, scale=1, d=[0, 1])
        trans = af.transformArray(array=ar2, center=[2, 1], cval=50)
        desired = numpy.array([[3, 8, 13, 18, 50], [2, 7, 12, 17, 50],
                               [1, 6, 11, 16, 50], [0, 5, 10, 15, 50]])
        # Note: because out or boundary (slightly) the following are cval
        #desired[0,0] = desired[3,0] = desired[3,1] = 50
        np_test.assert_almost_equal(trans[1:3, 1:4], desired[1:3, 1:4])
        af = Affine2D(phi=numpy.pi / 2, scale=1, d=[-1, 1])
        trans = af.transformArray(array=ar2, center=[2, 1], cval=50)
        desired = numpy.array([[2, 7, 12, 17, 50], [1, 6, 11, 16, 50],
                               [0, 5, 10, 15, 50], [50, 4, 9, 14, 19]])
        # Note: because out or boundary (slightly) the following are cval
        #desired[0,0] = desired[2,0] = 50
        np_test.assert_almost_equal(trans[1:3, 1:4], desired[1:3, 1:4])
예제 #10
0
    def testTransform(self):
        """
        Tests transform() method
        """

        # simple
        af = Affine.find(x=self.x1, y=self.y1m)
        desired = numpy.inner(self.x1, af.gl) + af.d
        np_test.assert_almost_equal(af.transform(self.x1), desired)

        # 2D phi=90, 'point_dim'
        af = Affine2D(phi=numpy.pi / 2, scale=1)
        desired = numpy.array([[0, 0], [0, 2], [-1, 2], [-1, 0]])
        np_test.assert_almost_equal(af.transform(self.x1, xy_axes='point_dim'),
                                    desired)

        # 2D phi=90, 'point_dim', center = None
        af = Affine2D(phi=numpy.pi / 2, scale=1)
        desired = numpy.array([[0, 0], [0, 2], [-1, 2], [-1, 0]])
        np_test.assert_almost_equal(
            af.transform(self.x1, xy_axes='point_dim', center=None), desired)

        # 2D phi=90, 'point_dim', center
        af = Affine2D(phi=numpy.pi / 2, scale=1)
        #desired = numpy.array([[0, 0], [0, 2], [-1, 2], [-1, 0]])
        desired = numpy.array([[3, -1], [3, 1], [2, 1], [2, -1]])
        np_test.assert_almost_equal(
            af.transform(self.x1, xy_axes='point_dim', center=[2, 1]), desired)

        # 2D phi=-90, 'dim_point'
        af = Affine2D(phi=-numpy.pi / 2, scale=1)
        desired = numpy.array([[0, 0, 1, 1], [0, -2, -2, 0]])
        np_test.assert_almost_equal(
            af.transform(self.x1.transpose(), xy_axes='dim_point'), desired)

        # 2D phi=-90, 'dim_point'
        af = Affine2D(phi=-numpy.pi / 2, scale=1)
        #desired = numpy.array([[0, 0, 1, 1], [0, -2, -2, 0]])
        desired = numpy.array([[-3, -3, -2, -2], [1, -1, -1, 1]])
        np_test.assert_almost_equal(
            af.transform(self.x1.transpose(),
                         xy_axes='dim_point',
                         center=[-1, 2]), desired)

        # 2d phi 90, 'mgrid'
        af = Affine2D(phi=numpy.pi / 2, scale=1)
        grid = numpy.mgrid[0:3, 0:2]
        desired = numpy.array([[[0, -1], [0, -1], [0, -1]],
                               [[0, 0], [1, 1], [2, 2]]])
        np_test.assert_almost_equal(af.transform(grid, xy_axes='mgrid'),
                                    desired)

        # 2d phi 90, 'mgrid', center=0
        af = Affine2D(phi=numpy.pi / 2, scale=1)
        grid = numpy.mgrid[0:3, 0:2]
        desired = numpy.array([[[0, -1], [0, -1], [0, -1]],
                               [[0, 0], [1, 1], [2, 2]]])
        np_test.assert_almost_equal(
            af.transform(grid, xy_axes='mgrid', center=0), desired)

        # 2d phi 90, 'mgrid', center
        af = Affine2D(phi=numpy.pi / 2, scale=1)
        grid = numpy.mgrid[0:3, 0:2]
        desired = numpy.array([[[1, 0], [1, 0], [1, 0]],
                               [[-3, -3], [-2, -2], [-1, -1]]])
        np_test.assert_almost_equal(
            af.transform(grid, xy_axes='mgrid', center=[2, -1]), desired)

        # 2d phi 90, scale 2, 'mgrid', center
        af = Affine2D(phi=numpy.pi / 2, scale=2)
        grid = numpy.mgrid[0:3, 0:2]
        desired = numpy.array([[[0., -2], [0, -2], [0, -2]],
                               [[-5, -5], [-3, -3], [-1, -1]]])
        np_test.assert_almost_equal(
            af.transform(grid, xy_axes='mgrid', center=[2, -1]), desired)

        # 2d phi -90, 'mgrid' (meshgrid)
        af = Affine2D(phi=-numpy.pi / 2, scale=1)
        grid = numpy.meshgrid([0, 2, 4], [1, 3], indexing='ij')
        desired = numpy.array([[[1, 3], [1, 3], [1, 3]],
                               [[0, 0], [-2, -2], [-4, -4]]])
        np_test.assert_almost_equal(af.transform(grid, xy_axes='mgrid'),
                                    desired)

        # 2d phi -90, 'mgrid' (meshgrid), translation
        af = Affine2D(phi=-numpy.pi / 2, scale=1)
        af.d = [1, -1]
        grid = numpy.meshgrid([0, 2, 4], [1, 3], indexing='ij')
        desired = numpy.array([[[2, 4], [2, 4], [2, 4]],
                               [[-1, -1], [-3, -3], [-5, -5]]])
        np_test.assert_almost_equal(af.transform(grid, xy_axes='mgrid'),
                                    desired)

        # 2d phi -90, 'mgrid' (meshgrid), translation, center
        af = Affine2D(phi=-numpy.pi / 2, scale=1)
        af.d = [1, -1]
        grid = numpy.meshgrid([0, 2, 4], [1, 3], indexing='ij')
        desired = numpy.array([[[5., 7], [5, 7], [5, 7]],
                               [[-2, -2], [-4, -4], [-6, -6]]])
        np_test.assert_almost_equal(
            af.transform(grid, xy_axes='mgrid', center=[1, -2]), desired)

        # gl
        af = Affine2D(gl=numpy.array([[1., 2], [0, -1]]))
        np_test.assert_almost_equal(
            af.transform([[1, -1]], xy_axes='point_dim'), [[-1, 1]])

        # gl, translation
        af = Affine2D(gl=numpy.array([[1., 2], [0, -1]]), d=[2, -1])
        np_test.assert_almost_equal(
            af.transform([[1], [-1]], xy_axes='dim_point'), [[1], [0]])

        # gl, translation, center
        af = Affine2D(gl=numpy.array([[1., 2], [0, -1]]), d=[2, -1])
        np_test.assert_almost_equal(
            af.transform([[1], [-1]], xy_axes='dim_point', center=[1, -1]),
            [[3], [-2]])
예제 #11
0
    def testDecompose(self):
        """
        Tests decompose (decomposeQR and decomposeSV) and composeGl
        """

        repeat = 10
        for i in range(repeat):

            # initialize 3x3 random array
            gl = numpy.random.random((3, 3))

            # check qpsm
            af = Affine(gl=gl)
            af.decompose(order='qpsm')
            self.checkQRDecompose(af)
            af.gl = None
            new_gl = af.composeGl(order='qpsm')
            np_test.assert_almost_equal(new_gl, gl)

            # check psmq
            af = Affine(gl=gl)
            af_1 = Affine()
            q, p, s, m = af_1.decompose(order='psmq', gl=gl)
            af_1.q = q
            af_1.p = p
            af_1.s = s
            af_1.m = m
            self.checkQRDecompose(af_1)
            af_2 = Affine()
            gl_2 = af_2.composeGl(order='psmq', q=q, p=p, s=s, m=m)
            np_test.assert_almost_equal(gl_2, gl)

            # check usv
            af = Affine(gl=gl)
            af.decompose(order='usv')
            self.checkSVDecompose(af)
            af_1 = Affine()
            af_1.u = af.u
            af_1.s = af.s
            af_1.p = af.p
            af_1.v = af.v
            new_gl = af_1.composeGl(order='usv')
            np_test.assert_almost_equal(new_gl, gl)

            # initialize 4x4 random array
            gl = numpy.random.random((4, 4))

            # check qpsm
            af = Affine(gl=gl)
            af_1 = Affine()
            q, p, s, m = af_1.decompose(order='qpsm', gl=gl)
            af_1.q = q
            af_1.p = p
            af_1.s = s
            af_1.m = m
            self.checkQRDecompose(af_1)
            af_2 = Affine()
            gl_2 = af_2.composeGl(order='qpsm', q=q, p=p, s=s, m=m)
            np_test.assert_almost_equal(gl_2, gl)

            # check psmq
            af = Affine(gl=gl)
            af.decompose(order='psmq')
            self.checkQRDecompose(af)
            af.gl = None
            new_gl = af.composeGl(order='psmq')
            np_test.assert_almost_equal(new_gl, gl)

            # check psmq
            af = Affine(gl=gl)
            af_1 = Affine()
            af_1.u, af_1.p, af_1.s, af_1.v = af_1.decompose(order='usv', gl=gl)
            self.checkSVDecompose(af_1)
            af_2 = Affine()
            af_2.u = af_1.u
            af_2.s = af_1.s
            af_2.p = af_1.p
            af_2.v = af_1.v
            new_gl = af_2.composeGl(order='usv')
            np_test.assert_almost_equal(new_gl, gl)