The hottest HDR imaging library!
Welcome to the PICCANTE documentation.


PICCANTE is a C++11 image processing library aimed to provide structures and functionalities for enabling both High Dynamic Range (HDR) and standard imaging.


To use PICCANTE simply set the wanted options and include "piccante.hpp"

The options are set with a #define and are:

Note that when using Eigen types and standard containters, if you do not align containters, a good practice is to enable the following #define:


PICCANTE is a modular library with different modules. The main classes are pic::Image and pic::Histogram.


The main class of this module is pic::Filter. This is a base class for managing a filter; it provides mechanisms for multi-threading, memory allocation, and so on. Typically, a filter in PICCANTE can have multiple pic::Image images as input, imgIn, and a single output, imgOut. Many image filters are implemented in PICCANTE susch as: linear filters (e.g. Gaussian, gradient based, DCT, etc.), non-linear filters (e.g. bilateral, anisotropic diffusion, guided, median, etc.), and image transforms (e.g. warping).


This module contains high-level imaging functionalities such as Laplacian/Gaussian pyramids, a simple Poisson solver, SuperPixels (SLIC), a simple gradient based demosacing method, a color to gray algorithm, etc.


This module provides classes and methods for editing, processing and converting colors. For example, the class pic::Color3 provides a basic type for three color components representations. This can be useful for some applications such as a 3D renderer.

Input and Output

This module provides functions for reading and writing images natively in different file formats such as:

The module provides an interface for OpenEXR, but it requires the linking with the OpenEXR library (please have a look at the official website).


This module provides classic objective metrics for measuring differences in images. Several metrics are provided such as: PSNR, mPSNR (for HDR images), RMSE, logRMSE (for HDR images), maximum error, relative error, etc.

Point Samplers

This module provides structures and functions for generating points' set in n-dimensions using different distributions such as: random, stratified random, regular, Poisson-disk, etc. Points generated with such distributions may be useful for filtering algorithms.

Image Samplers

This module provides methods for sampling 2D and 3D images using different filters such as: nearest neighbors filter, bilinear filter, bi-cubic filter, Gaussian filter, etc.

Tone Mapping

This module provides tone mapping operators (TMOs) for reducing the dynamic range in HDR images. Several TMOs are present such as: Ward Histogram Adjustment, Reinhard Photographic Tone Reproduction Operator, Lischinski Improved Photographic Tone Reproduction Operator, Drago TMO, Banterle Hybrid TMO, etc.

Features and Matching

This module provides classes and functions for extracting 2D features from 2D images, and matching the extracted features. This may be useful for aligning images for different tasks such as: HDR exposures stack alignment, generation of panoramas, etc. Different features can be extracted and matched:

Computer Vision

This module provides classes and functions for Computer Vision tasks such as checker board extraction, computation of the Essential matrix, computation of the Fundamental Matrix, estimation of homographies, and triangulation.


This module provides GPU acceleration for some functionalities of PICCANTE through OpenGL. In particular, the module uses OpenGL 4.0 Core profile only, and it is independent from OpenGL loading extensions libraries; users are free to use their favourite ones. Note that when using OpenGL and QT together; QT will load OpenGL functions by default in order to avoid clashes. In the examples (folder “examples”), we generated .h and .c files for loading OpenGL extensions using glLoadGen. This is meant for learning purposes only; we do not want to force users to use it; e.g. GLEW or other libraries can be employed instead.


This module provides different utilies for manipulating strings, arrays, indexed arrays, math functions, 2D arrays, vectors, etc.