From b9ac11da3f20dd30fe3c7bab30124df72c2fb152 Mon Sep 17 00:00:00 2001 From: Geoffrey French Date: Mon, 1 Sep 2014 22:39:41 +0100 Subject: [PATCH] Exchanged array output parameter for pointer and Py_ssize_t in kernel functions for slight speedup. --- skimage/filter/rank/bilateral_cy.pyx | 9 ++-- skimage/filter/rank/core_cy.pxd | 2 +- skimage/filter/rank/core_cy.pyx | 13 +++--- skimage/filter/rank/generic_cy.pyx | 61 ++++++++++++++++++--------- skimage/filter/rank/percentile_cy.pyx | 27 ++++++++---- 5 files changed, 72 insertions(+), 40 deletions(-) diff --git a/skimage/filter/rank/bilateral_cy.pyx b/skimage/filter/rank/bilateral_cy.pyx index 0e232465..20a97788 100644 --- a/skimage/filter/rank/bilateral_cy.pyx +++ b/skimage/filter/rank/bilateral_cy.pyx @@ -9,7 +9,8 @@ from libc.math cimport log from .core_cy cimport dtype_t, dtype_t_out, _core -cdef inline void _kernel_mean(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_mean(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -32,7 +33,8 @@ cdef inline void _kernel_mean(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_pop(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_pop(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -49,7 +51,8 @@ cdef inline void _kernel_pop(dtype_t_out[:] out, Py_ssize_t* histo, else: out[0] = 0 -cdef inline void _kernel_sum(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_sum(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, diff --git a/skimage/filter/rank/core_cy.pxd b/skimage/filter/rank/core_cy.pxd index 7d23f12a..9627c0d9 100644 --- a/skimage/filter/rank/core_cy.pxd +++ b/skimage/filter/rank/core_cy.pxd @@ -15,7 +15,7 @@ cdef dtype_t _max(dtype_t a, dtype_t b) cdef dtype_t _min(dtype_t a, dtype_t b) -cdef void _core(void kernel(dtype_t_out[:] out, Py_ssize_t*, double, +cdef void _core(void kernel(dtype_t_out*, Py_ssize_t, Py_ssize_t*, double, dtype_t, Py_ssize_t, Py_ssize_t, double, double, Py_ssize_t, Py_ssize_t), dtype_t[:, ::1] image, diff --git a/skimage/filter/rank/core_cy.pyx b/skimage/filter/rank/core_cy.pyx index 3c8c9e42..c1216c0d 100644 --- a/skimage/filter/rank/core_cy.pyx +++ b/skimage/filter/rank/core_cy.pyx @@ -42,7 +42,7 @@ cdef inline char is_in_mask(Py_ssize_t rows, Py_ssize_t cols, return 0 -cdef void _core(void kernel(dtype_t_out[:] out_feat, Py_ssize_t*, double, dtype_t, +cdef void _core(void kernel(dtype_t_out*, Py_ssize_t, Py_ssize_t*, double, dtype_t, Py_ssize_t, Py_ssize_t, double, double, Py_ssize_t, Py_ssize_t), dtype_t[:, ::1] image, @@ -61,6 +61,7 @@ cdef void _core(void kernel(dtype_t_out[:] out_feat, Py_ssize_t*, double, dtype_ cdef Py_ssize_t cols = image.shape[1] cdef Py_ssize_t srows = selem.shape[0] cdef Py_ssize_t scols = selem.shape[1] + cdef Py_ssize_t odepth = out.shape[2] cdef Py_ssize_t centre_r = (selem.shape[0] / 2) + shift_y cdef Py_ssize_t centre_c = (selem.shape[1] / 2) + shift_x @@ -151,7 +152,7 @@ cdef void _core(void kernel(dtype_t_out[:] out_feat, Py_ssize_t*, double, dtype_ r = 0 c = 0 - kernel(out[r, c, :], histo, pop, image[r, c], max_bin, mid_bin, + kernel(&out[r, c, 0], odepth, histo, pop, image[r, c], max_bin, mid_bin, p0, p1, s0, s1) # main loop @@ -172,7 +173,7 @@ cdef void _core(void kernel(dtype_t_out[:] out_feat, Py_ssize_t*, double, dtype_ if is_in_mask(rows, cols, rr, cc, mask_data): histogram_decrement(histo, &pop, image[rr, cc]) - kernel(out[r, c, :], histo, pop, image[r, c], max_bin, mid_bin, + kernel(&out[r, c, 0], odepth, histo, pop, image[r, c], max_bin, mid_bin, p0, p1, s0, s1) r += 1 # pass to the next row @@ -192,7 +193,7 @@ cdef void _core(void kernel(dtype_t_out[:] out_feat, Py_ssize_t*, double, dtype_ if is_in_mask(rows, cols, rr, cc, mask_data): histogram_decrement(histo, &pop, image[rr, cc]) - kernel(out[r, c, :], histo, pop, image[r, c], max_bin, mid_bin, + kernel(&out[r, c, 0], odepth, histo, pop, image[r, c], max_bin, mid_bin, p0, p1, s0, s1) # ---> east to west @@ -209,7 +210,7 @@ cdef void _core(void kernel(dtype_t_out[:] out_feat, Py_ssize_t*, double, dtype_ if is_in_mask(rows, cols, rr, cc, mask_data): histogram_decrement(histo, &pop, image[rr, cc]) - kernel(out[r, c, :], histo, pop, image[r, c], max_bin, mid_bin, + kernel(&out[r, c, 0], odepth, histo, pop, image[r, c], max_bin, mid_bin, p0, p1, s0, s1) r += 1 # pass to the next row @@ -229,7 +230,7 @@ cdef void _core(void kernel(dtype_t_out[:] out_feat, Py_ssize_t*, double, dtype_ if is_in_mask(rows, cols, rr, cc, mask_data): histogram_decrement(histo, &pop, image[rr, cc]) - kernel(out[r, c, :], histo, pop, image[r, c], + kernel(&out[r, c, 0], odepth, histo, pop, image[r, c], max_bin, mid_bin, p0, p1, s0, s1) # release memory allocated by malloc diff --git a/skimage/filter/rank/generic_cy.pyx b/skimage/filter/rank/generic_cy.pyx index bafd2432..bc54855f 100644 --- a/skimage/filter/rank/generic_cy.pyx +++ b/skimage/filter/rank/generic_cy.pyx @@ -9,7 +9,8 @@ from libc.math cimport log from .core_cy cimport dtype_t, dtype_t_out, _core -cdef inline void _kernel_autolevel(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_autolevel(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -35,7 +36,8 @@ cdef inline void _kernel_autolevel(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_bottomhat(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_bottomhat(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -52,7 +54,8 @@ cdef inline void _kernel_bottomhat(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_equalize(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_equalize(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -71,7 +74,8 @@ cdef inline void _kernel_equalize(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_gradient(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_gradient(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -93,7 +97,8 @@ cdef inline void _kernel_gradient(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_maximum(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_maximum(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -110,7 +115,8 @@ cdef inline void _kernel_maximum(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_mean(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_mean(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -127,7 +133,8 @@ cdef inline void _kernel_mean(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_subtract_mean(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_subtract_mean(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -144,7 +151,8 @@ cdef inline void _kernel_subtract_mean(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_median(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_median(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -164,7 +172,8 @@ cdef inline void _kernel_median(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_minimum(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_minimum(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -181,7 +190,8 @@ cdef inline void _kernel_minimum(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_modal(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_modal(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -199,7 +209,8 @@ cdef inline void _kernel_modal(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_enhance_contrast(dtype_t_out[:] out, +cdef inline void _kernel_enhance_contrast(dtype_t_out* out, + Py_ssize_t odepth, Py_ssize_t* histo, double pop, dtype_t g, @@ -227,7 +238,8 @@ cdef inline void _kernel_enhance_contrast(dtype_t_out[:] out, out[0] = 0 -cdef inline void _kernel_pop(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_pop(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -236,7 +248,8 @@ cdef inline void _kernel_pop(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = pop -cdef inline void _kernel_sum(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_sum(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -253,7 +266,8 @@ cdef inline void _kernel_sum(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_threshold(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_threshold(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -270,7 +284,8 @@ cdef inline void _kernel_threshold(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_tophat(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_tophat(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -287,7 +302,8 @@ cdef inline void _kernel_tophat(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_noise_filter(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_noise_filter(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -313,7 +329,8 @@ cdef inline void _kernel_noise_filter(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = min_i -cdef inline void _kernel_entropy(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_entropy(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -332,7 +349,8 @@ cdef inline void _kernel_entropy(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_otsu(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_otsu(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -371,7 +389,8 @@ cdef inline void _kernel_otsu(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = max_i -cdef inline void _kernel_win_hist(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_win_hist(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -381,10 +400,10 @@ cdef inline void _kernel_win_hist(dtype_t_out[:] out, Py_ssize_t* histo, cdef double scale if pop: scale = 1.0 / pop - for i in xrange(out.shape[0]): + for i in xrange(odepth): out[i] = (histo[i] * scale) else: - for i in xrange(out.shape[0]): + for i in xrange(odepth): out[i] = 0 diff --git a/skimage/filter/rank/percentile_cy.pyx b/skimage/filter/rank/percentile_cy.pyx index af33546d..6d54999f 100644 --- a/skimage/filter/rank/percentile_cy.pyx +++ b/skimage/filter/rank/percentile_cy.pyx @@ -7,7 +7,8 @@ cimport numpy as cnp from .core_cy cimport dtype_t, dtype_t_out, _core, _min, _max -cdef inline void _kernel_autolevel(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_autolevel(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -40,7 +41,8 @@ cdef inline void _kernel_autolevel(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_gradient(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_gradient(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -68,7 +70,8 @@ cdef inline void _kernel_gradient(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_mean(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_mean(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -93,7 +96,8 @@ cdef inline void _kernel_mean(dtype_t_out[:] out, Py_ssize_t* histo, else: out[0] = 0 -cdef inline void _kernel_sum(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_sum(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -118,7 +122,8 @@ cdef inline void _kernel_sum(dtype_t_out[:] out, Py_ssize_t* histo, else: out[0] = 0 -cdef inline void _kernel_subtract_mean(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_subtract_mean(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, @@ -144,7 +149,8 @@ cdef inline void _kernel_subtract_mean(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_enhance_contrast(dtype_t_out[:] out, +cdef inline void _kernel_enhance_contrast(dtype_t_out* out, + Py_ssize_t odepth, Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, @@ -180,7 +186,8 @@ cdef inline void _kernel_enhance_contrast(dtype_t_out[:] out, out[0] = 0 -cdef inline void _kernel_percentile(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_percentile(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -204,7 +211,8 @@ cdef inline void _kernel_percentile(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_pop(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_pop(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1, @@ -224,7 +232,8 @@ cdef inline void _kernel_pop(dtype_t_out[:] out, Py_ssize_t* histo, out[0] = 0 -cdef inline void _kernel_threshold(dtype_t_out[:] out, Py_ssize_t* histo, +cdef inline void _kernel_threshold(dtype_t_out* out, Py_ssize_t odepth, + Py_ssize_t* histo, double pop, dtype_t g, Py_ssize_t max_bin, Py_ssize_t mid_bin, double p0, double p1,