About Color Correction Nodes

"Too Many Notes": Color Correction Tools

In general, Shake has three classes of color correctors, all of which are under the Color tab:

Atomic-level correctors. Each of these (Add, Brightness, Clamp, Lookup, etc.) does one basic mathematical function to your color, such as add, multiply, gamma, and basic lookup curve functions. Usually, these concatenate together to give you speed and accuracy, and are fast ways to manipulate your data for a wide variety of purposes. A graph that represents their behavior appears on the icons to help you understand the difference between a Clamp, a Compress and an Expand node.

Consolidated correctors. Ron suggested calling these Uber-correctors. Hmmm. Anyway, the name doesn't matter, and we don't have to decide right now, do we? These correctors (ColorCorrect, ColorMatch, ColorReplace, HueCurves) are your primary tools when you try to do things like match skin tones, shadow levels, spill suppression, etc. The atomic-level correctors can also be found in these, but are wrapped in with many other tools to provide more control.

Utility correctors. These tools are to prepare your data for other functions. Typically, these functions are ColorSpace, ColorX, Lookup, MDiv, MMult, Reorder, Set, SetAlpha, SetBGColor and VideoSafe. There is a also certain degree of programmability in ColorX and the Lookup functions, giving you the ability to enter expressions on your image.

These are general guidelines to help you understand why there are so many nodes in the Color tab. If you do an Add operation with an Add node or with ColorCorrect, you should have no difference in the result, except that Add is a bit easier to wade through, and concatenates with many other operators.

Here is a basic list of the nodes and how they are useful:

Function Explanation
Add
Raise or lower colors evenly. This is the only legal color correction in log space.
AdjustHSV Shifts the entire Hue, Saturation or Value range.
Brightness Multiplies the RGB channels by a single value.
Clamp Good for clamping off values that go above or below a desired level.
ColorCorrect A mondo-maximus titanic node of color-correctness. Does tons of things, and includes a premultiplied input flag.
ColorMatch Matches your lows, midtones and highlights to a second set of colors.
ColorReplace This is good to switch one color with another. It also makes a better Chromakeyer than the ChromaKey node. Go figure.
ColorSpace Swaps your image into a different color space. For example, RGB, HSV, CMY, etc.
ColorX You can do pixel-based mathematical expressions.
Compress Squeezes your ranges up and down, and is particularly useful for fog effects with a DepthKey mask.
ContrastLum/RGB Contrast. Use Lum to preserve your color levels.
Expand Another levels adjuster to lower or raise your low and high points.
Fade Opacity control. Same thing as using Mult with identical values in all 4 channels.
Gamma Uh, a gamma correction.
HueCurves A node to isolate and adjust an image based on its hue. Ideal for spill suppression.
Invert Makes black turn to white and vice versa. Works best on normalized images between 0 and 1.
LogLin Logarithmic color space conversion.
Lookup/HLS/HSV Lookup expressions or curve manipulation on your image. For non-pixel based lookups, it goes faster than ColorX.
LookupFile Pulls a lookup table from a file.
MDiv/MMult Used to unpremultiply and premultiply an image by its Alpha channel.
Monochrome Gives you weighted control over turning your image black and white.
Mult Multiplies your channels separately from each other.
Reorder Swaps channels around within an image. See also Layer - Copy and Layer - SwitchMatte to grab channels from other images.
Saturation Controls your saturation levels.
Set Sets a channel(s) to a constant level.
SetAlpha Used to set your Alpha level to a constant value, and crops off the infinite workspace.
SetBGColor Used to set the color outside of the DOD.
Solarize A misguided Invert function. Good for Beatles album covers.
Threshold Clips your values.
VideoSafe Clips values above video-legal ranges.

 

 

Color Space

Shake works with a color range of 0 to 1. This allows you to not have to monkey with the values when going up or down in bit depth. All operations are working in RGB Linear space. This has two implications:

 


About Color Correction Concatenation and Float Calculations

A powerful aspect of Shake's color handling is that it concatenates many color corrections. This means if you have ten concatenating Color operations in a row, it internally compiles them into one big lookup table, and executes it (internally, one node is processed, rather than ten). An important second benefit is that by not clipping your data, you preserve much more mathematical information. Therefore, concatenation preserves quality and speeds up your processing time. This is good.

In the following example with concatenation, a Brightness of 4 is placed on Vanilla, and then a second Brightness of .25 is added. In the first tree, the examples concatenate to multiply the image by 1, so no change occurs.

 

 

In the second example without concatenation, all of the values get boosted up to 1 when you multiply by 4, and since the Blur breaks the concatenation, gets dropped to a maximum value of .25 when you apply a Brightness of .25 afterwards:

 

 

This is bad.

The following nodes concatenate:

Add
Brightness
Clamp
Compress
ContrastRGB (but not ContrastLum)
DelogC
Expand
Fade
Gamma
Invert
LogC
Lookup
Mult
Set
Solarize

AdjustHSV and LookupHSV concatenate only with each other.

You can also look for the "C" symbol in the upper left corner of the icon:

You break concatenation when you mask a node. Instead, use a tree structure with KeyMix. For an example, see the last step in the Intermediate Tutorial.

To avoid broken concatenation, booste your bit depth to float with an Other - Bytes node. This means you can preserve your values above 1 or below zero. There is a processing penalty for the extra overhead, so be careful. See Overview - Bit Depth for more infomation.



Premultiplied Elements and CG Element Correction

You may see a problem on your edges when you color correct an image from a 3D render. In this example, Vanilla's contrast is dropped to .4, which quickly reveals premultiplication problems:

To clean this up, insert a MDiv before your color correction nodes (all of them) ensure you premultiply your images before you composite with a MMult node, or you can toggle on preMultiply in the Over node:

In this example, the Fade and the Add are within a MDiv and a MMult pair. The tree looks something like this.

 

The Fade node is not affected by premultiplication states because it operates on the RGBA channels evenly. In this example, it is inside the MDiv/MMult pair for concatenation with the Add node.

 



Color Corrections with the Infinite Workspace

Because the Shake engine applies effects to a potentially infinite canvas, you may get unexpected results when you color correct and pan a small elemen across a larger element. This particularly occurs when you apply an Invert, Set, or Add on your image, since they turn the previously black pixels outside of the frame to a different color.

In the following example, a fine expression of fin de siecle angst is created with a Text node. The black background color is raised to a blue with a Color - Add node:

 

 

When the image is panned image over, it is blue in the areas that were previously outside of the frame:

 

 

For a black outline, you insert a Crop node before the Pan:

 

 

You can color correct the area outside of the Domain of Definition (DOD, represented by the green box) with the SetBGColor node:

 

 

See Overview - Infinite Workspace and Overview - DOD for more information.



Using The PlotScanline to Understand Color Correction Functions

To better understand some of the Shake color-correction nodes, use the Other - PlotScanline node, or the Plotscanline Viewer Script. PlotScanline looks at a single horizontal scan line of an image and plots the brightness value of a pixel for each X location. The most basic example of this is shown below. The example starts with a source image that is a simple horizontal gradient, that varies linearly from 0 to 1. The PlotScanline resolution is set to 256x256 (for an 8-bit image):

 

The ramp goes from black (on the left) to white (on the right). This is reflected in the graph as a linear line.

When a node is inserted above the PlotScanline node, such as a ContrastLum node, you can begin to understand the node. In the ContrastLum, value is set to 1.5 and the center and softClip parameters are adjusted:

 

The affect on the ramp is reflected in the plot.

This also works for non-color correctors, and makes it an interesting analysis tool for the Filter - Grain or Warp - Randomize nodes:

 

You can also use the PlotScanline and Histogram ViewerScripts to observe image data, but these are applied directly on your image. To load the parameters, press the right mouse button on the viewer scripts and select Load Parameters.