Colour - HDRI - Examples: Variance Minimization Light Probe Sampling

Through this example, lights will be extracted from radiance images using Viriyothai (2009) variance minimization light probe sampling algorithm.

Note: The current implementation is not entirely vectorised nor optimised thus slow.


In [1]:
from __future__ import division

import os
from pprint import pprint

import colour
from colour.plotting import *

from colour_hdri import (
    EXAMPLES_RESOURCES_DIRECTORY,
    light_probe_sampling_variance_minimization_Viriyothai2009)
from colour_hdri.sampling.variance_minimization import (
    find_regions_variance_minimization_Viriyothai2009,
    highlight_regions_variance_minimization)

RESOURCES_DIRECTORY = os.path.join(EXAMPLES_RESOURCES_DIRECTORY,
                                   'radiance')

colour.utilities.filter_warnings()

colour.utilities.describe_environment();


===============================================================================
*                                                                             *
*   Interpreter :                                                             *
*       python : 3.7.4 (default, Sep  7 2019, 18:27:02)                       *
*                [Clang 10.0.1 (clang-1001.0.46.4)]                           *
*                                                                             *
*   colour-science.org :                                                      *
*       colour : 0.3.14                                                       *
*       colour-hdri : v0.1.5-60-g9648d86                                      *
*                                                                             *
*   Runtime :                                                                 *
*       imageio : 2.6.1                                                       *
*       matplotlib : 3.0.3                                                    *
*       numpy : 1.17.3                                                        *
*       scipy : 1.3.1                                                         *
*       six : 1.12.0                                                          *
*       recordclass : 0.12.0.1                                                *
*                                                                             *
===============================================================================

In [2]:
colour_style();

Regions


In [3]:
HDRI_IMAGE1 = colour.read_image(os.path.join(RESOURCES_DIRECTORY, 'Dots.exr'))

HDRI_IMAGE2 = colour.read_image(os.path.join(RESOURCES_DIRECTORY, 'Grace_Cathedral.hdr'))

Y1 = colour.RGB_luminance(
        HDRI_IMAGE1,
        colour.models.sRGB_COLOURSPACE.primaries,
        colour.models.sRGB_COLOURSPACE.whitepoint)
regions1 = find_regions_variance_minimization_Viriyothai2009(Y1)

Y2 = colour.RGB_luminance(
        HDRI_IMAGE2,
        colour.models.sRGB_COLOURSPACE.primaries,
    colour.models.sRGB_COLOURSPACE.whitepoint)
regions2 = find_regions_variance_minimization_Viriyothai2009(Y2)

plot_image(colour.cctf_encoding(
            highlight_regions_variance_minimization(
                HDRI_IMAGE1, regions1)), {'text': 'Dots'})

plot_image(colour.cctf_encoding(
            highlight_regions_variance_minimization(
                HDRI_IMAGE2, regions2)), {'test': 'Grace Cathedral'});


Lights


In [4]:
print('Dots - 16 Lights')
pprint(light_probe_sampling_variance_minimization_Viriyothai2009(
           HDRI_IMAGE1, 16))

print('\n')

print('Grace Cathedral - 32 Lights')
pprint(light_probe_sampling_variance_minimization_Viriyothai2009(
           HDRI_IMAGE2, 32))


Dots - 16 Lights
[Light_Specification(uv=array([ 0.16015625,  0.11328125]), colour=array([  40.65992016,  226.11660475,  266.78098774]), index=array([29, 41])),
 Light_Specification(uv=array([ 0.15625   ,  0.32421875]), colour=array([  30.73776919,  130.37145448,  161.1077342 ]), index=array([83, 40])),
 Light_Specification(uv=array([ 0.4296875 ,  0.11328125]), colour=array([  98.10281688,  201.29676312,  299.4054991 ]), index=array([ 29, 110])),
 Light_Specification(uv=array([ 0.4296875,  0.3203125]), colour=array([  74.89445847,  117.00525796,  191.89859456]), index=array([ 82, 110])),
 Light_Specification(uv=array([ 0.16796875,  0.484375  ]), colour=array([  42.24291545,  125.58142895,  167.82099468]), index=array([124,  43])),
 Light_Specification(uv=array([ 0.43359375,  0.484375  ]), colour=array([  90.15780473,  102.82409275,  192.97436064]), index=array([124, 111])),
 Light_Specification(uv=array([ 0.18359375,  0.7421875 ]), colour=array([  82.1725328 ,   97.55175847,  179.72394174]), index=array([190,  47])),
 Light_Specification(uv=array([ 0.44140625,  0.75390625]), colour=array([ 152.10083479,   72.06310755,  224.16233468]), index=array([193, 113])),
 Light_Specification(uv=array([ 0.6484375,  0.1171875]), colour=array([ 128.44782221,  173.29928458,  301.74819988]), index=array([ 30, 166])),
 Light_Specification(uv=array([ 0.6484375,  0.3515625]), colour=array([ 105.67531514,  104.05130512,  209.73328489]), index=array([ 90, 166])),
 Light_Specification(uv=array([ 0.875    ,  0.1171875]), colour=array([ 196.73262107,  196.1698609 ,  392.89716852]), index=array([ 30, 224])),
 Light_Specification(uv=array([ 0.875   ,  0.359375]), colour=array([ 154.23001331,  111.56532115,  265.79564852]), index=array([ 92, 224])),
 Light_Specification(uv=array([ 0.640625,  0.546875]), colour=array([ 120.04539376,   81.22123903,  201.26542896]), index=array([140, 164])),
 Light_Specification(uv=array([ 0.875   ,  0.546875]), colour=array([ 191.57947493,   95.21154106,  286.79548484]), index=array([140, 224])),
 Light_Specification(uv=array([ 0.6484375,  0.796875 ]), colour=array([ 168.29435712,   45.0929932 ,  213.38641733]), index=array([204, 166])),
 Light_Specification(uv=array([ 0.875     ,  0.80078125]), colour=array([ 253.65272349,   50.30476046,  303.96245855]), index=array([205, 224]))]


Grace Cathedral - 32 Lights
[Light_Specification(uv=array([ 0.016,  0.196]), colour=array([ 1737.94824219,  1340.39746094,  2991.25292969]), index=array([49,  8])),
 Light_Specification(uv=array([ 0.06,  0.22]), colour=array([  4932.79736328,   4677.75732422,  10582.44873047]), index=array([55, 30])),
 Light_Specification(uv=array([ 0.1  ,  0.232]), colour=array([ 3534.47290039,  2863.27978516,  4447.44165039]), index=array([58, 50])),
 Light_Specification(uv=array([ 0.136,  0.232]), colour=array([ 2676.72607422,  1950.38256836,  2374.09399414]), index=array([58, 68])),
 Light_Specification(uv=array([ 0.06 ,  0.412]), colour=array([ 1578.71356201,   656.52148438,   349.82165527]), index=array([103,  30])),
 Light_Specification(uv=array([ 0.096,  0.58 ]), colour=array([ 2525.62277222,  1030.9206543 ,   255.17736816]), index=array([145,  48])),
 Light_Specification(uv=array([ 0.166,  0.46 ]), colour=array([ 7535.69287109,  1403.37402344,   147.95703125]), index=array([115,  83])),
 Light_Specification(uv=array([ 0.148,  0.568]), colour=array([ 5707.48193359,  2316.76879883,   361.78613281]), index=array([142,  74])),
 Light_Specification(uv=array([ 0.23 ,  0.216]), colour=array([ 2287.88525391,  1615.57080078,  1768.48022461]), index=array([ 54, 115])),
 Light_Specification(uv=array([ 0.29,  0.22]), colour=array([ 1560.13549805,  1172.08056641,  1573.23413086]), index=array([ 55, 145])),
 Light_Specification(uv=array([ 0.216,  0.404]), colour=array([ 2815.78063965,   541.85778809,   125.26000977]), index=array([101, 108])),
 Light_Specification(uv=array([ 0.204,  0.56 ]), colour=array([ 2315.05340576,   543.97195435,   172.16485596]), index=array([140, 102])),
 Light_Specification(uv=array([ 0.354,  0.156]), colour=array([ 1845.1875    ,  1565.63842773,  4279.65063477]), index=array([ 39, 177])),
 Light_Specification(uv=array([ 0.352,  0.408]), colour=array([ 596.07579041,  208.2091217 ,  197.91851807]), index=array([102, 176])),
 Light_Specification(uv=array([ 0.42,  0.16]), colour=array([ 1218.31236267,   929.49072266,  3361.23632812]), index=array([ 40, 210])),
 Light_Specification(uv=array([ 0.486,  0.252]), colour=array([ 3078.96134949,  2133.23191833,   654.46007538]), index=array([ 63, 243])),
 Light_Specification(uv=array([ 0.526,  0.22 ]), colour=array([ 1123.97314453,   560.58001709,   289.73376465]), index=array([ 55, 263])),
 Light_Specification(uv=array([ 0.662,  0.32 ]), colour=array([ 749.84887695,  560.63555908,  543.73748779]), index=array([ 80, 331])),
 Light_Specification(uv=array([ 0.75 ,  0.068]), colour=array([ 901.30358887,  481.98468018,  281.90234375]), index=array([ 17, 375])),
 Light_Specification(uv=array([ 0.73 ,  0.356]), colour=array([ 2038.26794434,  1649.7635498 ,  2391.29882812]), index=array([ 89, 365])),
 Light_Specification(uv=array([ 0.674,  0.488]), colour=array([ 2275.2411499 ,  1326.58935547,  1336.63885498]), index=array([122, 337])),
 Light_Specification(uv=array([ 0.722,  0.468]), colour=array([ 2868.58074951,  1637.19049072,  2038.51556396]), index=array([117, 361])),
 Light_Specification(uv=array([ 0.578,  0.724]), colour=array([ 2656.15031433,   808.28439331,   307.60688782]), index=array([181, 289])),
 Light_Specification(uv=array([ 0.704,  0.748]), colour=array([ 1094.64331055,   339.49755859,   341.39300537]), index=array([187, 352])),
 Light_Specification(uv=array([ 0.838,  0.008]), colour=array([ 1953.83154297,  1155.81616211,   506.91870117]), index=array([  2, 419])),
 Light_Specification(uv=array([ 0.812,  0.212]), colour=array([ 1922.27514648,  1415.78076172,  1340.80102539]), index=array([ 53, 406])),
 Light_Specification(uv=array([ 0.81 ,  0.296]), colour=array([ 974.0456543 ,  608.62518311,  513.59460449]), index=array([ 74, 405])),
 Light_Specification(uv=array([ 0.834,  0.704]), colour=array([ 531.43688965,  190.7701416 ,  213.03271484]), index=array([176, 417])),
 Light_Specification(uv=array([ 0.896,  0.084]), colour=array([ 1919.8815918 ,  1310.39550781,  1571.7980957 ]), index=array([ 21, 448])),
 Light_Specification(uv=array([ 0.912,  0.468]), colour=array([ 460.70410156,  190.3770752 ,  195.14227295]), index=array([117, 456])),
 Light_Specification(uv=array([ 0.976,  0.176]), colour=array([  9488.08105469,   8823.12353516,  15636.40576172]), index=array([ 44, 488])),
 Light_Specification(uv=array([ 0.974,  0.3  ]), colour=array([ 1237.21871948,   762.7505188 ,  1389.14990234]), index=array([ 75, 487]))]