Scanning film in ADX16

Hey all,

I’ve got some questions regarding the ADX16/ ADX10 standard - can’t seem to find a ton of practical information around.

How would someone go about ensuring a scan of negative film is done to ADX spec? Is this something that’s possible to do at home by processing raw linear scan files a certain way, or is it much more involved technically with specific hardware measurements?

Could it be a case of taking that raw scan and using nuke to solve a 3x3 matrix from say, a macbeth chart, from the neg scan to ADX primaries and gamma?

Second part of my questions - I’ve come across an old OCIO repository here hosted by Alex Fry and had some questions about some of the LUTs.

For example - adx_cdd_to_cid.spimtx, adx_exp_to_aces.spimtx, adx_cid_to_rle

What are the CDD, CID, EXP and RLE terms/colorspaces in question? I’ve not come across what they represent and was curious.


1 Like

These terms come from the ADX-to-ACES transform.
CDD = Channel Dependent Density
CID = Channel Independent Density
RLE = relative log exposure
EXP = relative exposure

Thanks, Scott!

Is there any more information on those processes - how and why they are used?

I’m interested in profiling arbitrary film negative scans to ACES for VFX work, for example. So just curious about what is needed to get the scanned data into place.


This is a huge topic.

The ADX to ACES transforms are film unbuilds. They are effectively inverse negative film models that predict the exposure values that are required to produce a given set of densities on a film negative.

This is done by measuring the channel dependent densities using a stock independent density metric such as Academy Printing Density (APD). APD is helpful because it effectively allows us to measure the density of the negative as seen by the print film. With a metric like APD we will get roughly the same density values for a given object regardless of the film stock, where if we measured the Status M values we would get wildly different densities for stocks that have different dysets.

In order to appropriately convert these channel dependent densities to log exposure values we need to convert the channel dependent densities, or integral densities, to channel independent densities, or analytical densities. Integral densities are the densities of each dye layer of the film as measured through all the layers where analytical densities are the densities of each dye layer independent of the others. Sort of like if you were able to strip apart the film and measure each layer one at a time.

After we convert the channel dependent densities to channel independent densities we use a channel independent density DLogE curve to convert the densities to Log Exposure values. The DLogE curve is applied to channel independent densities to discount the interimage effects and unwanted dye absorptions that would be present if you were to apply the DLogE curve to the integral densities.

The exposure values are then converted to colorimetry in the ACES ADX to ACES conversions.

Obviously this is all stock specific, but we leverage the concept of a “universal unbuild” in ACES. With stock specific unbuilds we are trying to model each film carefully to accurately predict the exposure values that created the densities on that specific film. With a universal unbuild we are unbuilding all films with one transform. The results for any particular film are somewhat inaccurate, but the resulting log exposure values deviate from some canonical norm in a way that represents the look imparted by the stock being unbuilt. This effectively allows us to leave the look of each stock in the ACES values and not normalize that out as would have been done with a stock specific unbuild. One is always welcome to use their own transforms as the ACES RICD provides an unambiguous anchor for what the correct ACES values are.

Finally, the reason there’s no ACES to ADX transform in the ACES 1.0 package is that this transform isn’t simply the inverse of the unbuild. The problem is that in film spectral aliasing occurs when scene spectra interact with the film spectral sensitives. Since ACES values are already tristimulus RGB values the spectral aliasing has already occurred, and in some cases it’s very different than what would have happened in the film. Long story short, using the inverse of the ADX to ACES transform to go from ACES to ADX produces good results in some cases but very bad results in others.


@Alexander_Forsythe I realised that I totally forgot to acknowledge your fantastic reply back in August - Thanks again for taking the time to break the ADX unbuild down!