#cython: cdivision=True #cython: boundscheck=False #cython: nonecheck=False #cython: wraparound=False import numpy as np cimport numpy as cnp from libc.float cimport DBL_MAX from skimage.color import rgb2grey from skimage.util import img_as_float def corner_moravec(image, Py_ssize_t window_size=1): """Compute Moravec corner measure response image. This is one of the simplest corner detectors and is comparatively fast but has several limitations (e.g. not rotation invariant). Parameters ---------- image : ndarray Input image. window_size : int, optional (default 1) Window size. Returns ------- response : ndarray Moravec response image. References ---------- ..[1] http://kiwi.cs.dal.ca/~dparks/CornerDetection/moravec.htm ..[2] http://en.wikipedia.org/wiki/Corner_detection Examples -------- >>> from skimage.feature import corner_moravec, peak_local_max >>> square = np.zeros([7, 7]) >>> square[3, 3] = 1 >>> square array([[ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.]]) >>> corner_moravec(square) array([[ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 1., 1., 1., 0., 0.], [ 0., 0., 1., 2., 1., 0., 0.], [ 0., 0., 1., 1., 1., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.]]) """ cdef Py_ssize_t rows = image.shape[0] cdef Py_ssize_t cols = image.shape[1] cdef double[:, ::1] cimage = np.ascontiguousarray(img_as_float(image)) cdef double[:, ::1] out = np.zeros(image.shape, dtype=np.double) cdef double msum, min_msum cdef Py_ssize_t r, c, br, bc, mr, mc, a, b for r in range(2 * window_size, rows - 2 * window_size): for c in range(2 * window_size, cols - 2 * window_size): min_msum = DBL_MAX for br in range(r - window_size, r + window_size + 1): for bc in range(c - window_size, c + window_size + 1): if br != r and bc != c: msum = 0 for mr in range(- window_size, window_size + 1): for mc in range(- window_size, window_size + 1): msum += (cimage[r + mr, c + mc] - cimage[br + mr, bc + mc]) ** 2 min_msum = min(msum, min_msum) out[r, c] = min_msum return np.asarray(out)