An Python/NumPy implementation of a method for approximating a contour with a Fourier series, as described in [1].
$ pip install pyefd
Given a closed contour of a shape, generated by e.g. scikit-image or OpenCV, this package can fit a Fourier series approximating the shape of the contour:
from pyefd import elliptic_fourier_descriptors
coeffs = elliptic_fourier_descriptors(contour, order=10)
The coefficients returned are the a_n
, b_n
, c_n
and d_n
of
the following Fourier series representation of the shape.
The coefficients returned are by default normalized so that they are rotation and size-invariant. This can be overridden by calling:
from pyefd import elliptic_fourier_descriptors
coeffs = elliptic_fourier_descriptors(contour, order=10, normalize=False)
Normalization can also be done afterwards:
from pyefd import normalize_efd
coeffs = normalize_efd(coeffs)
To use these as features, one can write a small wrapper function:
def efd_feature(contour):
coeffs = elliptic_fourier_descriptors(contour, order=10, normalize=True)
return coeffs.flatten()[3:]
If the coefficients are normalized, then coeffs[0, 0] = 1.0
,
coeffs[0, 1] = 0.0
and coeffs[0, 2] = 0.0
, so they can be disregarded when using
the elliptic Fourier descriptors as features.
See [1] for more technical details.
Run tests with:
$ python setup.py test
or with Pytest:
$ py.test tests.py
The tests includes a single image from the MNIST dataset of handwritten digits ([2]) as a contour to use for testing.
See ReadTheDocs.
[2] | LeCun et al. (1999): The MNIST Dataset Of Handwritten Digits |