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
v1.40 (2019-07-27)
- Merged PR #4: Vectorized contour reconstruction function
v1.3.0 (2019-06-18)
- Merged PR #2: Numpy vectorized efd
- Moved from Travis CI to Azure Pipelines
- Replaced rst with markdown
v1.2.0 (2018-06-14)
- Updated setup.py
- Updated numpy requirement
- Added Pipfile
- Ran Black on code
- Testing on 3.6
v1.1.0 (2018-06-13)
- New example for OpenCV
- Updated documentation
v1.0 (2016-04-19)
- Deemed stable enough for version 1.0 release
- Created documentation.
v0.1.2 (2016-02-29)
- Testing with pytest instead of nosetests.
- Added Coveralls use.
v0.1.1 (2016-02-17)
- Fixed MANIFEST
- Added LICENSE file that was missing.
v0.1.0 (2016-02-09)
- 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
Hashes for pyefd-1.4.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b46c5b9b7e98f40a64d34bdf03d8d5c1290f663cabf1be18a0abb6f89804d77b |
|
MD5 | cbcc1571c7dea8282492ecfc06f8c77b |
|
BLAKE2b-256 | fa69422b60191e303ea4c1dd00e08828420877b5f97c2b398eb1b03e5128bb1d |