# hbldh/pyefd

Python implementation of "Elliptic Fourier Features of a Closed Contour"
Python
Switch branches/tags
Nothing to show
hbldh Version 1.1.0
```Merged pull request #1
Updated documentation.```
Latest commit 5c4e880 Jun 13, 2018
 Failed to load latest commit information. docs .coveragerc .gitignore .travis.yml HISTORY.rst LICENSE MANIFEST.in README.rst pyefd.py requirements.txt setup.cfg setup.py tests.py

# 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:

```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:

`\$ python setup.py test`

or 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.