Thin Plate Spline and Polyharmonic Spline implementation with numpy/scipy
Project description
Thin Plate Spline (TPS)
Python (NumPy & SciPy) implementation of the generalized Polyharmonic Spline interpolation (also known as Thin Plate Spline in 2D). It learns a smooth elastic mapping between two Euclidean spaces with support for:
- Arbitrary input and output dimensions
- Arbitrary spline order
k - Optional regularization
Useful for interpolation, deformation fields, and smooth non-linear regression.
For a faster implementation in PyTorch, see torch-tps.
🚀 Install
Pip
$ pip install thin-plate-spline
From source
git clone git@github.com:raphaelreme/tps.git # OR https://github.com/raphaelreme/tps.git
cd tps
pip install .
Getting started
import numpy as np
from tps import ThinPlateSpline
# Control points
X_train = np.random.normal(0, 1, (800, 3)) # 800 points in R^3
Y_train = np.random.normal(0, 1, (800, 2)) # Values for each point (800 values in R^2)
# New source points to interpolate
X_test = np.random.normal(0, 1, (300 0, 3))
# Initialize spline model (Regularization is controlled with alpha parameter)
tps = ThinPlateSpline(alpha=0.5)
# Fit spline from control points
tps.fit(X_train, Y_train)
# Interpolate new points
Y_test = tps.transform(X_test)
Examples
See the example/ folder for scripts showing:
- Interpolation in 1D, 2D, 3D
- Arbitrary input and output dimensions
- Image warping with elastic deformation
Image Warping
Example of increasing/decreasing/randomly deforming a dog's face using sparse control points.
Code: example/image_warping.py
🧠 Theory Summary
The model solves the regularized interpolation problem:
$$ min_f \sum_{i=1}^n (y_i - f(x_i))^2 + \int |\nabla^{\text{order}} f|_2^2 dx $$
With solution:
$$ f(x) = P(x) + \sum_{i=1}^n w_i G(|x - x_i|_2) $$
Where:
- $G(r)$: radial basis function (RBF) (depends on
orderand the input dimensiond) - $P(x)$: a polynomial of degree
order - 1
Default kernel (TPS):
- $G(r) = r^2 \log(r)$
General kernel:
- $G(r) = r^{(2 \text{order} - d)} \text{ if d is odd}$
- $G(r) = r^{(2\text{order} - d)} \log(r) \text{ otherwise}$
🔧 API
ThinPlateSpline(alpha=0.0, order=2, enforce_tps_kernel=False)
Creates a general polyharmonic spline interpolator (Default to TPS in 2D and natural cubic splines in 1D).
- alpha (float): Regularization strength (default 0.0)
- order (int): Spline order (default is 2 for TPS)
- enforce_tps_kernel (bool): Force TPS kernel r^2 log r, even when mathematically suboptimal
.fit(X, Y)
Fits the model to control point pairs.
- X:
(n, d)input coordinates - Y:
(n, v)target coordinates
Returns: self
.transform(X)
Applies the learned mapping to new input points.
- X:
(n', d)points
Returns: (n', v) interpolated values
License
MIT License
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 thin_plate_spline-1.2.2.tar.gz.
File metadata
- Download URL: thin_plate_spline-1.2.2.tar.gz
- Upload date:
- Size: 7.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd5631778a0bf3a58eec7673c601936b743fd9c82344239b8779b213be1a9d0b
|
|
| MD5 |
9c7c36b0e5275413609194540ee5a349
|
|
| BLAKE2b-256 |
e988458d27807c54a6a9eea8c248573267314e4d2385cb9f1bf4c77e05dfa7bd
|
File details
Details for the file thin_plate_spline-1.2.2-py3-none-any.whl.
File metadata
- Download URL: thin_plate_spline-1.2.2-py3-none-any.whl
- Upload date:
- Size: 9.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9cee92540c89ebebed860e2bb093afc8692eb5bb1c019b6fb57d74b2fde7418f
|
|
| MD5 |
a7fa716051f6a57a5775cc2b2180bd59
|
|
| BLAKE2b-256 |
c9abb840ace5889cac5f527960de068e36e05411aa26924a2da440ba33b3acf1
|