mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-29 03:37:34 +08:00
190 lines
6.0 KiB
Cython
190 lines
6.0 KiB
Cython
#cython: cdivision=True
|
|
#cython: boundscheck=False
|
|
#cython: nonecheck=False
|
|
#cython: wraparound=False
|
|
import numpy as np
|
|
|
|
|
|
cpdef moments(double[:, :] image, Py_ssize_t order=3):
|
|
"""Calculate all raw image moments up to a certain order.
|
|
|
|
The following properties can be calculated from raw image moments:
|
|
* Area as ``m[0, 0]``.
|
|
* Centroid as {``m[0, 1] / m[0, 0]``, ``m[1, 0] / m[0, 0]``}.
|
|
|
|
Note that raw moments are neither translation, scale nor rotation
|
|
invariant.
|
|
|
|
Parameters
|
|
----------
|
|
image : 2D double array
|
|
Rasterized shape as image.
|
|
order : int, optional
|
|
Maximum order of moments. Default is 3.
|
|
|
|
Returns
|
|
-------
|
|
m : (``order + 1``, ``order + 1``) array
|
|
Raw image moments.
|
|
|
|
References
|
|
----------
|
|
.. [1] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
|
|
Core Algorithms. Springer-Verlag, London, 2009.
|
|
.. [2] B. Jähne. Digital Image Processing. Springer-Verlag,
|
|
Berlin-Heidelberg, 6. edition, 2005.
|
|
.. [3] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
|
|
Features, from Lecture notes in computer science, p. 676. Springer,
|
|
Berlin, 1993.
|
|
.. [4] http://en.wikipedia.org/wiki/Image_moment
|
|
|
|
"""
|
|
return moments_central(image, 0, 0, order)
|
|
|
|
|
|
cpdef moments_central(double[:, :] image, double cr, double cc,
|
|
Py_ssize_t order=3):
|
|
"""Calculate all central image moments up to a certain order.
|
|
|
|
Note that central moments are translation invariant but not scale and
|
|
rotation invariant.
|
|
|
|
Parameters
|
|
----------
|
|
image : 2D double array
|
|
Rasterized shape as image.
|
|
cr : double
|
|
Center row coordinate.
|
|
cc : double
|
|
Center column coordinate.
|
|
order : int, optional
|
|
Maximum order of moments. Default is 3.
|
|
|
|
Returns
|
|
-------
|
|
mu : (``order + 1``, ``order + 1``) array
|
|
Central image moments.
|
|
|
|
References
|
|
----------
|
|
.. [1] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
|
|
Core Algorithms. Springer-Verlag, London, 2009.
|
|
.. [2] B. Jähne. Digital Image Processing. Springer-Verlag,
|
|
Berlin-Heidelberg, 6. edition, 2005.
|
|
.. [3] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
|
|
Features, from Lecture notes in computer science, p. 676. Springer,
|
|
Berlin, 1993.
|
|
.. [4] http://en.wikipedia.org/wiki/Image_moment
|
|
|
|
"""
|
|
cdef Py_ssize_t p, q, r, c
|
|
cdef double[:, ::1] mu = np.zeros((order + 1, order + 1), dtype=np.double)
|
|
cdef double val, dr, dc, dcp, drq
|
|
for r in range(image.shape[0]):
|
|
dr = r - cr
|
|
for c in range(image.shape[1]):
|
|
dc = c - cc
|
|
val = image[r, c]
|
|
dcp = 1
|
|
for p in range(order + 1):
|
|
drq = 1
|
|
for q in range(order + 1):
|
|
mu[p, q] += val * drq * dcp
|
|
drq *= dr
|
|
dcp *= dc
|
|
return np.asarray(mu)
|
|
|
|
|
|
def moments_normalized(double[:, :] mu, Py_ssize_t order=3):
|
|
"""Calculate all normalized central image moments up to a certain order.
|
|
|
|
Note that normalized central moments are translation and scale invariant
|
|
but not rotation invariant.
|
|
|
|
Parameters
|
|
----------
|
|
mu : (M, M) array
|
|
Central image moments, where M must be > ``order``.
|
|
order : int, optional
|
|
Maximum order of moments. Default is 3.
|
|
|
|
Returns
|
|
-------
|
|
nu : (``order + 1``, ``order + 1``) array
|
|
Normalized central image moments.
|
|
|
|
References
|
|
----------
|
|
.. [1] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
|
|
Core Algorithms. Springer-Verlag, London, 2009.
|
|
.. [2] B. Jähne. Digital Image Processing. Springer-Verlag,
|
|
Berlin-Heidelberg, 6. edition, 2005.
|
|
.. [3] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
|
|
Features, from Lecture notes in computer science, p. 676. Springer,
|
|
Berlin, 1993.
|
|
.. [4] http://en.wikipedia.org/wiki/Image_moment
|
|
|
|
"""
|
|
cdef Py_ssize_t p, q
|
|
cdef double[:, ::1] nu = np.zeros((order + 1, order + 1), dtype=np.double)
|
|
for p in range(order + 1):
|
|
for q in range(order + 1):
|
|
if p + q >= 2:
|
|
nu[p, q] = mu[p, q] / mu[0, 0] ** (<double>(p + q) / 2 + 1)
|
|
else:
|
|
nu[p, q] = np.nan
|
|
return np.asarray(nu)
|
|
|
|
|
|
def moments_hu(double[:, :] nu):
|
|
"""Calculate Hu's set of image moments.
|
|
|
|
Note that this set of moments is proofed to be translation, scale and
|
|
rotation invariant.
|
|
|
|
Parameters
|
|
----------
|
|
nu : (M, M) array
|
|
Normalized central image moments, where M must be > 4.
|
|
|
|
Returns
|
|
-------
|
|
nu : (7, 1) array
|
|
Hu's set of image moments.
|
|
|
|
References
|
|
----------
|
|
.. [1] M. K. Hu, "Visual Pattern Recognition by Moment Invariants",
|
|
IRE Trans. Info. Theory, vol. IT-8, pp. 179-187, 1962
|
|
.. [2] Wilhelm Burger, Mark Burge. Principles of Digital Image Processing:
|
|
Core Algorithms. Springer-Verlag, London, 2009.
|
|
.. [3] B. Jähne. Digital Image Processing. Springer-Verlag,
|
|
Berlin-Heidelberg, 6. edition, 2005.
|
|
.. [4] T. H. Reiss. Recognizing Planar Objects Using Invariant Image
|
|
Features, from Lecture notes in computer science, p. 676. Springer,
|
|
Berlin, 1993.
|
|
.. [5] http://en.wikipedia.org/wiki/Image_moment
|
|
|
|
|
|
"""
|
|
cdef double[::1] hu = np.zeros((7, ), dtype=np.double)
|
|
cdef double t0 = nu[3, 0] + nu[1, 2]
|
|
cdef double t1 = nu[2, 1] + nu[0, 3]
|
|
cdef double q0 = t0 * t0
|
|
cdef double q1 = t1 * t1
|
|
cdef double n4 = 4 * nu[1, 1]
|
|
cdef double s = nu[2, 0] + nu[0, 2]
|
|
cdef double d = nu[2, 0] - nu[0, 2]
|
|
hu[0] = s
|
|
hu[1] = d * d + n4 * nu[1, 1]
|
|
hu[3] = q0 + q1
|
|
hu[5] = d * (q0 - q1) + n4 * t0 * t1
|
|
t0 *= q0 - 3 * q1
|
|
t1 *= 3 * q0 - q1
|
|
q0 = nu[3, 0]- 3 * nu[1, 2]
|
|
q1 = 3 * nu[2, 1] - nu[0, 3]
|
|
hu[2] = q0 * q0 + q1 * q1
|
|
hu[4] = q0 * t0 + q1 * t1
|
|
hu[6] = q1 * t0 - q0 * t1
|
|
return np.asarray(hu)
|