Python implementation of "Elliptic Fourier Features of a Closed Contour"
Project description
PyEFD
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 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)
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 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:
from pyefd import elliptic_fourier_descriptors
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.
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, http://dx.doi.org/10.1016/0146-664X(82)90034-X.
[2]: LeCun et al. (1999): The MNIST Dataset Of Handwritten Digits
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.7.0 (2026-02-25)
Added
- Bumped package version to 1.7.0 in
setup.py.
Changed
- Faster normalisation by vectorising the python loops (#22)
- faster vectorised rotation
- vectorise the global rotation too
- Fix for tests in Github Actions (#21)
- Unique normalization and small fix (#20)
- Added a unique normalization method that is invariant to size, rotation and starting point.
- Added a small fix to the existing normalization method that was not fully invariant to rotation.
- Additional test changes to handle the new normalization method.
1.6.0-2 (2023-08-23)
Changed
- Packaging and metadata fixes.
1.6.0 (2021-12-09)
Added
- Added a demo for 3D surfaces with cylindrical symmetries. (
examples/example1.py)
Fixes
- Fixes incorrectly plotted curves when no
imshowhas been called. - Fixes ugly coefficient calculation code.
1.5.1 (2021-01-22)
Added
return_transformationkeyword onelliptic_fourier_descriptorsmethod. Merged #11. Fixes #5.
Fixes
- Documentation correction. Merged #12.
Removed
- Deleted broken example script
scikit_image.py.
1.4.1 (2020-09-28)
Added
- Added
CHANGELOG.md
Changed
- Change CI from Azure Devops to Github Actions
1.4.0 (2019-07-27)
Changed
- Merged PR #4: Vectorized contour reconstruction function
1.3.0 (2019-06-18)
Changed
- Merged PR #2: Numpy vectorized efd
- Moved from Travis CI to Azure Pipelines
- Replaced rst with markdown
1.2.0 (2018-06-14)
Changed
- Updated setup.py
- Updated numpy requirement
Added
- Added Pipfile
- Ran Black on code
- Testing on 3.6
1.1.0 (2018-06-13)
Added
- New example for OpenCV
- Updated documentation
1.0.0 (2016-04-19)
Changed
- Deemed stable enough for version 1.0 release
Added
- Created documentation.
0.1.2 (2016-02-29)
Changed
- Testing with pytest instead of nosetests.
Added
- Added Coveralls use.
0.1.1 (2016-02-17)
Fixed
- Fixed MANIFEST
Added
- Added LICENSE file that was missing.
0.1.0 (2016-02-09)
Added
- Initial release
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyefd-1.7.0.tar.gz.
File metadata
- Download URL: pyefd-1.7.0.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6346ef09a8ac4adca23841881e33f17fb5c0b75e24cf710cccd3004efc3a76ce
|
|
| MD5 |
c57d70f112e619f8aa33a18fbd1de9f4
|
|
| BLAKE2b-256 |
91938f3d5c706bdd542cf5c52b4c3b20f10c56cd653e5ea84076ada1f37b2f76
|
File details
Details for the file pyefd-1.7.0-py2.py3-none-any.whl.
File metadata
- Download URL: pyefd-1.7.0-py2.py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6bfbe2a7dae24dd5fa76b87817c1ec64459047f9c082ec060a1fee77c27dfcf
|
|
| MD5 |
b63ddbaf804109d520cd6fffa3969694
|
|
| BLAKE2b-256 |
4a3051a40ad8dafe193b2ccedb9d5128d2a69a7f9121af50db61beae85ee2a7a
|