From 1bbeeb45d6b29e756c3e7442d9506f918d47a2c5 Mon Sep 17 00:00:00 2001 From: Ankit Agrawal Date: Sat, 27 Jul 2013 16:34:28 +0530 Subject: [PATCH] For loop for mode=DoB in Cython --- bento.info | 3 +++ skimage/feature/censure.py | 41 ++++++++++++++++------------------ skimage/feature/censure_cy.pyx | 21 +++++++++++++++++ skimage/feature/setup.py | 3 +++ 4 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 skimage/feature/censure_cy.pyx diff --git a/bento.info b/bento.info index 648445d6..acdb155d 100644 --- a/bento.info +++ b/bento.info @@ -90,6 +90,9 @@ Library: Extension: skimage.morphology._greyreconstruct Sources: skimage/morphology/_greyreconstruct.pyx + Extension: skimage.feature.censure_cy + Sources: + skimage/feature/censure_cy.pyx Extension: skimage.feature._brief_cy Sources: skimage/feature/_brief_cy.pyx diff --git a/skimage/feature/censure.py b/skimage/feature/censure.py index f682735c..b6a1d31f 100644 --- a/skimage/feature/censure.py +++ b/skimage/feature/censure.py @@ -1,32 +1,27 @@ import numpy as np from scipy.ndimage.filters import maximum_filter, minimum_filter, convolve -from skimage.transform import integral_image -from skimage.feature.corner import _compute_auto_correlation -from skimage.morphology import convex_hull_image + +from ..transform import integral_image +from ..feature.corner import _compute_auto_correlation +from ..morphology import convex_hull_image +from ..util import img_as_float + +from .censure_cy import _censure_dob_loop import time -""" def _get_filtered_image(image, n, mode='DoB'): # TODO : Implement the STAR and Octagon mode if mode == 'DoB': - inner_wt = (1.0 / (2*n + 1)**2) - outer_wt = (1.0 / (12*n**2 + 4*n)) + inner_wt = (1.0 / (2 * n + 1)**2) + outer_wt = (1.0 / (12 * n**2 + 4 * n)) integral_img = integral_image(image) filtered_image = np.zeros(image.shape) # TODO : Outsource to Cython start = time.time() - for i in range(2 * n, image.shape[0] - 2 * n): - for j in range(2 * n, image.shape[1] - 2 * n): - inner = integral_img[i + n, j + n] + integral_img[i - n - 1, j - n - 1] - integral_img[i + n, j - n - 1] - integral_img[i - n - 1, j + n] - outer = integral_img[i + 2 * n, j + 2 * n] + integral_img[i - 2 * n - 1, j - 2 * n - 1] - integral_img[i + 2 * n, j - 2 * n - 1] - integral_img[i - 2 * n - 1, j + 2 * n] - filtered_image[i, j] = outer_wt * outer - (inner_wt + outer_wt) * inner + _censure_dob_loop(image, n, integral_img, filtered_image, inner_wt, outer_wt) print time.time() - start return filtered_image - elif mode == 'Octagon': - outer_shape = [(5, 2), (5, 3), (7, 3), (9, 4), (9, 7), (13, 7), (15, 10)] - inner_shape = [(3, 0), (3, 1), (3, 2), (5, 2), (5, 3), (5, 4), (5, 5)] -""" def _oct(m, n): @@ -86,15 +81,17 @@ def censure_keypoints(image, mode='DoB', threshold=0.03, rpc_threshold=10): image = np.squeeze(image) if image.ndim != 2: raise ValueError("Only 2-D gray-scale images supported.") + image = img_as_float(image) # Generating all the scales + image = np.ascontiguousarray(image) start = time.time() - scale1 = _filter_using_convolve(image, 1, mode) - scale2 = _filter_using_convolve(image, 2, mode) - scale3 = _filter_using_convolve(image, 3, mode) - scale4 = _filter_using_convolve(image, 4, mode) - scale5 = _filter_using_convolve(image, 5, mode) - scale6 = _filter_using_convolve(image, 6, mode) - scale7 = _filter_using_convolve(image, 7, mode) + scale1 = _get_filtered_image(image, 1, mode) + scale2 = _get_filtered_image(image, 2, mode) + scale3 = _get_filtered_image(image, 3, mode) + scale4 = _get_filtered_image(image, 4, mode) + scale5 = _get_filtered_image(image, 5, mode) + scale6 = _get_filtered_image(image, 6, mode) + scale7 = _get_filtered_image(image, 7, mode) print time.time() - start # Stacking all the scales in the 3rd dimension scales = np.dstack((scale1, scale2, scale3, scale4, scale5, scale6, scale7)) diff --git a/skimage/feature/censure_cy.pyx b/skimage/feature/censure_cy.pyx new file mode 100644 index 00000000..b28bc5e1 --- /dev/null +++ b/skimage/feature/censure_cy.pyx @@ -0,0 +1,21 @@ +#cython: cdivision=True +#cython: boundscheck=False +#cython: nonecheck=False +#cython: wraparound=False + +cimport numpy as cnp + + +def _censure_dob_loop(double[:, ::1] image, cnp.int16_t n, + double[:, ::1] integral_img, + double[:, ::1] filtered_image, + cnp.float_t inner_wt, cnp.float_t outer_wt): + + cdef Py_ssize_t i, j + cdef double inner, outer + + for i in range(2 * n, image.shape[0] - 2 * n): + for j in range(2 * n, image.shape[1] - 2 * n): + inner = integral_img[i + n, j + n] + integral_img[i - n - 1, j - n - 1] - integral_img[i + n, j - n - 1] - integral_img[i - n - 1, j + n] + outer = integral_img[i + 2 * n, j + 2 * n] + integral_img[i - 2 * n - 1, j - 2 * n - 1] - integral_img[i + 2 * n, j - 2 * n - 1] - integral_img[i - 2 * n - 1, j + 2 * n] + filtered_image[i, j] = outer_wt * outer - (inner_wt + outer_wt) * inner diff --git a/skimage/feature/setup.py b/skimage/feature/setup.py index f4c62957..7df64c32 100644 --- a/skimage/feature/setup.py +++ b/skimage/feature/setup.py @@ -13,12 +13,15 @@ def configuration(parent_package='', top_path=None): config.add_data_dir('tests') cython(['corner_cy.pyx'], working_path=base_path) + cython(['censure_cy.pyx'], working_path=base_path) cython(['_brief_cy.pyx'], working_path=base_path) cython(['_texture.pyx'], working_path=base_path) cython(['_template.pyx'], working_path=base_path) config.add_extension('corner_cy', sources=['corner_cy.c'], include_dirs=[get_numpy_include_dirs()]) + config.add_extension('censure_cy', sources=['censure_cy.c'], + include_dirs=[get_numpy_include_dirs()]) config.add_extension('_brief_cy', sources=['_brief_cy.c'], include_dirs=[get_numpy_include_dirs()]) config.add_extension('_texture', sources=['_texture.c'],