Lycon
A minimal and fast image library for Python and C++.
Lycon is a small subset of optimized image operations derived from OpenCV.
Current set of features include:
Reading and writing JPEG and PNG images
Fast SIMD optimized image resizing
Zero-copy interop with NumPy whenever possible
Tested on:
Linux (Ubuntu 14.04) with Python2.7.6 and 3.5.2.
macOS (Sierra, 10.12) with Python 2.7.11 and 3.5.1.
Install
pip install lycon
Native extension dependencies:
CMake 2.8 or newer
C++ toolchain
LibJPEG
LibPNG
Ubuntu
Single-line command for installing all dependencies:
sudo apt-get install cmake build-essential libjpeg-dev libpng-dev
Anaconda
When working within an Anaconda Python distribution, it is recommended to use the latest cmake version (3.6 or newer). Older versions can lead to a mismatch between the libpng and libjpeg headers used to build Lycon (usually the system headers), and the linked library (which may be preempted by the Anaconda-scoped version). To install the latest cmake version:
conda install cmake
Example
import lycon
# Load an image as a numpy array
img = lycon.load('mittens.jpg')
# Resize the image using bicubic interpolation
resized = lycon.resize(img, width=256, height=512, interpolation=lycon.Interpolation.CUBIC)
# Crop the image (like any regular numpy array)
cropped = resized[:100, :200]
# Save the image
lycon.save('cropped-mittens.png', cropped)
Limitations
Compared to other image processing libraries (OpenCV, pillow, scikit-image), Lycon offers a very limited set of operations. Intended usages include data loaders for deep learning, mass image resizing, etc.
Advantages over OpenCV
Drastically smaller (at the cost of drastically fewer features)
Python module installable via pip
Images use the more common RGB ordering (vs OpenCV’s BGR)
However, if you already have OpenCV installed, Lycon’s advantages are minimal.
Advantages over PIL(low)
Faster
First-class NumPy support
Full support for floating point images
Advantages over Scikit-Image
Drastically faster
Benchmarks
The table below lists execution time (in seconds), averaged across 10 runs
The multiplier next to the time is the relative slowdown compared to Lycon
Operation
Lycon
OpenCV
PIL
Scikit-Image
Upsample: Nearest
0.1944
0.1948 (1x)
2.1342 (11x)
30.8982 (158.9x)
Upsample: Bilinear
0.4852
0.4940 (1x)
7.2940 (15x)
45.9095 (94.6x)
Upsample: Bicubic
1.8162
1.8182 (1x)
8.9589 (4.9x)
120.1645 (66.1x)
Upsample: Lanczos
4.5641
4.5714 (1x)
10.7517 (2.3x)
Upsample: Area
0.4801
0.4931 (1x)
Downsample: Nearest
0.0183
0.0181 (1x)
0.4379 (24.2x)
3.6101 (199.9x)
Downsample: Bilinear
0.0258
0.0257 (1x)
1.3122 (51x)
4.8487 (188.4x)
Downsample: Bicubic
0.1324
0.1329 (1x)
1.8153 (13.7x)
9.4905 (71.6x)
Downsample: Lanczos
0.3317
0.3328 (1x)
2.4058 (7.2x)
Downsample: Area
0.0258
0.0259 (1x)
Read: JPG
0.3409
0.5085 (1.5x)
1.4081 (4.1x)
1.4628 (4.3x)
Read: PNG
1.2114
1.3245 (1.1x)
1.8274 (1.5x)
1.8674 (1.5x)
Write: JPG
0.4760
0.6046 (1.3x)
2.3823 (5x)
5.0159 (10.5x)
Write: PNG
2.1421
2.2370 (1x)
9.0580 (4.2x)
11.6060 (5.4x)
Blank cells indicate that the operation is not supported by the library
All operations performed on a 16k (15360 x 8640) RGB image
Tests performed on Ubuntu 14.04 running on an Intel Core i7 (Skylake)
OpenCV 3.2+ (master: a85b4b5), Pillow 4.0.0, skimage 0.12.3, Python 2.7.3
OpenCV can potentially achieve better performance with GPU implementations and proprietary libraries like Intel IPP
License
All code derived from the OpenCV project is licensed under the 3-clause BSD License.
All Lycon-specific modifications are licensed under the MIT license.
See LICENSE for further details.