From 1a2efa7e377dea8adc3773670aaec50db22b63e3 Mon Sep 17 00:00:00 2001 From: Ankit Agrawal Date: Sun, 3 Nov 2013 22:41:58 +0530 Subject: [PATCH] Extending recarray changes to BRIEF --- skimage/feature/__init__.py | 3 ++- skimage/feature/_brief.py | 20 ++++++++++++-------- skimage/feature/orb.py | 10 +++++----- skimage/feature/tests/_test_brief.py | 18 +++++++++++++----- skimage/feature/util.py | 2 +- 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/skimage/feature/__init__.py b/skimage/feature/__init__.py index 0487f7b6..50217f53 100644 --- a/skimage/feature/__init__.py +++ b/skimage/feature/__init__.py @@ -11,7 +11,7 @@ from .corner_cy import corner_moravec, corner_orientations from .template import match_template from ._brief import descriptor_brief from .match import match_binary_descriptors -from .util import pairwise_hamming_distance +from .util import pairwise_hamming_distance, create_keypoint_recarray from .censure import keypoints_censure from .orb import keypoints_orb, descriptor_orb @@ -31,6 +31,7 @@ __all__ = ['daisy', 'match_template', 'descriptor_brief', 'pairwise_hamming_distance', + 'create_keypoint_recarray', 'match_binary_descriptors', 'keypoints_censure', 'corner_fast', diff --git a/skimage/feature/_brief.py b/skimage/feature/_brief.py index 94c92f04..b7ecfb5e 100644 --- a/skimage/feature/_brief.py +++ b/skimage/feature/_brief.py @@ -17,8 +17,9 @@ def descriptor_brief(image, keypoints, descriptor_size=256, mode='normal', ---------- image : 2D ndarray Input image. - keypoints : (P, 2) ndarray - Array of keypoint locations in the format (row, col). + keypoints : record array with P rows + Record array with fields row, col, octave, orientation, response. + Octave, orientation and response can be None. descriptor_size : int Size of BRIEF descriptor about each keypoint. Sizes 128, 256 and 512 preferred by the authors. Default is 256. @@ -141,15 +142,18 @@ def descriptor_brief(image, keypoints, descriptor_size=256, mode='normal', image = np.ascontiguousarray(image) - keypoints = np.array(keypoints + 0.5, dtype=np.intp, order='C') + keypoints_loc = np.array(np.squeeze(np.dstack((keypoints.row, keypoints.col))) + + 0.5, dtype=np.intp, order='C') # Removing keypoints that are within (patch_size / 2) distance from the # image border - keypoints = keypoints[_mask_border_keypoints(image, keypoints, patch_size // 2)] - keypoints = np.ascontiguousarray(keypoints) + border_mask = _mask_border_keypoints(image, keypoints_loc, patch_size // 2) + keypoints = keypoints[border_mask] + keypoints_loc = keypoints_loc[border_mask] + keypoints_loc = np.ascontiguousarray(keypoints_loc) - descriptors = np.zeros((keypoints.shape[0], descriptor_size), dtype=bool, - order='C') + descriptors = np.zeros((keypoints_loc.shape[0], descriptor_size), + dtype=bool, order='C') # Sampling pairs of decision pixels in patch_size x patch_size window if mode == 'normal': @@ -175,6 +179,6 @@ def descriptor_brief(image, keypoints, descriptor_size=256, mode='normal', pos1 = np.ascontiguousarray(pos1) pos2 = np.ascontiguousarray(pos2) - _brief_loop(image, descriptors.view(np.uint8), keypoints, pos1, pos2) + _brief_loop(image, descriptors.view(np.uint8), keypoints_loc, pos1, pos2) return descriptors, keypoints diff --git a/skimage/feature/orb.py b/skimage/feature/orb.py index 55058a8e..fcfe4d7d 100644 --- a/skimage/feature/orb.py +++ b/skimage/feature/orb.py @@ -2,7 +2,7 @@ import numpy as np from skimage.feature.util import (_mask_border_keypoints, _prepare_grayscale_input_2D, - _create_keypoint_recarray) + create_keypoint_recarray) from skimage.feature import (corner_fast, corner_orientations, corner_peaks, corner_harris) @@ -116,10 +116,10 @@ def keypoints_orb(image, n_keypoints=500, fast_n=9, fast_threshold=0.08, orientations = np.hstack(orientations_list) octaves = downscale ** np.hstack(scales_list) harris_measure = np.hstack(harris_response_list) - keypoints = _create_keypoint_recarray(keypoints_array[:, 0], - keypoints_array[:, 1], - octaves, orientations, - harris_measure) + keypoints = create_keypoint_recarray(keypoints_array[:, 0], + keypoints_array[:, 1], + octaves, orientations, + harris_measure) if keypoints.shape[0] < n_keypoints: return keypoints diff --git a/skimage/feature/tests/_test_brief.py b/skimage/feature/tests/_test_brief.py index 7983b023..40a0ac38 100644 --- a/skimage/feature/tests/_test_brief.py +++ b/skimage/feature/tests/_test_brief.py @@ -3,14 +3,17 @@ from numpy.testing import assert_array_equal, assert_raises from skimage import data from skimage import transform as tf from skimage.color import rgb2gray -from skimage.feature import (descriptor_brief, match_binary_descriptors, corner_peaks, - corner_harris) +from skimage.feature import (descriptor_brief, match_binary_descriptors, + corner_peaks, corner_harris, + create_keypoint_recarray) def test_descriptor_brief_color_image_unsupported_error(): """Brief descriptors can be evaluated on gray-scale images only.""" img = np.zeros((20, 20, 3)) - keypoints = [[7, 5], [11, 13]] + keypoints_loc = np.asarray([[7, 5], [11, 13]]) + keypoints = create_keypoint_recarray(keypoints_loc[:, 0], + keypoints_loc[:, 1]) assert_raises(ValueError, descriptor_brief, img, keypoints) @@ -18,7 +21,10 @@ def test_descriptor_brief_normal_mode(): """Verify the computed BRIEF descriptors with expected for normal mode.""" img = data.lena() img = rgb2gray(img) - keypoints = corner_peaks(corner_harris(img), min_distance=5) + keypoints_loc = corner_peaks(corner_harris(img), min_distance=5) + keypoints = create_keypoint_recarray(keypoints_loc[:, 0], + keypoints_loc[:, 1]) + descriptors, keypoints = descriptor_brief(img, keypoints[:8], descriptor_size=8) @@ -38,7 +44,9 @@ def test_descriptor_brief_uniform_mode(): """Verify the computed BRIEF descriptors with expected for uniform mode.""" img = data.lena() img = rgb2gray(img) - keypoints = corner_peaks(corner_harris(img), min_distance=5) + keypoints_loc = corner_peaks(corner_harris(img), min_distance=5) + keypoints = create_keypoint_recarray(keypoints_loc[:, 0], + keypoints_loc[:, 1]) descriptors, keypoints = descriptor_brief(img, keypoints[:8], descriptor_size=8, mode='uniform') diff --git a/skimage/feature/util.py b/skimage/feature/util.py index 18325cc8..a0942d79 100644 --- a/skimage/feature/util.py +++ b/skimage/feature/util.py @@ -3,7 +3,7 @@ import numpy as np from skimage.util import img_as_float -def _create_keypoint_recarray(row, col, octave=None, orientation=None, +def create_keypoint_recarray(row, col, octave=None, orientation=None, response=None): keypoints = np.zeros(row.shape[0], dtype=[('row', np.double), ('col', np.double),