diff --git a/skimage/feature/orb.py b/skimage/feature/orb.py index e2f3752e..6f053aba 100644 --- a/skimage/feature/orb.py +++ b/skimage/feature/orb.py @@ -183,8 +183,6 @@ def descriptor_orb(image, keypoints, orientations, scales, """ image = _prepare_grayscale_input_2D(image) - image = img_as_float(image) - pyramid = list(pyramid_gaussian(image, n_scales - 1, downscale)) descriptors_list = [] diff --git a/skimage/feature/orb_cy.pyx b/skimage/feature/orb_cy.pyx index 2a2018d8..7e157a41 100644 --- a/skimage/feature/orb_cy.pyx +++ b/skimage/feature/orb_cy.pyx @@ -13,13 +13,12 @@ def _orb_loop(double[:, ::1] image, Py_ssize_t[:, ::1] keypoints, double[:] orientations): cdef Py_ssize_t i, d, kr, kc, pr0, pr1, pc0, pc1, spr0, spc0, spr1, spc1 - cdef char[:, ::1] pos0 = binary_tests[:, :2] - cdef char[:, ::1] pos1 = binary_tests[:, 2:] cdef int[:, ::1] steered_pos0, steered_pos1 cdef double angle cdef char[:, ::1] descriptors = np.zeros((keypoints.shape[0], 256), dtype=np.uint8) + for i in range(keypoints.shape[0]): angle = orientations[i] sin_a = sin(angle * M_PI / 180.) @@ -45,260 +44,517 @@ def _orb_loop(double[:, ::1] image, Py_ssize_t[:, ::1] keypoints, return np.asarray(descriptors) -# Learned 256 decision pairs for binary tests in rBRIEF. Taken from OpenCV. -cdef char[:, ::1] binary_tests = np.ascontiguousarray(np.asarray([[8,-3, 9,5], - [4,2, 7,-12], - [-11,9, -8,2], - [7,-12, 12,-13], - [2,-13, 2,12], - [1,-7, 1,6], - [-2,-10, -2,-4], - [-13,-13, -11,-8], - [-13,-3, -12,-9], - [10,4, 11,9], - [-13,-8, -8,-9], - [-11,7, -9,12], - [7,7, 12,6], - [-4,-5, -3,0], - [-13,2, -12,-3], - [-9,0, -7,5], - [12,-6, 12,-1], - [-3,6, -2,12], - [-6,-13, -4,-8], - [11,-13, 12,-8], - [4,7, 5,1], - [5,-3, 10,-3], - [3,-7, 6,12], - [-8,-7, -6,-2], - [-2,11, -1,-10], - [-13,12, -8,10], - [-7,3, -5,-3], - [-4,2, -3,7], - [-10,-12, -6,11], - [5,-12, 6,-7], - [5,-6, 7,-1], - [1,0, 4,-5], - [9,11, 11,-13], - [4,7, 4,12], - [2,-1, 4,4], - [-4,-12, -2,7], - [-8,-5, -7,-10], - [4,11, 9,12], - [0,-8, 1,-13], - [-13,-2, -8,2], - [-3,-2, -2,3], - [-6,9, -4,-9], - [8,12, 10,7], - [0,9, 1,3], - [7,-5, 11,-10], - [-13,-6, -11,0], - [10,7, 12,1], - [-6,-3, -6,12], - [10,-9, 12,-4], - [-13,8, -8,-12], - [-13,0, -8,-4], - [3,3, 7,8], - [5,7, 10,-7], - [-1,7, 1,-12], - [3,-10, 5,6], - [2,-4, 3,-10], - [-13,0, -13,5], - [-13,-7, -12,12], - [-13,3, -11,8], - [-7,12, -4,7], - [6,-10, 12,8], - [-9,-1, -7,-6], - [-2,-5, 0,12], - [-12,5, -7,5], - [3,-10, 8,-13], - [-7,-7, -4,5], - [-3,-2, -1,-7], - [2,9, 5,-11], - [-11,-13, -5,-13], - [-1,6, 0,-1], - [5,-3, 5,2], - [-4,-13, -4,12], - [-9,-6, -9,6], - [-12,-10, -8,-4], - [10,2, 12,-3], - [7,12, 12,12], - [-7,-13, -6,5], - [-4,9, -3,4], - [7,-1, 12,2], - [-7,6, -5,1], - [-13,11, -12,5], - [-3,7, -2,-6], - [7,-8, 12,-7], - [-13,-7, -11,-12], - [1,-3, 12,12], - [2,-6, 3,0], - [-4,3, -2,-13], - [-1,-13, 1,9], - [7,1, 8,-6], - [1,-1, 3,12], - [9,1, 12,6], - [-1,-9, -1,3], - [-13,-13, -10,5], - [7,7, 10,12], - [12,-5, 12,9], - [6,3, 7,11], - [5,-13, 6,10], - [2,-12, 2,3], - [3,8, 4,-6], - [2,6, 12,-13], - [9,-12, 10,3], - [-8,4, -7,9], - [-11,12, -4,-6], - [1,12, 2,-8], - [6,-9, 7,-4], - [2,3, 3,-2], - [6,3, 11,0], - [3,-3, 8,-8], - [7,8, 9,3], - [-11,-5, -6,-4], - [-10,11, -5,10], - [-5,-8, -3,12], - [-10,5, -9,0], - [8,-1, 12,-6], - [4,-6, 6,-11], - [-10,12, -8,7], - [4,-2, 6,7], - [-2,0, -2,12], - [-5,-8, -5,2], - [7,-6, 10,12], - [-9,-13, -8,-8], - [-5,-13, -5,-2], - [8,-8, 9,-13], - [-9,-11, -9,0], - [1,-8, 1,-2], - [7,-4, 9,1], - [-2,1, -1,-4], - [11,-6, 12,-11], - [-12,-9, -6,4], - [3,7, 7,12], - [5,5, 10,8], - [0,-4, 2,8], - [-9,12, -5,-13], - [0,7, 2,12], - [-1,2, 1,7], - [5,11, 7,-9], - [3,5, 6,-8], - [-13,-4, -8,9], - [-5,9, -3,-3], - [-4,-7, -3,-12], - [6,5, 8,0], - [-7,6, -6,12], - [-13,6, -5,-2], - [1,-10, 3,10], - [4,1, 8,-4], - [-2,-2, 2,-13], - [2,-12, 12,12], - [-2,-13, 0,-6], - [4,1, 9,3], - [-6,-10, -3,-5], - [-3,-13, -1,1], - [7,5, 12,-11], - [4,-2, 5,-7], - [-13,9, -9,-5], - [7,1, 8,6], - [7,-8, 7,6], - [-7,-4, -7,1], - [-8,11, -7,-8], - [-13,6, -12,-8], - [2,4, 3,9], - [10,-5, 12,3], - [-6,-5, -6,7], - [8,-3, 9,-8], - [2,-12, 2,8], - [-11,-2, -10,3], - [-12,-13, -7,-9], - [-11,0, -10,-5], - [5,-3, 11,8], - [-2,-13, -1,12], - [-1,-8, 0,9], - [-13,-11, -12,-5], - [-10,-2, -10,11], - [-3,9, -2,-13], - [2,-3, 3,2], - [-9,-13, -4,0], - [-4,6, -3,-10], - [-4,12, -2,-7], - [-6,-11, -4,9], - [6,-3, 6,11], - [-13,11, -5,5], - [11,11, 12,6], - [7,-5, 12,-2], - [-1,12, 0,7], - [-4,-8, -3,-2], - [-7,1, -6,7], - [-13,-12, -8,-13], - [-7,-2, -6,-8], - [-8,5, -6,-9], - [-5,-1, -4,5], - [-13,7, -8,10], - [1,5, 5,-13], - [1,0, 10,-13], - [9,12, 10,-1], - [5,-8, 10,-9], - [-1,11, 1,-13], - [-9,-3, -6,2], - [-1,-10, 1,12], - [-13,1, -8,-10], - [8,-11, 10,-6], - [2,-13, 3,-6], - [7,-13, 12,-9], - [-10,-10, -5,-7], - [-10,-8, -8,-13], - [4,-6, 8,5], - [3,12, 8,-13], - [-4,2, -3,-3], - [5,-13, 10,-12], - [4,-13, 5,-1], - [-9,9, -4,3], - [0,3, 3,-9], - [-12,1, -6,1], - [3,2, 4,-8], - [-10,-10, -10,9], - [8,-13, 12,12], - [-8,-12, -6,-5], - [2,2, 3,7], - [10,6, 11,-8], - [6,8, 8,-12], - [-7,10, -6,5], - [-3,-9, -3,9], - [-1,-13, -1,5], - [-3,-7, -3,4], - [-8,-2, -8,3], - [4,2, 12,12], - [2,-5, 3,11], - [6,-9, 11,-13], - [3,-1, 7,12], - [11,-1, 12,4], - [-3,0, -3,6], - [4,-11, 4,12], - [2,-4, 2,1], - [-10,-6, -8,1], - [-13,7, -11,1], - [-13,12, -11,-13], - [6,0, 11,-13], - [0,-1, 1,4], - [-13,3, -9,-2], - [-9,8, -6,-3], - [-13,-6, -8,-2], - [5,-9, 8,10], - [2,7, 3,-9], - [-1,-6, -1,-1], - [9,5, 11,-2], - [11,-3, 12,-8], - [3,0, 3,5], - [-1,4, 0,10], - [3,-6, 4,5], - [-13,0, -10,5], - [5,8, 12,11], - [8,9, 9,-6], - [7,-4, 8,-12], - [-10,4, -10,9], - [7,3, 12,4], - [9,-7, 10,-2], - [7,0, 12,-2], - [-1,-6, 0,-11]], dtype=np.int8)) +cdef char[:, ::1] pos0 = np.array([[ 8, -3], + [ 4, 2], + [-11, 9], + [ 7, -12], + [ 2, -13], + [ 1, -7], + [ -2, -10], + [-13, -13], + [-13, -3], + [ 10, 4], + [-13, -8], + [-11, 7], + [ 7, 7], + [ -4, -5], + [-13, 2], + [ -9, 0], + [ 12, -6], + [ -3, 6], + [ -6, -13], + [ 11, -13], + [ 4, 7], + [ 5, -3], + [ 3, -7], + [ -8, -7], + [ -2, 11], + [-13, 12], + [ -7, 3], + [ -4, 2], + [-10, -12], + [ 5, -12], + [ 5, -6], + [ 1, 0], + [ 9, 11], + [ 4, 7], + [ 2, -1], + [ -4, -12], + [ -8, -5], + [ 4, 11], + [ 0, -8], + [-13, -2], + [ -3, -2], + [ -6, 9], + [ 8, 12], + [ 0, 9], + [ 7, -5], + [-13, -6], + [ 10, 7], + [ -6, -3], + [ 10, -9], + [-13, 8], + [-13, 0], + [ 3, 3], + [ 5, 7], + [ -1, 7], + [ 3, -10], + [ 2, -4], + [-13, 0], + [-13, -7], + [-13, 3], + [ -7, 12], + [ 6, -10], + [ -9, -1], + [ -2, -5], + [-12, 5], + [ 3, -10], + [ -7, -7], + [ -3, -2], + [ 2, 9], + [-11, -13], + [ -1, 6], + [ 5, -3], + [ -4, -13], + [ -9, -6], + [-12, -10], + [ 10, 2], + [ 7, 12], + [ -7, -13], + [ -4, 9], + [ 7, -1], + [ -7, 6], + [-13, 11], + [ -3, 7], + [ 7, -8], + [-13, -7], + [ 1, -3], + [ 2, -6], + [ -4, 3], + [ -1, -13], + [ 7, 1], + [ 1, -1], + [ 9, 1], + [ -1, -9], + [-13, -13], + [ 7, 7], + [ 12, -5], + [ 6, 3], + [ 5, -13], + [ 2, -12], + [ 3, 8], + [ 2, 6], + [ 9, -12], + [ -8, 4], + [-11, 12], + [ 1, 12], + [ 6, -9], + [ 2, 3], + [ 6, 3], + [ 3, -3], + [ 7, 8], + [-11, -5], + [-10, 11], + [ -5, -8], + [-10, 5], + [ 8, -1], + [ 4, -6], + [-10, 12], + [ 4, -2], + [ -2, 0], + [ -5, -8], + [ 7, -6], + [ -9, -13], + [ -5, -13], + [ 8, -8], + [ -9, -11], + [ 1, -8], + [ 7, -4], + [ -2, 1], + [ 11, -6], + [-12, -9], + [ 3, 7], + [ 5, 5], + [ 0, -4], + [ -9, 12], + [ 0, 7], + [ -1, 2], + [ 5, 11], + [ 3, 5], + [-13, -4], + [ -5, 9], + [ -4, -7], + [ 6, 5], + [ -7, 6], + [-13, 6], + [ 1, -10], + [ 4, 1], + [ -2, -2], + [ 2, -12], + [ -2, -13], + [ 4, 1], + [ -6, -10], + [ -3, -13], + [ 7, 5], + [ 4, -2], + [-13, 9], + [ 7, 1], + [ 7, -8], + [ -7, -4], + [ -8, 11], + [-13, 6], + [ 2, 4], + [ 10, -5], + [ -6, -5], + [ 8, -3], + [ 2, -12], + [-11, -2], + [-12, -13], + [-11, 0], + [ 5, -3], + [ -2, -13], + [ -1, -8], + [-13, -11], + [-10, -2], + [ -3, 9], + [ 2, -3], + [ -9, -13], + [ -4, 6], + [ -4, 12], + [ -6, -11], + [ 6, -3], + [-13, 11], + [ 11, 11], + [ 7, -5], + [ -1, 12], + [ -4, -8], + [ -7, 1], + [-13, -12], + [ -7, -2], + [ -8, 5], + [ -5, -1], + [-13, 7], + [ 1, 5], + [ 1, 0], + [ 9, 12], + [ 5, -8], + [ -1, 11], + [ -9, -3], + [ -1, -10], + [-13, 1], + [ 8, -11], + [ 2, -13], + [ 7, -13], + [-10, -10], + [-10, -8], + [ 4, -6], + [ 3, 12], + [ -4, 2], + [ 5, -13], + [ 4, -13], + [ -9, 9], + [ 0, 3], + [-12, 1], + [ 3, 2], + [-10, -10], + [ 8, -13], + [ -8, -12], + [ 2, 2], + [ 10, 6], + [ 6, 8], + [ -7, 10], + [ -3, -9], + [ -1, -13], + [ -3, -7], + [ -8, -2], + [ 4, 2], + [ 2, -5], + [ 6, -9], + [ 3, -1], + [ 11, -1], + [ -3, 0], + [ 4, -11], + [ 2, -4], + [-10, -6], + [-13, 7], + [-13, 12], + [ 6, 0], + [ 0, -1], + [-13, 3], + [ -9, 8], + [-13, -6], + [ 5, -9], + [ 2, 7], + [ -1, -6], + [ 9, 5], + [ 11, -3], + [ 3, 0], + [ -1, 4], + [ 3, -6], + [-13, 0], + [ 5, 8], + [ 8, 9], + [ 7, -4], + [-10, 4], + [ 7, 3], + [ 9, -7], + [ 7, 0], + [ -1, -6]], dtype=np.int8) + + +cdef char[:, ::1] pos1 = np.array([[ 9, 5], + [ 7, -12], + [ -8, 2], + [ 12, -13], + [ 2, 12], + [ 1, 6], + [ -2, -4], + [-11, -8], + [-12, -9], + [ 11, 9], + [ -8, -9], + [ -9, 12], + [ 12, 6], + [ -3, 0], + [-12, -3], + [ -7, 5], + [ 12, -1], + [ -2, 12], + [ -4, -8], + [ 12, -8], + [ 5, 1], + [ 10, -3], + [ 6, 12], + [ -6, -2], + [ -1, -10], + [ -8, 10], + [ -5, -3], + [ -3, 7], + [ -6, 11], + [ 6, -7], + [ 7, -1], + [ 4, -5], + [ 11, -13], + [ 4, 12], + [ 4, 4], + [ -2, 7], + [ -7, -10], + [ 9, 12], + [ 1, -13], + [ -8, 2], + [ -2, 3], + [ -4, -9], + [ 10, 7], + [ 1, 3], + [ 11, -10], + [-11, 0], + [ 12, 1], + [ -6, 12], + [ 12, -4], + [ -8, -12], + [ -8, -4], + [ 7, 8], + [ 10, -7], + [ 1, -12], + [ 5, 6], + [ 3, -10], + [-13, 5], + [-12, 12], + [-11, 8], + [ -4, 7], + [ 12, 8], + [ -7, -6], + [ 0, 12], + [ -7, 5], + [ 8, -13], + [ -4, 5], + [ -1, -7], + [ 5, -11], + [ -5, -13], + [ 0, -1], + [ 5, 2], + [ -4, 12], + [ -9, 6], + [ -8, -4], + [ 12, -3], + [ 12, 12], + [ -6, 5], + [ -3, 4], + [ 12, 2], + [ -5, 1], + [-12, 5], + [ -2, -6], + [ 12, -7], + [-11, -12], + [ 12, 12], + [ 3, 0], + [ -2, -13], + [ 1, 9], + [ 8, -6], + [ 3, 12], + [ 12, 6], + [ -1, 3], + [-10, 5], + [ 10, 12], + [ 12, 9], + [ 7, 11], + [ 6, 10], + [ 2, 3], + [ 4, -6], + [ 12, -13], + [ 10, 3], + [ -7, 9], + [ -4, -6], + [ 2, -8], + [ 7, -4], + [ 3, -2], + [ 11, 0], + [ 8, -8], + [ 9, 3], + [ -6, -4], + [ -5, 10], + [ -3, 12], + [ -9, 0], + [ 12, -6], + [ 6, -11], + [ -8, 7], + [ 6, 7], + [ -2, 12], + [ -5, 2], + [ 10, 12], + [ -8, -8], + [ -5, -2], + [ 9, -13], + [ -9, 0], + [ 1, -2], + [ 9, 1], + [ -1, -4], + [ 12, -11], + [ -6, 4], + [ 7, 12], + [ 10, 8], + [ 2, 8], + [ -5, -13], + [ 2, 12], + [ 1, 7], + [ 7, -9], + [ 6, -8], + [ -8, 9], + [ -3, -3], + [ -3, -12], + [ 8, 0], + [ -6, 12], + [ -5, -2], + [ 3, 10], + [ 8, -4], + [ 2, -13], + [ 12, 12], + [ 0, -6], + [ 9, 3], + [ -3, -5], + [ -1, 1], + [ 12, -11], + [ 5, -7], + [ -9, -5], + [ 8, 6], + [ 7, 6], + [ -7, 1], + [ -7, -8], + [-12, -8], + [ 3, 9], + [ 12, 3], + [ -6, 7], + [ 9, -8], + [ 2, 8], + [-10, 3], + [ -7, -9], + [-10, -5], + [ 11, 8], + [ -1, 12], + [ 0, 9], + [-12, -5], + [-10, 11], + [ -2, -13], + [ 3, 2], + [ -4, 0], + [ -3, -10], + [ -2, -7], + [ -4, 9], + [ 6, 11], + [ -5, 5], + [ 12, 6], + [ 12, -2], + [ 0, 7], + [ -3, -2], + [ -6, 7], + [ -8, -13], + [ -6, -8], + [ -6, -9], + [ -4, 5], + [ -8, 10], + [ 5, -13], + [ 10, -13], + [ 10, -1], + [ 10, -9], + [ 1, -13], + [ -6, 2], + [ 1, 12], + [ -8, -10], + [ 10, -6], + [ 3, -6], + [ 12, -9], + [ -5, -7], + [ -8, -13], + [ 8, 5], + [ 8, -13], + [ -3, -3], + [ 10, -12], + [ 5, -1], + [ -4, 3], + [ 3, -9], + [ -6, 1], + [ 4, -8], + [-10, 9], + [ 12, 12], + [ -6, -5], + [ 3, 7], + [ 11, -8], + [ 8, -12], + [ -6, 5], + [ -3, 9], + [ -1, 5], + [ -3, 4], + [ -8, 3], + [ 12, 12], + [ 3, 11], + [ 11, -13], + [ 7, 12], + [ 12, 4], + [ -3, 6], + [ 4, 12], + [ 2, 1], + [ -8, 1], + [-11, 1], + [-11, -13], + [ 11, -13], + [ 1, 4], + [ -9, -2], + [ -6, -3], + [ -8, -2], + [ 8, 10], + [ 3, -9], + [ -1, -1], + [ 11, -2], + [ 12, -8], + [ 3, 5], + [ 0, 10], + [ 4, 5], + [-10, 5], + [ 12, 11], + [ 9, -6], + [ 8, -12], + [-10, 9], + [ 12, 4], + [ 10, -2], + [ 12, -2], + [ 0, -11]], dtype=np.int8)