Implements support for *Panasonic GH4* colorspaces conversions and transfer
functions based on empirical data.
"""
-# from panasonic_gh4_data import *
+from panasonic_gh4_data import *
import numpy as np
from scipy import interpolate
254.96413793103449, 255.0, 255.0, 255.0, 255.0, 255.0, 255.0]
}
-def prepare_photostyle_to_linear(style, corr=None, debug_plot=False):
+def prepare_photostyle_to_linear(style, legal_range=False, debug_plot=False):
- # 18% gray card correction
+ # 18% gray card exposure offset
corr = 16.5
-
- #if not corr:
- # if style == 'V-Log':
- # corr = 16.5
- # else:
- # #corr = 17.3
- # corr = 16.5
exp = np.linspace( (corr-39)/3.0, corr/3.0, 40)
l = np.power(2, exp) * 0.18
vals = np.array(styles[style])
- vals = vals/255
+ if legal_range:
+ vals = vals/255.0 * (235-16)/255.0 + 16/255.0
+ else:
+ vals = vals/255.0
# remove visible edges at some exposure values
print 'DIR:', dir()
lut_directory,
lut_resolution_1d,
aliases,
- style=None,
+ legal_range,
+ style,
variant=''):
"""
Creates colorspace covering the conversion from GH4 picture styles
The resolution of generated 1D LUTs
aliases : list of str
Aliases for this colorspace
+ legal_range: bool
+ Add legal range shaper
style : str
Associated Photo Style
variant : str
A ColorSpace container class referencing the LUTs, matrices
and identifying information for the requested colorspace.
"""
-
- name = ('GH4-%s - GH4-%s-Gamut %s' % (transfer_function, gamut, variant)).strip()
+
+ if legal_range:
+ legal_str = 'Legal range '
+ else:
+ legal_str = ''
+
+ name = ('%sGH4-%s - GH4-%s-Gamut %s' % ( legal_str, transfer_function,
+ gamut, variant)).strip()
if transfer_function == '':
name = ('Linear - GH4-%s-Gamut %s' % (gamut, variant)).strip()
if gamut == '':
- name = 'Curve - GH4-%s' % transfer_function
+ name = 'Curve - %sGH4-%s' % (legal_str, transfer_function)
cs = ColorSpace(name)
cs.description = name
cs.aliases = aliases
cs.equality_group = ''
- cs.family = 'Input/Panasonic/GH4'
+ cs.family = 'Input/Panasonic/GH4 %s' %style
cs.is_data = False
# A linear space needs allocation variables
cs.to_reference_transforms = []
if transfer_function != '':
- f = prepare_photostyle_to_linear(transfer_function)
+
+ if legal_range:
+ lut = 'gh4_%s_legal_to_linear.spi1d' % transfer_function.lower()
+ else:
+ lut = 'gh4_%s_to_linear.spi1d' % transfer_function.lower()
+ f = prepare_photostyle_to_linear(transfer_function, legal_range)
- #data = array.array('f', '\0' * lut_resolution_1d * 4)
- #for c in range(lut_resolution_1d):
- # data[c] = v_log_to_linear(float(c) / (lut_resolution_1d - 1))
dom = np.linspace(0.0, 1.0, lut_resolution_1d)
data = f(dom)
else:
data[i] = data_max
- lut = 'gh4_%s_to_linear.spi1d' % transfer_function
genlut.write_SPI_1d(
os.path.join(lut_directory, lut),
0.0,
return cs
if variant == ('Calibrated'):
- # wb = [0.]*16
- # wb[0] = calibration_wb[style][0]
- # wb[5] = calibration_wb[style][1]
- # wb[10] = calibration_wb[style][2]
- # wb[15] = 1.0
- # cs.to_reference_transforms.append({
- # 'type': 'matrix',
- # 'matrix': wb,
- # 'direction': 'forward'})
+ wb = [0.]*16
+ wb[0] = 1/calibration_wb[style][0]
+ wb[5] = 1/calibration_wb[style][1]
+ wb[10] = 1/calibration_wb[style][2]
+ wb[15] = 1.0
+ cs.to_reference_transforms.append({
+ 'type': 'matrix',
+ 'matrix': wb,
+ 'direction': 'forward'})
+
+ # calibrat_matrices = clibration_matrices_argyll
+
cs.to_reference_transforms.append({
'type': 'matrix',
'matrix': (calibration_matrices[style][0] + [0.0] +
# colour.chromatic_adaptation_matrix_VonKries(
# colour.xy_to_XYZ(colour.ILLUMINANTS[
# 'CIE 1931 2 Degree Standard Observer']['D50']),
- # colour.xy_to_XYZ(colour.V_GAMUT_COLOURSPACE.whitepoint),
+ # colour.xy_to_XYZ(colour.ACES_2065_1_COLOURSPACE.whitepoint),
# 'CAT02')
cs.to_reference_transforms.append({
'type': 'matrix',
- 'matrix': [ 0.95991641, -0.02931741, 0.06566143, 0.0,
- -0.02119542, 0.99887268, 0.02613247, 0.0,
- 0.00137075, 0.00443593, 1.31260073, 0.0,
+ 'matrix': [ 9.71197151e-01, -2.17328334e-02, 4.59761326e-02, 0.0,
+ -1.56890302e-02, 1.00002082e+00, 1.83070138e-02, 0.0,
+ 9.70076767e-04, 3.08175255e-03, 1.21767128e+00, 0.0,
0, 0, 0, 1.0],
'direction': 'forward'})
styles_sort = styles.keys()
styles_sort.sort()
-
- for style in styles_sort:
- # Full conversion
- style_1 = create_gh4_style(
- style,
- style,
- lut_directory,
- lut_resolution_1d,
- ['gh4_%s_gh4_gamut' % style.lower().replace('-','_')])
- colorspaces.append(style_1)
-
- # Linearization Only
- style_2 = create_gh4_style(
- '',
- style,
- lut_directory,
- lut_resolution_1d,
- ['crv_gh4_%s' % style.lower().replace('-','_')])
- colorspaces.append(style_2)
-
- # Linearization and XYZ conversion
- style_3 = create_gh4_style(
- '%s' % style,
- style,
- lut_directory,
- lut_resolution_1d,
- ['gh4_%s_xyz' % style.lower().replace('-','_')],
- variant='XYZ')
- colorspaces.append(style_3)
-
- # Primaries Only
- style_4 = create_gh4_style(
- style,
- '',
- lut_directory,
- lut_resolution_1d,
- ['lin_gh4_%s_gamut' % style.lower().replace('-','_')])
- colorspaces.append(style_4)
+ for legal_range in [True, False]:
+
+ for style in styles_sort:
- if style != 'BW':
-
- # Full conversion calibrated
- style_5 = create_gh4_style(
- '%s' % style,
+ if legal_range:
+ lower_style='%s_legal' % style.lower().replace('-','_')
+ else:
+ lower_style='%s' % style.lower().replace('-','_')
+
+ # Full conversion
+ style_1 = create_gh4_style(
+ style,
style,
lut_directory,
lut_resolution_1d,
- ['gh4_%s_gh4_calibrated_gamut'% style.lower().replace('-','_')],
- style,
- variant='Calibrated')
- colorspaces.append(style_5)
+ ['gh4_%s_gh4_gamut' % lower_style],
+ legal_range=legal_range,
+ style=style)
+ colorspaces.append(style_1)
- # Primaries Only calibrated
- style_6 = create_gh4_style(
- '%s-Calibrated' % style,
+ # Linearization Only
+ style_2 = create_gh4_style(
'',
+ style,
lut_directory,
lut_resolution_1d,
- ['lin_gh4_%s_calibrated_gamut'%style.lower().replace('-','_')],
+ ['crv_gh4_%s' % lower_style],
+ legal_range=legal_range,
+ style=style)
+ colorspaces.append(style_2)
+
+ # # Linearization and XYZ conversion
+ # # only necessary for matrix calculation
+ #
+ # style_3 = create_gh4_style(
+ # style,
+ # style,
+ # lut_directory,
+ # lut_resolution_1d,
+ # ['gh4_%s_xyz' % lower_style],
+ # legal_range=legal_range,
+ # style=style,
+ # variant='XYZ')
+ # colorspaces.append(style_3)
+
+ # Primaries Only
+ style_4 = create_gh4_style(
style,
- variant='Calibrated')
- colorspaces.append(style_6)
+ '',
+ lut_directory,
+ lut_resolution_1d,
+ ['lin_gh4_%s_gamut' % lower_style],
+ legal_range=legal_range,
+ style=style
+ )
+ colorspaces.append(style_4)
+
+ if style != 'BW':
+
+ # Full conversion calibrated
+ style_5 = create_gh4_style(
+ style,
+ style,
+ lut_directory,
+ lut_resolution_1d,
+ ['gh4_%s_gh4_calibrated_gamut'% lower_style],
+ legal_range=legal_range,
+ style=style,
+ variant='Calibrated')
+ colorspaces.append(style_5)
+
+ # Primaries Only calibrated
+ style_6 = create_gh4_style(
+ style,
+ '',
+ lut_directory,
+ lut_resolution_1d,
+ ['lin_gh4_%s_calibrated_gamut'%lower_style],
+ legal_range=legal_range,
+ style=style,
+ variant='Calibrated')
+ colorspaces.append(style_6)
return colorspaces
-
-calibration_matrices = {
-
-'Cinelike-D': [[1.165504, 0.251869, -0.118313],
- [-0.369525, 1.80097, -0.096786],
- [-0.05245, 0.097669, 1.326889]],
- 'Cinelike-V': [[1.060891, 0.353566, -0.102382],
- [-0.460172, 1.927755, -0.122295],
- [-0.129601, 0.137134, 1.373328]],
- 'Custom': [[0.946141, 0.485274, -0.087787],
- [-0.555203, 2.05073, -0.100206],
- [-0.128126, 0.12821, 1.426733]],
- 'Natural': [[0.874551, 0.439286, -0.085863],
- [-0.516138, 1.916301, -0.11907],
- [-0.071172, 0.056567, 1.347203]],
- 'Portrait': [[0.660386, 0.650877, -0.060211],
- [-0.600758, 1.998228, -0.085769],
- [-0.110666, 0.124363, 1.339439]],
- 'Scenery': [[0.812315, 0.534553, -0.098869],
- [-0.542253, 1.934419, -0.071867],
- [-0.123626, 0.142352, 1.292352]],
- 'Standard': [[0.886056, 0.415669, -0.073317],
- [-0.482919, 1.84707, -0.088924],
- [-0.117718, 0.126855, 1.321097]],
- 'V-Log': [[1.127527, 0.284008, -0.033005],
- [-0.192653, 1.619262, -0.030388],
- [-0.080181, 0.057527, 1.39992]],
- 'Vivid': [[0.754924, 0.526196, -0.061668],
- [-0.503233, 1.851748, -0.065254],
- [-0.197153, 0.267533, 1.212053]]
-
-}