Exchanged array output parameter for pointer and Py_ssize_t in kernel functions for slight speedup.

This commit is contained in:
Geoffrey French
2014-09-01 22:39:41 +01:00
parent 29763582f5
commit b9ac11da3f
5 changed files with 72 additions and 40 deletions
+6 -3
View File
@@ -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] = <dtype_t_out>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] = <dtype_t_out>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,
+1 -1
View File
@@ -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,
+7 -6
View File
@@ -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 = <Py_ssize_t>(selem.shape[0] / 2) + shift_y
cdef Py_ssize_t centre_c = <Py_ssize_t>(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
+40 -21
View File
@@ -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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>(histo[i] * scale)
else:
for i in xrange(out.shape[0]):
for i in xrange(odepth):
out[i] = <dtype_t_out>0
+18 -9
View File
@@ -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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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] = <dtype_t_out>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,