/pynterpol

Fast image interpolation in Python

Primary LanguagePythonMIT LicenseMIT

pynterpol

Fast image interpolation in Python.

Installation

python -m pip install pynterpol

Usage (example)

from pynterpol import interp_bilinear_u8
import cv2

img = cv2.imread('image.jpg')  # or any other way of reading an image as a numpy ndarray

interpolated_values = interp_bilinear_u8(img, [100.1, 100.8], [50.5, 51.2])

Performances

High performance is achieved:

  • by considering that the image to interpolate is defined on an orthogonal equally-spaced regular grid, and
  • by using Numba for the loop-intensive parts of the computation, and
  • by optimizing the algorithm implementation (avoid code cache misses for special cases, etc.)

Comparative Timings

Timings realized on an Apple MacBook Pro (Intel Core i9 8 cores, 2.3 GHz) with an gray (i.e. single channel) image of size 1904x1081x1 interpolated on a regular equally-spaced grid of size 3807x2161 that covers the entire domain of the image (that corresponds to a x2 upsampling of the input image).

method timings
SciPy RegularGridInterpolator 1614 ms
interp_bilinear_u8 (without Numba) 82980 ms (LOL)
interp_bilinear_u8 (with Numba) 65 ms (almost x25 speedup)

Reference

As of 2022-03-06, only images represented as a NumPy ndarray with uint8 as dtype are supported. Interpolated values are stored as float64. All of this is implemented with a single function: interp_bilinear_u8.

Other cases may be considered in the future:

  • bicubic interpolation or other interpolation schemes
  • image represented with different types (float, bigger uints, ...)
  • integer (or smaller floats) interpolated values

Tests

cd $PROJECT_ROOT
PYTHONPATH=./src python -m unittest tests.test_pynterpol.TestPynterpol

Note: There may be a better way than providing the PYTHONPATH variable in the command...

Distribution

python -m pip install --upgrade build twine
python -m pip build
python -m twine upload --repository testpypi dist/*