Nodes/ComfyUI-NKD-Basic-Tools/😺NKD Color Warp
ComfyUI Node

😺NKD Color Warp

Grade by grabbing the colors themselves, then export it as a .cube LUT

By Nekodificador·Created about a month ago·Updated 3 days ago· 71
😺NKD Color Warp
  • image
  • IMAGE
â—„mesh{"hue_segments": 12, "sat_rings": 6, "offsets": [[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]], "neutral": [0.0, 0.0], "hues": [29.2339, 41.0048, 52.7757, 81.27244999999999, 109.7692, 126.13225, 142.4953, 203.27365, 264.052, 278.913, 293.774, 341.50395000000003]}â–º
â—„save_lutfalseâ–º
â—„lut_namenkd_color_warpâ–º

Most color grading in ComfyUI is done blind: you nudge saturation, gamma, hue rotation, and hope. 😺NKD Color Warp takes the opposite route - it scatters your actual image across a color wheel as a web of handles, and you grade by pulling the colors themselves. Drag the handle sitting on your skin tones and the skin moves. Drag the rim of the blue spoke and every blue in the shot follows, with the neighbours giving way smoothly instead of tearing a hole next to it.

The name is honest about the mechanism: it's an OKLab polar-mesh color grade baked to a 3D LUT. Run the node once and the editor scatters the frame's own pixels on the wheel so you can see where your image actually lives before touching anything, and the preview updates live, full frame, not a thumbnail.

What you actually do

  • Drag a handle to move the colors around it. Pin moves a single handle on its own; without it the whole spoke follows. Double-click resets a handle.
  • Drag the centre for a global cast - the whole web stretches with it.
  • Hold Alt to see exactly which pixels a handle owns before you commit to a move.
  • Three wheels (RYB, RGB, OKLCh) and three radial scales (Neutrals, Linear, Sqrt) are the same edit underneath, so you pick the layout you think in. Neutrals magnifies the near-grey band, which is how you grab a subtle cast instead of a sweeping one.

Two properties worth knowing because they set it apart from a generic curves node: hue shifts don't drag brightness along with them, and colors pushed past what the screen can show are brought back in gracefully rather than clipping to a flat patch.

The inputs

The node's real controls are image and the mesh string (the JSON the editor writes - you won't hand-edit it). The two you might touch directly:

  • save_lut - when true, also writes the grade to the output folder as a .cube you can load in Resolve, Premiere or anywhere else that speaks LUTs. This is the killer feature for anyone who wants to take a grade off a ComfyUI experiment into a real NLE.
  • lut_name - the filename for that export, default nkd_color_warp.

Output is a single IMAGE, and because the whole grade is one lookup table, a 200-frame batch gets graded identically frame to frame - no flicker, no per-frame drift. That's the real reason to reach for a LUT-based node on video work.

Install and gotchas

Install via ComfyUI Manager (search ComfyUI-NKD-Basic-Tools) or:

cd ComfyUI/custom_nodes
git clone https://github.com/Nekodificador/ComfyUI-NKD-Basic-Tools

Restart after. The pack's real dependencies are onnxruntime and huggingface_hub; neither is required here. The one trap is the node being marked as an output node - it previews and stops the branch, so if you want the graded image to keep flowing into something else, be aware of where it terminates. And for a fast, deterministic LUT-style shift you don't need this much interface - post-processing docs in the community keep reminding people a gamma curve is a gamma curve. Where Color Warp earns its keep is targeted hue work and the LUT export, not simple exposure fixes.

Category😺NKD Nodes/Basic

Inputs (4)

NameTypeDefaultDescription
imageIMAGE—
meshSTRING{"hue_segments": 12, "sat_rings": 6, "offsets": [[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]], "neutral": [0.0, 0.0], "hues": [29.2339, 41.0048, 52.7757, 81.27244999999999, 109.7692, 126.13225, 142.4953, 203.27365, 264.052, 278.913, 293.774, 341.50395000000003]}—
save_lutBOOLEANfalse—
lut_nameSTRINGnkd_color_warp—

Outputs (1)

NameTypeDescription
IMAGEIMAGE—