mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-18 12:40:14 +08:00
For loop for mode=DoB in Cython
This commit is contained in:
@@ -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
@@ -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))
|
||||
|
||||
@@ -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
|
||||
@@ -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'],
|
||||
|
||||
Reference in New Issue
Block a user