mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-02 07:21:58 +08:00
83 lines
2.8 KiB
Cython
83 lines
2.8 KiB
Cython
#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)
|