An Python/NumPy implementation of a method for approximating a contour with a Fourier series, as described in .
$ pip install pyefd
General usage examples
This section describes the general usage patterns of
from pyefd import elliptic_fourier_descriptors coeffs = elliptic_fourier_descriptors(contour, order=10)
The coefficients returned are the
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)
If you are using OpenCV to generate contours, this example
shows how to connect it to
import cv2 import numpy from pyefd import elliptic_fourier_descriptors # Find the contours of a binary image using OpenCV. contours, hierarchy = cv2.findContours( im, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # Iterate through all contours found and store each contour's # elliptical Fourier descriptor's coefficients. coeffs =  for cnt in contours: # Find the coefficients of all contours coeffs.append(elliptic_fourier_descriptors( numpy.squeeze(cnt), order=10))
Using EFD as features
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  for more technical details.
Run tests with:
$ python setup.py test
or with Pytest:
$ py.test tests.py
The tests include a single image from the MNIST dataset of handwritten digits () as a contour to use for testing.
|||(1, 2) Frank P Kuhl, Charles R Giardina, Elliptic Fourier features of a closed contour, Computer Graphics and Image Processing, Volume 18, Issue 3, 1982, Pages 236-258, ISSN 0146-664X, http://dx.doi.org/10.1016/0146-664X(82)90034-X.|
|||LeCun et al. (1999): The MNIST Dataset Of Handwritten Digits|