#cython: cdivision=True #cython: boundscheck=False #cython: nonecheck=False #cython: wraparound=False cimport numpy as cnp cdef float integrate(cnp.ndarray[float, ndim=2, mode="c"] sat, int r0, int c0, int r1, int c1): """ 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