Computational photography library built on Halide.
photog takes advantage of Halide's unique strengths...
- Separation of algorithms from their mapping onto resources (scheduling).
- Auto-scheduling based on hardware features, image size, and image memory layout.
- Auto-scheduling support for many CPU platforms.
- The ability to produce extremely performant algorithms while just focusing on the algorithms!
...to produce a computational photography library that provides performant functions tuned to the hardware and images you wish to run them on.
photog will use Halide's auto-scheduling to compile versions of its functions that are tuned for the platform you are compiling on. Auto-scheduling is also dependent on image memory layout and expected dimensions. photog provides the following hooks to specify that information:
CMake Option | Environment Variable | Default | Description |
---|---|---|---|
PHOTOG_IMAGE_LAYOUT |
PHOTOG_IMAGE_LAYOUT |
planar | Valid options are planar and interleaved . Planar images are contiguous in channels while interleaved images are contiguous in pixels. Best performance is achieved with planar images. |
PHOTOG_IMAGE_WIDTH_ESTIMATE |
PHOTOG_IMAGE_WIDTH_ESTIMATE |
500 | Expected width in pixels of images to be processed. |
PHOTOG_IMAGE_HEIGHT_ESTIMATE |
PHOTOG_IMAGE_HEIGHT_ESTIMATE |
500 | Expected height in pixels of images to be processed. |
Image dimension estimates provide a guideline for scheduling and in most cases do not exclude smaller or larger images.
photog depends on the following libraries:
- Halide 17 (fetched from official repo)
- doctest 2.4 (fetched from official repo)
- libjpeg (only if building tests and not fetched automatically)
- libpng (only if building tests and not fetched automatically)
You will also need a C++17 compiler.
$ git clone https://github.com/kyleingraham/photog.git
$ cmake -DCMAKE_BUILD_TYPE=Release \
-DPHOTOG_IMAGE_LAYOUT=planar \
-DPHOTOG_IMAGE_WIDTH_ESTIMATE=500 \
-DPHOTOG_IMAGE_HEIGHT_ESTIMATE=500 \
-G "<Your choice of generator>" \
./photog/
$ cmake --build ./photog/cmake-build-release --target install
On Windows, CMake's Ninja generator will not work. Use a Visual Studio generator instead.
To use photog in your CMake project add the following command to your CMakeLists.txt
:
find_package(photog)
The following variables and targets will be made available:
Variable | Description |
---|---|
photog_VERSION |
Full version string |
photog_VERSION_MAJOR |
Major version string |
photog_VERSION_MINOR |
Minor version string |
photog_VERSION_PATCH |
Patch version string |
photog_VERSION_TWEAK |
Tweak version string |
photog_TARGET |
Halide target triple (arch-bits-os ) used to compile photog |
photog_IMAGE_LAYOUT |
Image layout (planar or interleaved ) used to complile photog |
photog_IMAGE_WIDTH_ESTIMATE |
Image width estimate in pixels used to compile photog |
photog_IMAGE_HEIGHT_ESTIMATE |
Image height estimate in pixels used to compile photog |
Target | Description |
---|---|
photog::color |
Makes available the photog/color.h header containing functions for manipulating image colors/color spaces. |
Defined in header photog/color.h
(photog::color
target):
/** Chromatically adapt RGB input from the estimated source illuminant of the
* input image to the given destination illuminant.
*
* The source illuminant is estimated using the gray-world method.
*/
void photog_chromadapt(float *input, int width, int height,
PhotogWorkingSpace working_space,
PhotogChromadaptMethod chromadapt_method,
PhotogIlluminant dest_illuminant, float *output);
/** Chromatically adapt RGB input from the given source illuminant to the given
* destination illuminant.
*
* Here both the source and destination tristimulus values must be supplied by
* the user hence the "_diy" prefix.
*/
void photog_chromadapt_diy(float *input, int width, int height,
float *source_tristimulus,
PhotogWorkingSpace working_space,
PhotogChromadaptMethod chromadapt_method,
float *dest_tristimulus, float *output);
Detailed function descriptions are available in their respective headers.
- Easy cross-compilation
- GPU support