pngtoolskit.org
PNG and image utilities, in the browser
Say hi →

Extract a .cube LUT

before + after → 3D LUT · 17³ / 33³ / 65³ · coverage reported · nothing uploaded

You have an image you graded and no record of how. Drop the original and the graded version of the same frame and this works backwards to the mapping between them, writing it out as a .cube file you can load into Resolve, Premiere, Final Cut, Lightroom, OBS — or the LUT applier here — and apply to everything else you shot.

Drop two images: the original first, then the graded one

Same frame, same pixel dimensions — the order matters

    no files
    Ready.

    How it works

    A 3D LUT is a table: for every input colour, the colour it becomes. Two versions of the same frame give you one observation of that table per pixel — this pixel was (120, 80, 60) and is now (140, 74, 52). A million pixels is a million observations. They are dropped into a grid over the RGB cube, averaged per cell, and written out in .cube order.

    Averaging is what makes it robust: JPEG artefacts, sensor noise and dithering all disagree slightly about what a colour became, and the mean of a few thousand samples is a far better answer than any single pixel.

    The part that decides whether the LUT is any good

    A photograph does not contain every colour. It contains a thin shell of the RGB cube — the skin tones, the sky, the wall — and nothing at all in most of the rest. So most grid cells are never observed, and the tool has to decide what a colour it has never seen should become.

    Unobserved cells take the shift of the nearest observed cell rather than its value, weighted down by distance, falling back to identity when there is nothing nearby. A look is a displacement, not a destination, and copying the displacement extrapolates far better than copying the colour.

    The status line reports what percentage of the cube was genuinely observed. Read it. A LUT extracted from a single moody night shot might see 3% of the cube — it will reproduce that shot perfectly and do something arbitrary to a bright daylight frame. If the LUT has to travel, extract it from something with range in it.

    Getting a good extraction

    Grid size and strength

    33³ is the industry default and the right answer almost always: 35 937 entries, about 700 KB, smooth enough for skin tones. 17³ is a tenth the size and slightly softer in the transitions. 65³ is precise to the point of reproducing your source's noise, and only worth it when the extraction covered a lot of the cube.

    Strength blends the whole table back towards identity before writing. At 50% the LUT applies half the look. It is easier to dial it down here than to fight it in a grading application later.

    What a LUT cannot carry

    Privacy

    100% client-side. Both images are decoded and compared in your browser and the .cube is assembled there. Nothing is uploaded — which matters more than usual here, because the input is unreleased footage.