hbldh
pyefd
Python

Python implementation of "Elliptic Fourier Features of a Closed Contour"

Last updated Jun 26, 2026
96
Stars
17
Forks
3
Issues
0
Stars/day
Attention Score
40
Language breakdown
Python 100.0%
โ–ธ Files click to expand
README

PyEFD =====

Build and Test Documentation Status image image image

An Python/NumPy implementation of a method for approximating a contour with a Fourier series, as described in [1].

Installation


pip install pyefd

Usage


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.

General usage examples

This section describes the general usage patterns of pyefd.

from pyefd import ellipticfourierdescriptors
coeffs = ellipticfourierdescriptors(contour, order=10)

The coefficients returned are the an, bn, cn and dn 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 ellipticfourierdescriptors
coeffs = ellipticfourierdescriptors(contour, order=10, normalize=False)

Normalization can also be done afterwards:

from pyefd import normalize_efd
coeffs = normalize_efd(coeffs)

OpenCV example

If you are using OpenCV to generate contours, this example shows how to connect it to pyefd.

import cv2 
import numpy
from pyefd import ellipticfourierdescriptors

Find the contours of a binary image using OpenCV.

contours, hierarchy = cv2.findContours( im, cv2.RETRTREE, cv2.CHAINAPPROX_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(ellipticfourierdescriptors( numpy.squeeze(cnt), order=10))

Using EFD as features

To use these as features, one can write a small wrapper function:

from pyefd import ellipticfourierdescriptors

def efd_feature(contour): coeffs = ellipticfourierdescriptors(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.

Testing


Run tests with with Pytest:

py.test tests.py

The tests include a single image from the MNIST dataset of handwritten digits ([2]) as a contour to use for testing.

Documentation


See ReadTheDocs.

References


[1]: 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, .

[2]: LeCun et al. (1999): The MNIST Dataset Of Handwritten Digits

ยฉ 2026 GitRepoTrend ยท hbldh/pyefd ยท Updated daily from GitHub