Skip to content

Instantly share code, notes, and snippets.

@jedypod
Last active March 20, 2024 14:52
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save jedypod/798b365ea64e8121999e7036ae7e0217 to your computer and use it in GitHub Desktop.
Save jedypod/798b365ea64e8121999e7036ae7e0217 to your computer and use it in GitHub Desktop.
Calibrate Macbeth: a Nuke tool to calibrate an image containing a Macbeth ColorChecker chart by calculating a ColorMatrix node that conforms it to a specified colorspace gamut.

CalibrateMacbeth

A Nuke tool to calibrate an image containing a Macbeth ColorChecker chart by calculating a ColorMatrix node that conforms it to a specified colorspace gamut. CalibrateMacbeth Screenshot

About

Calibrate an image containing a macbeth colorchecker chart to match the gamut of the given colorspace. Requires the numpy python module. Make sure it is importable in nuke. You can enable "use system python path" if you have it installed in a system directory (currently linux only).

Usage

  • Align cornerpin to match patches to macbeth chart
  • Set sample size to get a good sample on source macbeth chart.
  • Choose target colorspace.
  • Disable calibrate chromaticities only if you want to adjust exposure as well.
  • Click calculate
  • Evaluate results: Output in compare mode to get a better view.
  • Toggle bypass matrix to compare before/after.
  • Click Create MTX to create a new colormatrix node
  • Or click Set Selected to set an existing colormatrix node.

Information

Based on Marco Meyer's mmColorTarget tool. www.marcomeyer-vfx.de

Changes

  • Rebuild and simplify.
  • Add option for ColorChecker2014 in addition to ColorChecker2005.
  • calibrate to known gamuts only.
  • Add option to not change exposure when calculating calibration.
  • Created by Jed Smith - gist.github.com/jedypod
set cut_paste_input [stack 0]
version 14.0 v2
push $cut_paste_input
Group {
name CalibrateMacbeth
tile_color 0x87aee7ff
selected true
xpos 197
ypos -199
addUserKnob {20 CalibrateMacbeth}
addUserKnob {26 macbeth_position_label l "@b;Macbeth Position" T ""}
addUserKnob {7 sample_size l "sample size" R 5 100}
sample_size 50
addUserKnob {12 TL}
TL {820 1070}
addUserKnob {12 TR -STARTLINE}
TR {1155 1105}
addUserKnob {12 BL}
BL {828 756}
addUserKnob {12 BR -STARTLINE}
BR {1174 782}
addUserKnob {6 output_compare l "output in compare mode" t "inverts the cornerpin for a good view of the macbeth chart for comparing src and dst" +STARTLINE}
addUserKnob {6 disable_overlay l "disable overlay" t "Removes the destination colorchecker values overlayed over the source." +STARTLINE}
addUserKnob {26 ""}
addUserKnob {41 gamut T MacbethColorChecker.gamut}
addUserKnob {6 chroma_only l "calibrate chromaticities only" t "Do not change the brightness of the input image after calibration." +STARTLINE}
chroma_only true
addUserKnob {22 calculate l Calculate T "from __future__ import print_function\nimport nuke\n\ndef colorsample(node, pos, size):\n # sample rgb pixel value\n # :param: node - node object to sample\n # :param: pos - list containing x and y position as float values\n # :param: size - box size to average in sample\n return \[node.sample(chan, pos\[0], pos\[1], size, size) for chan in \['red', 'green', 'blue']]\n\n\ndef calc_mtx():\n # calculate colormatrix to match src macbeth chart to dst macbeth chart\n node = nuke.thisNode()\n\n # make sure numpy is importable\n if node\['specify_python_path'].getValue():\n import sys\n sys.path.insert(0, node\['python_path'].getValue())\n try:\n import numpy as np\n except ImportError as e:\n nuke.message('numpy required. make sure it is installed correctly and importable.\\n\{0\}'.format(e))\n return\n\n size = node\['sample_size'].getValue()\n chroma_only = node\['chroma_only'].getValue()\n \n node.begin()\n src = nuke.toNode('Normalize')\n dst = nuke.toNode('macbeth_points')\n norm_node = nuke.toNode('Normalize')\n\n node\['reset'].execute()\n\n # If chroma_only, normalize colorchecker to dst grey before sampling\n if chroma_only:\n src_grey = colorsample(src, dst\['p44'].getValue(), size)\n dst_grey = colorsample(dst, dst\['p44'].getValue(), size)\n \n # with rec709 luminance weighting\n src_lum = (src_grey\[0]*0.2126 + src_grey\[1]*0.7152 + src_grey\[2]*0.0722)\n dst_lum = (dst_grey\[0]*0.2126 + dst_grey\[1]*0.7152 + dst_grey\[2]*0.0722)\n norm_node\['src'].setValue(src_lum)\n norm_node\['dst'].setValue(dst_lum)\n\n print('source grey: \{0\} | \{1\}\\ndst grey: \{2\} | lum: \{3\}'.format(src_grey, src_lum, dst_grey, dst_lum))\n \n src_patches = list()\n dst_patches = list()\n points = \['p11', 'p12', 'p13', 'p14', 'p15', 'p16', 'p21', 'p22', 'p23', 'p24', 'p25', \n 'p26', 'p31', 'p32', 'p33', 'p34', 'p35', 'p36', 'p41', 'p42', 'p43', 'p44', 'p45', 'p46']\n\n for point in points:\n src_value = colorsample(src, dst\[point].getValue(), size)\n dst_value = colorsample(dst, dst\[point].getValue(), size)\n\n src_patches.append(src_value)\n dst_patches.append(dst_value)\n\n print('source: \{0\}'.format(src_value))\n print('destination: \{0\}'.format(dst_value))\n\n # Calculate multivariate Rinear Regression to fit source matrix to target matrix\n # https://en.wikipedia.org/wiki/General_linear_model\n # https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html\n # \n # https://github.com/colour-science/colour-nuke/blob/master/colour_nuke/notebooks/mmColorTarget_dependencies.ipynb\n # Source chromaticities are based on XRite ColorChecker 2005 values as described here: \n # https://github.com/colour-science/colour/blob/cdbffd063b0c44bb32d752b01647137871434851/colour/characterisation/dataset/colour_checkers/chromaticity_coordinates.py#L114-L114\n # http://www.babelcolor.com/colorchecker.htm\n # http://www.babelcolor.com/colorchecker-2.htm#CCP2_beforeVSafter\n # https://github.com/colour-science/colour-nuke/blob/master/colour_nuke/scripts/colour_rendition_chart.nk\n\n np_matrix = np.transpose(np.linalg.lstsq(np.array(src_patches), np.array(dst_patches))\[0])\n matrix = np.ravel(np_matrix).tolist()\n node\['matrix'].setValue(matrix)\n nuke.root().begin()\n\nif __name__=='__main__':\n calc_mtx()" +STARTLINE}
addUserKnob {26 ""}
addUserKnob {26 output_matrix_label l "@b;Output Matrix" T ""}
addUserKnob {41 matrix T ColorMatrix.matrix}
addUserKnob {6 bypass_mtx l "bypass matrix" t "disable the matrix - for comparing before/after" +STARTLINE}
addUserKnob {22 reset l Reset -STARTLINE T "n = nuke.thisNode()\nn\['matrix'].setValue(\[1,0,0,0,1,0,0,0,1])\nn.begin()\nnorm = nuke.toNode('Normalize')\nnorm\['src'].setValue(0.18)\nnorm\['dst'].setValue(0.18)"}
addUserKnob {22 create_mtx l "Create MTX" t "Create a ColorMatrix node." T "import os\nnode = nuke.thisNode()\nnode.begin()\nnorm = nuke.toNode('Normalize')\n\nnuke.root().begin()\n_ = \[n.setSelected(False) for n in nuke.allNodes(recurseGroups=True)]\n\ncolormatrix = nuke.createNode('ColorMatrix')\ncolormatrix.setXYpos(node.xpos()-120, node.ypos())\ncolormatrix\['matrix'].setValue(node\['matrix'].getValue())\ntopnode = nuke.toNode(nuke.tcl('full_name \[topnode \{0\}]'.format(node.fullName())))\nif 'file' in topnode.knobs():\n\tfilename = os.path.basename(topnode\['file'].getValue())\nelse:\n\tfilename = topnode.name()\nif node\['chroma_only'].getValue():\n colormatrix\['label'].setValue('\{0\} \\ncalibrate: \{1\}'.format(filename, node\['colorspace'].value()))\n # Create mult as well for optional exposure adjustment\n exp = nuke.createNode('Multiply')\n exp\['channels'].setValue('rgb')\n exp.setXYpos(colormatrix.xpos(), colormatrix.ypos() + 60)\n exp\['value'].setValue(norm\['value'].getValue())\n colormatrix.setSelected(True)\nelse:\n colormatrix\['label'].setValue('\{0\} \\ncalibrate w/ exposure: \{1\}'.format(filename, node\['colorspace'].value()))" +STARTLINE}
addUserKnob {22 set_selected l "Set Selected" t "Set matrix knob on selected node." -STARTLINE T "node = nuke.thisNode()\nnuke.root().begin()\n\ncolormatrix = nuke.selectedNode()\nif 'matrix' in colormatrix.knobs():\n colormatrix\['matrix'].setValue(node\['matrix'].getValue())\n"}
addUserKnob {20 info l Info}
addUserKnob {26 info_label l "" +STARTLINE T "<b>About</b><br/>\nCalibrate an image containing a macbeth colorchecker chart<br/>\nto match the gamut of the given colorspace.<br/>\nRequires the numpy python module. Make sure it is importable<br/>\nin nuke. You can enter a custom python path to search for numpy.<br/>\nThis is the directory to the site-packages folder that contains the numpy module.<br/><br/>\nNote that this technique is not a magic solution. <br/>\nIn order for the calibration to be accurate, the illuminant in the scene<br/>\nneeds to be CIE Illuminant D65. The more the spectral power distribution <br/>\nof the light varies from this, the more error will be in the result.\n<br/><br/><b>Usage</b><br/>\n- Align cornerpin to match patches to macbeth chart <br/>\n- Set sample size to get a good sample on source macbeth chart. <br/>\n- Choose target colorspace. <br/>\n- Disable calibrate chromaticities only if you want to adjust exposure as well.<br/>\n- Click calculate<br/>\n- Evaluate results: Output in compare mode to get a better view.<br/>\n- Toggle bypass matrix to compare before/after.<br/>\n- Click Create MTX to create a new colormatrix node<br/>\n- Or click Set Selected to set an existing colormatrix node.<br/>\n\n<br/><br/><b>Information</b><br/>\nBased on Marco Meyer's mmColorTarget tool.<br/>\nwww.marcomeyer-vfx.de<br/>\n<br/>\nRebuild and simplify. <br/>Calibrate to known gamuts only. <br/>\nAdd option to not change exposure.<br/>\nCreated by Jed Smith - <a href=\"gist.github.com/jedypod\">gist.github.com/jedypod</a>"}
addUserKnob {26 ""}
addUserKnob {6 specify_python_path l "" t "search specified python path for numpy module" -STARTLINE}
specify_python_path true
addUserKnob {1 python_path l "python path" t "enter the directory of the site-packages folder that contains the numpy module" -STARTLINE}
python_path /opt/sidefx/hfs19.0.455/python/lib/python3.7/site-packages
}
Constant {
inputs 0
format "512 512 0 0 512 512 1 square_512"
name Constant1
xpos -810
ypos -1186
postage_stamp false
}
Reformat {
type "to box"
box_width {{parent.MacbethColorChecker.patch_resolution}}
box_height {{parent.MacbethColorChecker.patch_resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat2
xpos -810
ypos -1164
}
Radial {
replace true
area {{center.x-(box_size.w/2)} {center.y-(box_size.h/2*input.pixel_aspect)} {center.x+(box_size.w/2)} {center.y+(box_size.h/2*input.pixel_aspect)}}
softness 0
name RadialSize
xpos -810
ypos -1138
addUserKnob {20 Size}
addUserKnob {12 center}
center {{width/2} {height/2}}
addUserKnob {14 box_size R 0 100}
box_size {{sample_size}}
}
set N147ca240 [stack 0]
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
push $N147ca240
ContactSheet {
inputs 24
width {{rint(width*6+gap*7)}}
height {{rint(height*4+gap*5)}}
rows 4
columns 6
startframe 1
endframe 1
name ContactSheet1
xpos -810
ypos -1112
}
Dot {
name Dot7
label " "
note_font "Helvetica Bold"
note_font_size 24
note_font_color 0xa5a5a501
xpos -776
ypos -1086
}
Group {
inputs 0
name MacbethColorChecker
tile_color 0xffbf00ff
label "\[value gamut]"
xpos -590
ypos -1191
postage_stamp true
addUserKnob {20 MacbethColorChecker_tab l MacbethColorChecker}
addUserKnob {41 gamut T XYZD65ToGamut.gamut}
addUserKnob {3 patch_resolution l "patch resolution"}
patch_resolution 128
addUserKnob {7 gap R 10 50}
gap 10
}
Group {
inputs 0
name ColorChecker24_After_November_2014
xpos 1170
ypos -417
postage_stamp true
addUserKnob {20 colorchecker_tab l "ColorChecker24 - After November 2014"}
addUserKnob {3 patch_resolution}
patch_resolution {{parent.patch_resolution}}
}
Group {
inputs 0
name bluish_green
xpos 622
ypos -321
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.30451114 0.4143554688 0.344352688 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "bluish green"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 6
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name blue_flower
xpos 512
ypos -321
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.2419823988 0.2287175998 0.3282104382 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "blue flower"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 5
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name foliage
xpos 402
ypos -321
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.1114392339 0.1346792679 0.05239320311 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob foliage
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 4
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name blue_sky
xpos 292
ypos -321
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.1652470004 0.1785519348 0.2546024121 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "blue sky"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 3
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name light_skin
xpos 180
ypos -321
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.3811104477 0.336202304 0.1852590702 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "light skin"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 2
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 63
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
xpos 262
ypos 135
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name dark_skin
xpos 70
ypos -321
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.1136398927 0.09832436105 0.047793811 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "dark skin"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 1
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 290
ypos 63
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
xpos 290
ypos 158
}
Output {
name Output
xpos 290
ypos 230
}
end_group
Group {
inputs 0
name orange_yellow
xpos 622
ypos -201
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.4769723742 0.4293377578 0.06005041429 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "orange yellow"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 12
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name yellow_green
xpos 512
ypos -201
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.3427379502 0.4331759409 0.08330791241 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "yellow green"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 11
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name purple
xpos 401
ypos -201
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.08353888545 0.06276662955 0.1042075686 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob purple
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 10
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name moderate_red
xpos 290
ypos -201
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.2915036416 0.188999956 0.09736350318 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "moderate red"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 9
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name purplish_blue
xpos 180
ypos -201
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.1200518326 0.1091090233 0.2874447494 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "purplish blue"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 8
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name orange
xpos 74
ypos -201
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.4073691399 0.3126416159 0.05130591012 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob orange
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 7
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name cyan
xpos 622
ypos -81
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.1247966941 0.180609913 0.2913392383 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob cyan
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 18
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name magenta
xpos 512
ypos -81
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.299122798 0.1895114577 0.2213469194 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob magenta
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 17
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name yellow
xpos 399
ypos -81
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.5888922356 0.5992976803 0.07077420003 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob yellow
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 16
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
xpos 262
ypos 125
}
Output {
name Output
xpos 262
ypos 182
}
end_group
Group {
inputs 0
name red
xpos 292
ypos -81
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.2143728424 0.127800835 0.03868150726 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob red
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 15
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name green
xpos 182
ypos -81
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.1413517689 0.2233437582 0.07287461742 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob green
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 14
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name blue
xpos 72
ypos -81
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.06809095613 0.05596214063 0.2077405936 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob blue
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 13
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name black_2
xpos 623
ypos 39
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.03042544265 0.03151319431 0.02656724434 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "black 2 (1.5 D)"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 24
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
xpos 262
ypos 125
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name neutral_3
xpos 512
ypos 39
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.08448968042 0.08817234828 0.07391630753 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "neutral 3.5 (1.05 D)"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 23
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name neutral_5
xpos 403
ypos 39
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.1835495863 0.1906228754 0.1566717383 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "neutral 5 (.70 D)"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 22
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name neutral_6
xpos 292
ypos 39
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.3495921991 0.3648652066 0.3013565492 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "neutral 6.5 (.44 D)"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 21
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name neutral_8
xpos 179
ypos 39
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.5665335579 0.5899709702 0.4828473821 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "neutral 8 (.23 D)"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 20
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
}
Output {
name Output
xpos 262
ypos 173
}
end_group
Group {
inputs 0
name white_9
xpos 70
ypos 39
postage_stamp true
addUserKnob {20 sample_Tab l Sample}
addUserKnob {19 colour_RGBA_Color_Knob l Colour}
colour_RGBA_Color_Knob {0.8436985288 0.8806903203 0.6936778752 1}
addUserKnob {6 colour_RGBA_Color_Knob_panelDropped l "panel dropped state" -STARTLINE +HIDDEN}
addUserKnob {1 name_Text_Knob l Name}
name_Text_Knob "white 9.5 (.05 D)"
addUserKnob {1 index_Text_Knob l Index}
index_Text_Knob 19
addUserKnob {3 resolution}
resolution {{parent.patch_resolution}}
}
Constant {
inputs 0
color {{parent.colour_RGBA_Color_Knob.r} {parent.colour_RGBA_Color_Knob.g} {parent.colour_RGBA_Color_Knob.b} {parent.colour_RGBA_Color_Knob.a}}
format "512 512 0 0 512 512 1 square_512"
name Constant
xpos 262
ypos 53
}
Reformat {
type "to box"
box_width {{parent.resolution}}
box_height {{parent.resolution}}
box_fixed true
filter impulse
black_outside true
name Reformat1
xpos 262
ypos 134
}
Output {
name Output
xpos 262
ypos 173
}
end_group
ContactSheet {
inputs 24
width {{"rint(parent.patch_resolution * 6 + gap * 7)"}}
height {{"rint(parent.patch_resolution * 4 + gap * 5)"}}
rows 4
columns 6
startframe 1
endframe 1
name ContactSheet
xpos 620
ypos 206
}
Output {
name Output
xpos 620
ypos 326
}
end_group
ColorMatrix {
matrix {
{0.9598786831 -0.0293238461 0.06578332186}
{-0.02120095305 0.9988456964 0.02618063986}
{0.001372883562 0.004445131868 1.313236713}
}
name ColorMatrix
label "D50 to D65 - CAT02"
note_font Helvetica
xpos 1170
ypos -327
}
Group {
name XYZD65ToGamut
tile_color 0x429940ff
xpos 1170
ypos -274
cached true
addUserKnob {20 InputGamut_to_XYZ_tab l InputGamut_to_XYZ}
addUserKnob {4 gamut M {ACES ACEScg P3D65 Rec.2020 Rec.709 "Arri WideGamut 3" "Arri WideGamut 4" "Red WideGamut RGB" "Sony SGamut3" "Sony SGamut3.Cine" "Panasonic V-Gamut" "Blackmagic Wide Gamut" "Filmlight E-Gamut" "DaVinci Wide Gamut"}}
gamut ACEScg
addUserKnob {41 matrix T ColorMatrix.matrix}
addUserKnob {41 invert -STARTLINE T ColorMatrix.invert}
}
Input {
inputs 0
name Input
xpos 290
ypos -610
}
Dot {
name Dot1
xpos 324
ypos -546
}
set N1421d3c0 [stack 0]
ColorMatrix {
matrix {
{{"SwitchGamut.input\[value SwitchGamut.which].matrix"} {"SwitchGamut.input\[value SwitchGamut.which].matrix"} {"SwitchGamut.input\[value SwitchGamut.which].matrix"}}
{{"SwitchGamut.input\[value SwitchGamut.which].matrix"} {"SwitchGamut.input\[value SwitchGamut.which].matrix"} {"SwitchGamut.input\[value SwitchGamut.which].matrix"}}
{{"SwitchGamut.input\[value SwitchGamut.which].matrix"} {"SwitchGamut.input\[value SwitchGamut.which].matrix"} {"SwitchGamut.input\[value SwitchGamut.which].matrix"}}
}
name ColorMatrix
xpos 290
ypos -370
}
Output {
name Output
xpos 290
ypos -250
}
push $N1421d3c0
Dot {
name Dot391
label " XYZ D65 to *RGB -- CAT02"
xpos 434
ypos -546
}
set N14235070 [stack 0]
ColorMatrix {
matrix {
{1.516672042 -0.2814780479 -0.1469636332}
{-0.4649171012 1.251423776 0.1748846089}
{0.06484904707 0.1091393437 0.7614146215}
}
name ColorMatrix4
label "XYZ D65 to DaVinci Wide Gamut"
xpos 1830
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.52505277 -0.3159135109 -0.1226582646}
{-0.50915256 1.333327409 0.1382843651}
{0.09571534531 0.05089744385 0.7879557703}
}
name ColorMatrix3
label "XYZ D65 to Filmlight E-Gamut"
xpos 1720
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.866357736 -0.5183905088 -0.2346067165}
{-0.6003298545 1.378119951 0.1767281098}
{0.002451481064 0.08638160934 0.8367677153}
}
name ColorMatrix15
label "XYZ D65 to Blackmagic Wide Gamut"
xpos 1610
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.589011774 -0.3132044845 -0.1809648515}
{-0.5340529104 1.396011433 0.102457671}
{0.01117944884 0.003194128241 0.9055353563}
}
name ColorMatrix14
label "XYZ D65 to Panasonic V-Gamut"
xpos 1500
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.846778969 -0.525986123 -0.2105452114}
{-0.4441532629 1.259442903 0.1493999729}
{0.0408554212 0.01564088931 0.8682072487}
}
name ColorMatrix13
label "XYZ D65 to Sony SGamut3.Cine"
xpos 1390
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.507399899 -0.2458221374 -0.1716116808}
{-0.5181517271 1.355391241 0.1258786682}
{0.01551169816 -0.007872771427 0.9119163656}
}
name ColorMatrix12
label "XYZ D65 to Sony SGamut3"
xpos 1280
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.41280648 -0.177523201 -0.151770732}
{-0.4862032769 1.290696427 0.1574006147}
{-0.03713901085 0.2863759998 0.6876797789}
}
name ColorMatrix11
label "XYZ D65 to RED Wide Gamut RGB"
xpos 1170
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.509215472 -0.2505973452 -0.1688114753}
{-0.4915454517 1.361245546 0.09728294201}
{0 0 0.9182249512}
}
name ColorMatrix10
label "XYZ D65 to Arri Wide Gamut 4"
xpos 1060
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.789065551 -0.4825338638 -0.2000757929}
{-0.6398486599 1.396399957 0.1944322918}
{-0.04153154585 0.08233537355 0.8788684803}
}
name ColorMatrix9
label "XYZ D65 to Arri Wide Gamut"
xpos 950
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{3.240969942 -1.537383178 -0.4986107603}
{-0.9692436363 1.875967502 0.04155505741}
{0.0556300797 -0.2039769589 1.056971514}
}
name ColorMatrix8
label "XYZ D65 to Rec709"
xpos 840
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.716651188 -0.3556707838 -0.2533662814}
{-0.6666843518 1.616481237 0.01576854581}
{0.01763985745 -0.04277061326 0.9421031212}
}
name ColorMatrix7
label "XYZ D65 to Rec2020"
xpos 730
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{2.493496912 -0.9313836179 -0.4027107845}
{-0.8294889696 1.76266406 0.02362468584}
{0.03584583024 -0.07617238927 0.956884524}
}
name ColorMatrix6
label "XYZ D65 to P3D65"
xpos 620
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.658854308 -0.3118569754 -0.2431560071}
{-0.6622832871 1.612199571 0.0158591266}
{0.01148056646 -0.009236324924 0.9166865134}
}
name ColorMatrix19
label "XYZ D65 to ACES AP1"
xpos 510
ypos -471
}
push $N14235070
ColorMatrix {
matrix {
{1.062366107 0.008406953654 -0.01665578963}
{-0.4939413716 1.371109525 0.09031658697}
{-0.0003346685774 -0.001037458272 0.9194696473}
}
name ColorMatrix5
label "XYZ D65 to ACES AP0"
xpos 400
ypos -471
}
Switch {
inputs 14
which {{gamut}}
name SwitchGamut
xpos 400
ypos -372
}
end_group
Grid {
number {6 4}
size {{parent.gap}}
color 0
name Grid1
xpos 1170
ypos -225
}
Output {
name Output
xpos 1170
ypos -58
}
StickyNote {
inputs 0
name StickyNote1
tile_color 0x767676ff
gl_color 0x767676ff
label "<pre>\n<font size=6><b>Macbeth ColorChecker Classic (After 2014)</b><font>\nhttps://github.com/colour-science/colour/blob/master/colour/characterisation/datasets/colour_checkers/chromaticity_coordinates.py#L336"
note_font_size 14
xpos 1330
ypos -438
}
end_group
Copy {
inputs 2
from0 rgba.alpha
to0 mask.a
name Copy1
xpos -590
ypos -1096
}
Dot {
name Dot3
label " "
xpos -556
ypos -1038
}
set Ne266980 [stack 0]
Shuffle {
in2 mask
alpha red2
name Shuffle1
label "\[value in] -> \[value out]"
xpos -590
ypos -976
}
Premult {
name Premult1
xpos -590
ypos -922
}
set Ne27cbc0 [stack 0]
Input {
inputs 0
name Input
selected true
xpos 70
ypos -1330
}
ColorMatrix {
matrix {
{1 0 0}
{0 1 0}
{0 0 1}
}
name ColorMatrix
xpos 70
ypos -1282
disable {{parent.bypass_mtx}}
}
Dot {
name Dot1
label " "
xpos 104
ypos -1206
}
set Ne296a20 [stack 0]
Dot {
name Dot5
label " "
xpos -116
ypos -1206
}
CornerPin2D {
to1 {0 0}
to2 {{to3.x} 0}
to3 {{parent.MacbethColorChecker.width} {parent.MacbethColorChecker.height}}
to4 {0 {to3.y}}
invert false
shutteroffset centred
from1 {{parent.BL} {parent.BL}}
from2 {{parent.BR} {parent.BR}}
from3 {{parent.TR} {parent.TR}}
from4 {{parent.TL} {parent.TL}}
name CornerPin2D1
xpos -150
ypos -1162
}
Reformat {
type "to box"
box_width {{input.to3.x}}
box_height {{input.to3.y}}
box_fixed true
resize none
center false
black_outside true
name ReformatBox
xpos -150
ypos -1114
}
Dot {
name Dot6
label " "
xpos -116
ypos -1038
}
set Nfb40e40 [stack 0]
Merge2 {
inputs 2
bbox B
name Merge2
xpos -150
ypos -922
disable {{parent.disable_overlay}}
}
Dot {
name Dot2
label " "
xpos -116
ypos -678
}
push $Ne27cbc0
CornerPin2D {
to1 {{parent.BL} {parent.BL}}
to2 {{parent.BR} {parent.BR}}
to3 {{parent.TR} {parent.TR}}
to4 {{parent.TL} {parent.TL}}
invert false
shutteroffset centred
from1 {0 0}
from2 {{input.width} 0}
from3 {{input.width} {input.height}}
from4 {0 {input.height}}
name CornerPin2D2
xpos -590
ypos -850
}
Reformat {
type "to box"
box_width {{parent.Input.width}}
box_height {{parent.Input.height}}
box_fixed true
box_pixel_aspect {{parent.Input.pixel_aspect}}
resize none
center false
name Reformat1
xpos -590
ypos -802
}
Dot {
name Dot4
label " "
xpos -556
ypos -750
}
push $Ne296a20
Merge2 {
inputs 2
bbox B
name Merge1
xpos 70
ypos -754
disable {{parent.disable_overlay}}
}
Switch {
inputs 2
which {{parent.output_compare}}
name Compare
xpos 70
ypos -682
}
Output {
name Output
xpos 70
ypos -562
}
push $Nfb40e40
Multiply {
channels rgb
value {{dst/src}}
name Normalize
xpos -260
ypos -1042
addUserKnob {20 Normalize}
addUserKnob {7 src R 0 4}
addUserKnob {7 dst R 0 4}
dst 0.1906265074
}
push $Ne266980
NoOp {
name macbeth_points
xpos -480
ypos -1042
addUserKnob {20 macbeth_points}
addUserKnob {12 p11}
p11 {{"(input.width / 6) * 1 - (input.width / 12)"} {"(input.height / 4) * 4 - (input.height / 4 / 2)"}}
addUserKnob {12 p12}
p12 {{"(input.width / 6) * 2 - (input.width / 12)"} {"(input.height / 4) * 4 - (input.height / 4 / 2)"}}
addUserKnob {12 p13}
p13 {{"(input.width / 6) * 3 - (input.width / 12)"} {"(input.height / 4) * 4 - (input.height / 4 / 2)"}}
addUserKnob {12 p14}
p14 {{"(input.width / 6) * 4 - (input.width / 12)"} {"(input.height / 4) * 4 - (input.height / 4 / 2)"}}
addUserKnob {12 p15}
p15 {{"(input.width / 6) * 5 - (input.width / 12)"} {"(input.height / 4) * 4 - (input.height / 4 / 2)"}}
addUserKnob {12 p16}
p16 {{"(input.width / 6) * 6 - (input.width / 12)"} {"(input.height / 4) * 4 - (input.height / 4 / 2)"}}
addUserKnob {26 ""}
addUserKnob {12 p21}
p21 {{"(input.width / 6) * 1 - (input.width / 12)"} {"(input.height / 4) * 3 - (input.height / 4 / 2)"}}
addUserKnob {12 p22}
p22 {{"(input.width / 6) * 2 - (input.width / 12)"} {"(input.height / 4) * 3 - (input.height / 4 / 2)"}}
addUserKnob {12 p23}
p23 {{"(input.width / 6) * 3 - (input.width / 12)"} {"(input.height / 4) * 3 - (input.height / 4 / 2)"}}
addUserKnob {12 p24}
p24 {{"(input.width / 6) * 4 - (input.width / 12)"} {"(input.height / 4) * 3 - (input.height / 4 / 2)"}}
addUserKnob {12 p25}
p25 {{"(input.width / 6) * 5 - (input.width / 12)"} {"(input.height / 4) * 3 - (input.height / 4 / 2)"}}
addUserKnob {12 p26}
p26 {{"(input.width / 6) * 6 - (input.width / 12)"} {"(input.height / 4) * 3 - (input.height / 4 / 2)"}}
addUserKnob {26 ""}
addUserKnob {12 p31}
p31 {{"(input.width / 6) * 1 - (input.width / 12)"} {"(input.height / 4) * 2 - (input.height / 4 / 2)"}}
addUserKnob {12 p32}
p32 {{"(input.width / 6) * 2 - (input.width / 12)"} {"(input.height / 4) * 2 - (input.height / 4 / 2)"}}
addUserKnob {12 p33}
p33 {{"(input.width / 6) * 3 - (input.width / 12)"} {"(input.height / 4) * 2 - (input.height / 4 / 2)"}}
addUserKnob {12 p34}
p34 {{"(input.width / 6) * 4 - (input.width / 12)"} {"(input.height / 4) * 2 - (input.height / 4 / 2)"}}
addUserKnob {12 p35}
p35 {{"(input.width / 6) * 5 - (input.width / 12)"} {"(input.height / 4) * 2 - (input.height / 4 / 2)"}}
addUserKnob {12 p36}
p36 {{"(input.width / 6) * 6 - (input.width / 12)"} {"(input.height / 4) * 2 - (input.height / 4 / 2)"}}
addUserKnob {26 ""}
addUserKnob {12 p41}
p41 {{"(input.width / 6) * 1 - (input.width / 12)"} {"(input.height / 4) * 1 - (input.height / 4 / 2)"}}
addUserKnob {12 p42}
p42 {{"(input.width / 6) * 2 - (input.width / 12)"} {"(input.height / 4) * 1 - (input.height / 4 / 2)"}}
addUserKnob {12 p43}
p43 {{"(input.width / 6) * 3 - (input.width / 12)"} {"(input.height / 4) * 1 - (input.height / 4 / 2)"}}
addUserKnob {12 p44}
p44 {{"(input.width / 6) * 4 - (input.width / 12)"} {"(input.height / 4) * 1 - (input.height / 4 / 2)"}}
addUserKnob {12 p45}
p45 {{"(input.width / 6) * 5 - (input.width / 12)"} {"(input.height / 4) * 1 - (input.height / 4 / 2)"}}
addUserKnob {12 p46}
p46 {{"(input.width / 6) * 6 - (input.width / 12)"} {"(input.height / 4) * 1 - (input.height / 4 / 2)"}}
}
end_group
@emartin8907
Copy link

hi this looks awesome but how do i make numpy importable to nuke? cant find anything on the internet about this at all :( i dont know anything about python at all.

@andralling
Copy link

hi this looks awesome but how do i make numpy importable to nuke? cant find anything on the internet about this at all :( i dont know anything about python at all.

Hi Emartin8907
you need to copy the numpy directory into the directory Nuke11\pythonextensions\site-packages
I dont think it works if you copy from the python\lib\site-packages as numpy is compiled in windows with different binaries.
So copy the Houdini's numpy .... Program files\Side Effects Software\Houdini 18.0.348\python27\lib\site-packages\numpy
into Nuke11\pythonextensions\site-packages
(if you dont have Houdini, install the trial version and grab numpy from there)

@jedypod
Copy link
Author

jedypod commented Apr 23, 2021

Hey all,
Sorry for missing your message before @emartin8907.

I've pushed an update to the tool which might help. It's a custom python path knob. If you enter the path to the site-packages folder containing your numpy module, theoretically it will work.

Hope it helps!

@jedypod
Copy link
Author

jedypod commented Dec 12, 2021

Did a small update for python3 compatibility...

@davidvfx07
Copy link

This is great! I can use it in Nuke Indie! One bug is that the Create Matrix button gives a NoneType error. I think the variable is being set to nuke.createNode() which is giving a NoneType output for some reason.

@davidvfx07
Copy link

davidvfx07 commented Feb 22, 2023

Is there a way to also use the color chart to estimate the gamma of a given frame? What's most important to me is matching the color gamma, as that is very important to the integrity of an aces workflow.

@jedypod
Copy link
Author

jedypod commented Mar 5, 2023

Hey @PinPointPing! Good to know about Nuke Indie support / behavior.

As for linearity: It is absolutely critical that the input image data is scene-linear. If it's not all bets are off.

If you are working with gamma-encoded or even worse display-referred footage, I would first take a look at how you can avoid this situation and work with scene-linear images instead. Otherwise your results will most likely be very poor.

@tiltX
Copy link

tiltX commented Apr 1, 2023

Thanks for this great tool, @jedypod! I've just had a show that was using REDWideGamutRGB and noticed that this particular colorspace is missing even though the large stickynote inside makes mention of it. It wasn't a problem to convert everything to a supported gamut but in case you are still developing this tool, REDWideGamutRGB might be a useful addition.

@jedypod
Copy link
Author

jedypod commented Apr 1, 2023

@tiltX Thanks, it's been on my list forever to scrap that massive list of useless colorspaces with something more reasonable and modern. (When's the last time you used Ekta Space PS 5?) I just pushed an update which hopefully improves the situation.

@rustyippolito
Copy link

I have nuke 14.0v3 and i am assigning numpy path from Houdini 19.50403-Py3.9 but when i hit calibrate, i get the following error in nuke:

module 'numpy' has no attribute 'transpose'

Can you point me to what i might be doing wrong?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment