Skip to main content

Estimate scale, rotation, and translation between two sets of 2D points e.g. for multi-touch gestures or calibration

Project description

A Python lib to estimate scale, rotation, and translation between two sets of 2D points. Applicable for example in cases where one wants to move objects by multiple fingers or where a large number of points from an eye tracker device are wanted to be corrected based on a few calibration points. In general, you can apply nudged in any situation where you want to move a number of points based on a few sample points.

Example transformation

Mathematically speaking, nudged is an optimal least squares estimator for affine transformation matrices with uniform scaling, rotation, and translation and without reflection or shearing. The estimation has time complexity of O(n) that consists of 6n+22 multiplications and 11n+19 additions, where n is the cardinality (size) of the point sets. In other words, nudged solves an affine 2D to 2D point set registration problem in linear time.

Available also in JavaScript.

Install

$ pip install nudged

Usage

You have lists of points for the domain and range of the tranformation function to be estimated:

dom = [[0,0], [2,0], [ 1,2]]
ran  = [[1,1], [1,3], [-1,2]]

Compute optimal tranformation based on the points:

trans = nudged.estimate(dom, ran);

Apply the transformation to other points:

trans.transform([2,2])
# [-1,3]

To explore the estimated transformation, you can:

trans.get_matrix()
# [[0,-1, 1],
#  [1, 0, 1],
#  [0, 0, 1]]

trans.get_rotation()
# 1.5707... = π / 2   (radians)

trans.get_scale()
# 1.0

trans.get_translation()
# [1, 1]

API

nudged.estimate(domain, range)

Parameters

  • domain: list of [x,y] points

  • range: list of [x,y] points

The domain and range should have equal length. Different lengths are allowed but additional points in the longer list are ignored.

Return a new nudged.Transform(…) instance.

nudged.estimate_error(transform, domain, range)

Compute mean squared distance between the point pairs of the domain after the given transformation and the range. If the transform was estimated with the given domain and range, then the result is the mean squared error (MSE) of the estimation.

Parameters

  • transform: a nudged.Transform instance

  • domain: list of [x,y] points

  • range: list of [x,y] points

Return a float, the mean squared distance between the range and transformed domain point pairs.

Usage example:

dom = [[0, 0], [1, 1], [2, 2]]
ran = [[0,-1], [1, 2], [2,-1]]
t = nudged.estimate(dom, ran)
mse = nudged.estimate_error(t, dom, ran)
# mse == 2.0

nudged.version

Contains the module version string equal to the version in setup.py.

nudged.Transform(s, r, tx, ty)

An instance returned by the nudged.estimate(…).

In addition to the methods below, it has attributes s, r, tx, ty that define the augmented transformation matrix:

|s  -r  tx|
|r   s  ty|
|0   0   1|

nudged.Transform#transform(points)

Return an list of transformed points or single point if only a point was given. For example:

trans.transform([1,1])           # [2,2]
trans.transform([[1,1]])         # [[2,2]]
trans.transform([[1,1], [2,3]])  # [[2,2], [3,4]]

nudged.Transform#get_matrix()

Return an 3x3 augmented transformation matrix in the following list format:

[[s,-r, tx],
 [r, s, ty],
 [0, 0,  1]]

nudged.Transform#get_rotation()

Return rotation in radians.

nudged.Transform#get_scale()

Return scaling multiplier, e.g. 0.333 for a threefold shrink.

nudged.Transform#get_translation()

Return [tx, ty] where tx and ty denotes movement along x-axis and y-axis accordingly.

For developers

Follow instructions to install pyenv <http://sqa.stackexchange.com/a/15257/14918>`_ and then either run quick tests:

$ python2.7 setup.py test

or comprehensive tests for multiple Python versions in tox.ini:

$ eval "$(pyenv init -)"
$ pyenv rehash
$ tox

Versioning

Semantic Versioning 2.0.0

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nudged-0.3.1.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

nudged-0.3.1-py2.py3-none-any.whl (8.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file nudged-0.3.1.tar.gz.

File metadata

  • Download URL: nudged-0.3.1.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for nudged-0.3.1.tar.gz
Algorithm Hash digest
SHA256 7f576dcaab3c559171185de067c45469846a3c6cd00792e85bb4b603bb72bec5
MD5 6f5feaea0927da774cc459ae17c2f065
BLAKE2b-256 77f10aab175d8666c72627235dadd3955683c96aea954e8d2bdbeb3030cec077

See more details on using hashes here.

File details

Details for the file nudged-0.3.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for nudged-0.3.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 9029a7b8c27e3e5af9d7e12f5f55b51b5d51799a72aee3e53408ce68e607ec63
MD5 1a1f80b144baab0177b132a37f5eb1cd
BLAKE2b-256 5a731ac27893feda9773ed1c2d26521d0d5e67fe30df7acad81ef0142945297a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page