For loop for mode=DoB in Cython

This commit is contained in:
Ankit Agrawal
2013-08-15 14:59:52 +05:30
parent 1484b9a72a
commit 1bbeeb45d6
4 changed files with 46 additions and 22 deletions
+3
View File
@@ -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
+19 -22
View File
@@ -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))
+21
View File
@@ -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
+3
View File
@@ -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'],