#cython: cdivision=True #cython: boundscheck=False #cython: nonecheck=False #cython: wraparound=False cimport numpy as cnp cdef float integrate(float[:, ::1] sat, Py_ssize_t r0, Py_ssize_t c0, Py_ssize_t r1, Py_ssize_t c1) nogil: """ Using a summed area table / integral image, calculate the sum over a given window. This function is the same as the `integrate` function in `skimage.transform.integrate`, but this Cython version significantly speeds up the code. Parameters ---------- sat : ndarray of float Summed area table / integral image. r0, c0 : int Top-left corner of block to be summed. r1, c1 : int Bottom-right corner of block to be summed. Returns ------- S : int Sum over the given window. """ cdef float S = 0 S += sat[r1, c1] if (r0 - 1 >= 0) and (c0 - 1 >= 0): S += sat[r0 - 1, c0 - 1] if (r0 - 1 >= 0): S -= sat[r0 - 1, c1] if (c0 - 1 >= 0): S -= sat[r1, c0 - 1] return S