Making a camera profile with DCamProf

Introduction

Lumariver Profile Designer, my profile designer software based on DCamProf technology. An alternative to the command-line tool DCamProf if you prefer to use a graphical user interface.

In this article I will cover how to make a high-end general-purpose camera profile that can replace the bundled profile in your favorite raw converter. The software used is my own open-source tool DCamProf. You will also need the open-source color management system Argyll, as DCamProf relies on that to get measurement data. We'll also be using gnuplot to plot data, and RawTherapee to do evaluations and curve designs, also free cross-platform software.

When using RawTherapee it's important that you use a very recent version, as older versions may not work as described herein. (At the time of writing the version is 4.2.276.)

Camera profiling is a quite difficult aspect of color management. It's harder to understand, and more compromises have to be made than in printer or screen profiling. You will also need to do more subjective evaluations and design "by eye". This article is meant as a complement to DCamProf's reference documentation, and step-by-step guides you through the process of making a camera profile.

If you're already familiar with the software you can jump directly to the workflow summaries section to get a refresher of which commands to run through the workflow.

If you think all this looks complicated and you just want to make a good profile with the least possible effort, then jump straight to the easy way out which covers a basic DNG profile. There's also the easy way for Capture One users.

Nowadays there's an even easier way though: getting the Lumariver Profile Designer which uses core technology from DCamProf and has a graphical user interface, and has its own user manual with guides and tutorials. I decided to make that software commercial though, so if you want to make camera profiles for free, DCamProf is still the way to go. Even if you do use Lumariver Profile Designer you may find this article to be an interesting read as it describes many general concepts about camera profiling that is not directly linked to DCamProf.

Why make your own camera profile?

DCamProf profile on the left, Adobe Camera Raw to the right. In this example no subjective look has been devised for the DCamProf profile, it just has a curve applied using DCamProf's neutral tone reproduction operator which serves to maintain a realistic color appearance.

At first glance differences may look subtle (it's easier to see differences if you do A/B switching than viewing side by side), and indeed camera profiling often makes more subtle differences than printer profiling or display profiling. This image was picked to make it a bit clearer as the more saturated colors you have the larger the differences. If we look closer there are quite some differences. For example, Adobe's skin tones and reds are too saturated and too yellow, and the bright fluorescent color is too desaturated.

It's easy to motivate why you should calibrate your screen or printer (so you get the expected output when you print), but why would you make an own camera profile? In some cases the answer is simple, maybe your favorite raw converter simply doesn't have a profile for your camera, or a very bad one. In the more common case there is already a bundled camera profile in the raw converter just as good as any other of the bundled profiles. You are probably already aware of that these bundled profiles aren't accurate but instead provide "canned looks". However, many think that as they tune the color to taste in the raw converter, to create a look-and-feel rather than accuracy, you still wouldn't need to make your own camera profile.

However, some of us are "control freaks" and quite skilled at post-processing, we simply want to be in control of color from start to end. I primarily make landscape images, and indeed the colors in my final images are not "accurate", but tuned for a personal look and a feel that suits the subject. However I feel that to keep my artistic integrity intact I want to be in as good control as possible of how I modify colors, and not have someone else's look pre-applied.

Additionally, it's not that certain that the manufacturer's subjective colors are that good. It's much like what you find in manufacturer screen calibrations or printer profiles, they are often made to impress laymen and therefore contain various exaggerations which doesn't make sense to the more advanced user.

While DCamProf is good at making accurate neutral profiles, it also have features to apply subjective adjustments on top, so you can if you wish make your own "landscape" or "portrait" profile with suitable pre-applied adjustments if you prefer that type of workflow. In that case you will gain the convenience of using pre-applied looks while maintaining the control — it will still be your own color.

Another reason, that perhaps is the most important, is to avoid lock-in. You may easily become dependent on a specific look. If you always start your post-processing with a distinctive look provided by the manufacturer it may become hard for you to work with any other camera and achieve the results you want. By always making your own profile from scratch different models and brands of cameras can be made to look almost exactly the same, and thus your own personal look will not be as dependent on the camera system you are using.

Photographers rarely make their own profiles, and due to that there's many myths about camera color. One of the most common is that most of the look sits in the camera hardware, while in actuality it sits 90% in the profile. I recently changed camera brand, and would I use the profiles provided by the manufacturer the look of my work would change quite dramatically, but as I've developed a style that starts with a my own custom neutral profile I could keep my own look, and that's valuable to me.

Finally, profiling your camera is a fun project for the technically interested photographer. Making your own profiles increases understanding of how cameras and colors work which is interesting, and knowing your equipment well is always a gain.

So I think there are good reasons to make your own camera profile, but there are also good reasons of convenience to stay with the canned looks you get from your favorite raw converter with your favorite camera brand. The choice is yours.

Why use DCamProf?

DCamProf is a complex command line tool and is as such not particularly easy to use, so why not use any of the more user-friendly GUI-based software packages?

The most obvious reason is that DCamProf is free, and that may be enough for you but as the author of this software I can say that's not why I made it. If you want to make a high-end general-purpose profile all commercial profile maker software packages lack several important features, so I made DCamProf to cover this gap. In the tutorial presented here there are a number of specific features worth mentioning:

I have not personally tested through all the current profile makers available on the consumer market but all I've found fall short already in the feature list, and many produce very simplistic lookup tables with obvious limitations in correction and look design. In DCamProf, the ability to make high quality profiles is never traded against ease-of-use, while most commercial profile makers are quite the opposite in that regard. When reading this tutorial camera profiling may seem complex and cumbersome, but well, it have to be if you want to get a high-end result. If you're patient you can make it through.

It's worth mentioning that the tools the big name manufacturers of cameras and raw software use are in-house custom-made and are thus not available to consumers.

Making a general-purpose dual-illuminant DNG profile

Overview

This tutorial is by purpose quite elaborate to show many aspects of camera profiling and using DCamProf to make profiles. We're going to make a dual-illuminant DNG profile, to get a general-purpose profile that works in a wide range of lighting conditions.

We'll use two targets, one standard color-checker and one glossy self-printed target, so we see how to do to combine targets, how to print own targets, and how to shoot glare-prone glossy targets.

For daylight I'll show two options, either using real daylight which makes it a bit more challenging to shoot targets but the light comes for free, or use a voltage-tuned Solux halogen indoor to simulate D50.

We will use a minimal budget setup with only one lamp, and I'll show how to use flat-field correction to overcome the uneven illumination problem you get with such a setup.

After the tutorial there's a separate section were I show how to design a subtle subjective look that can applied on your profile if you like, perhaps with the intention to render more flattering skin tones and landscapes with colors that pop.

We're stuck with simulating analog cameras

If you are familiar with image reproduction from the aspect of color science, you know that this is how it should work:

  1. Capture the scene with the camera
  2. Using a camera profile convert the camera raw camera into a colorimetric "scene-referred" representation.
    • You can say that "colorimetric" means that you model the "signal from the eye", that is sort of the "raw" information the eye sends to the brain. The eye-brain relationship is more complicated than that, but as a model it works well.
  3. The scene and viewing conditions are analyzed and a spatially varying color appearance model is applied that converts the colorimetric representation to something that as well as possible keeps the original color appearance as well as contrast and brightness within the limitations of the media.
    • That is a model that simulates how the brain converts the eye's signals into color, which will vary depending on subject, and also vary over the scene depending on things like local contrast.
  4. With this realistic rendering as base the photographer/artist can add creative adjustments on top.

Here camera profiling is pretty straightforward, it should just make the camera as close as possible to an accurate colorimetric measurement device. In this case camera profiling is the same as profiling a scanner, no contrast curve or creative effects are added in the profile.

Contrast, saturation and other adjustments that are required to produce a realistic color appearance of a real scene on screen (or print) is then automatically added on top by the color/image appearance model, and will take the actual image content into account as that will affect which adjustments that needs to be made for the most realistic appearance.

However, no established raw converter has implemented any of the content-sensitive image appearance models, so the camera profile does what film did — it adds a static S-shaped contrast curve which is a coarse way to make natural scenes look more realistic. The profile also contains subjective adjustments (much like film did) to create a "look", sometimes subtle, sometimes less so. That is today's raw converters can be seen as analog camera simulators and it's probably not going to change in the foreseeable future.

As the available raw converters are designed around the idea that camera profiles should work this film-like way it's hard to do it in any other way. Thus we will in this tutorial go through how to make a profile with the properties raw converters expect. With this background I just want to make clear that profiles of today do not represent a "scientific" way to make color and that there are better ways to do it if just the raw converters would support it.

A quick note on reproduction profiles

In this workflow we're making a profile for general-purpose photography. If you really are into reproduction work in a fixed light and fixed exposure setup (that is the camera is used as a scanner) I recommend making a full 3D LUT profile, if you can use ICC profiles Argyll makes an excellent job. For the colorimetric part (the color accuracy part) DCamProf makes only 2.5D profiles which works better than 3D for variable condition photography, but may not produce as good results in a reproduction scenario. You can read more about this in DCamProf's documentation.

Step 1: choosing test targets

The classic 24 patch color checker, here in the form of X-Rite's ColorChecker Passport.

Reflectance spectra for the CC24 target. It has been manufactured by a special non-standard printing technique and thus have smooth and more varied spectra than you get if you print a target on your own inkjet printer.

As the CC24 is a matte target it cannot reproduce colors with very high saturation though. We're going to use this target as the main reference, and then complement with a custom target to cover high saturation colors.

We're going to use the classic X-Rite ColorChecker 24 matte target, and top it off with an own custom printed target on semi-glossy paper, made on an inkjet printer.

X-Rite's color-checker has been manufactured with a special printing technique which provides smooth varied spectra of the patches. When you print a target with an inkjet printer, even one with 12 inks like the Canon Pixma Pro-1 we're using in this example, the spectral variation is a bit limited.

This means even if we would print a chart with 1000 patches the 24 patch color checker will likely make a better match on generic typical colors found in real life. However, the ColorChecker is a matte chart and therefore super-saturated colors can't be reproduced. Our custom printed chart will therefore, despite its limitations, provide for better correction when it comes to "extreme" colors.

The value of striving for good precision of super-saturated colors that rarely is seen in nature (unless you're into flowers) can surely be questioned. We don't get into that discussion though and we just do it "because we can" and because it makes up a more interesting workflow demonstrating more techniques.

So our strategy will be to use the "CC24" for the core colors, and complement with a custom printed target to make the profile a bit more accurate when facing extreme colors.

If you are curious about the performance of various commercial targets you can have a look in the appendix at my brief target evaluation. It will show that it's hard to improve on the simple CC24 target, you do really well with only that. However we want a little extra and also show off what DCamProf can do in terms of target combination, so we go ahead with this dual-target workflow.

You can of course instead of printing a target on an inkjet manufacture one in some other way, combining chips of different materials or whatever, but let's leave that to some other time. If you can't print targets, combining the CC24 with a semi-glossy IT8 target can be a nice alternative (such as those provided by Wolf Faust).

To be able to use a target in a profiling workflow you need two files associated to it, one chart layout file which specifies the size, placement and shape of the patches, and one reference file which contains a measured reference color value for each patch, and preferably also the complete reflectance spectrum.

The chart layout file

As we're using Argyll's scanin tool for reading patch values, we need the chart layout specified in Argyll's own format, .cht.

Argyll is distributed with .cht files for most popular commercial charts. If you have made your own test chart using Argyll a .cht file should have been produced in the process. If you use some special target which does not have a .cht file, I'm sad to say that you are on your own. It is indeed possible to make your own .cht file as it's a text format, but it's undocumented so you need to figure out how it works by looking at the existing files and then make your own by hand using a text editor.

The reference file

The file with reference color values is a CGATS text file, and some commercial targets are delivered with one. Target colors vary a bit during manufacturing and can fade with age (although if it has been stored dark the age is rarely a problem) so if you don't get an individually measured file I recommend to scan your own target if you have a spectrometer.

An advantage with measuring with a spectrometer is that you get full reflectance spectra for each patch, which you rarely if ever get in the commercially distributed reference files. This is of extra value when we are making a dual-illuminant DNG profile as we will need to have CIE XYZ values for both daylight and tungsten, and if we don't have spectra we need to rely on some sort of relighting transform which is not as precise.

If you have reflectance spectra the XYZ reference values can be anything as they will be regenerated from scratch anyway. Otherwise they should ideally be related to D50 with the 2 degree 1931 standard observer. Some reference files may be at D65 or some other temperature, make sure to find that out as you need to know it later when making the profile.

For some commercial targets with a known stable manufacturing process you may be able to get a generic reference file with good accuracy. DCamProf is delivered with one for the classic CC24. I re-measured mine anyway. As the target has a grid overlay it cannot be sweep-scanned as a printed target. I measured and stored the spectra for each patch one by one using Argyll's spotread and manually merged it to a .ti3 reference file using a text editor. Yes it was a bit of pain, so I won't blame you if you use the bundled reference file instead.

Note that the CC24 got a manufacturing change in November 2014 which caused slight change of the colors, so make sure you use the correct reference file. DCamProf comes with reference files both for the old and the new CC24 targets.

Making a custom semi-glossy target

Custom target, 210 patches for an A4 sheet. It's speckled with white patches to support one-shot flat-fielding, and has five black patches for diagnosing glare issues. A gray-scale step wedge has been excluded though as we intend to shoot in a controlled condition where glare is minimized.

As the target is designed for 2.5D LUT profiling (no lightness-dependent corrections), all patches are as bright as possible for the given chromaticity. Blue and purple patches still get quite dark as the eye is less sensitive in this area.

Typical reflectance spectra from a custom target printed with a modern pigment inkjet printer on semi-glossy paper (it's not the exact same target as pictured above, but a similar one).

We can see that we achieve saturated colors, but the variation is a bit limited due to too few colorants. For example we don't have any colors with a peak around 570 nm. The limited variation means that we should use this target as a complement, not as a sole reference. That's why we combine it with a CC24 test target.

We're making the target using Argyll in the same way that you make a target for printer profiling. However rather than using Argyll's own targen tool to generate patches we use DCamProf's make-testchart command which is better suited when it comes to generating patches for a 2.5D LUT camera profile (LUT = LookUp Table, a non-linear table that translate camera raw values into vision color, profiling is about calculating this LUT). A 2.5D LUT means that lightness is not considered, that is the same correction is applied to a darker or lighter version of the same color. You can read more about the rationale behind this in the DCamProf documentation.

The make-testchart command will make charts speckled with white patches which can be used for convenient flatfield correction, a few blacks for black level reference and then cover all chromaticities with as light colors as possible (chromaticity = hue and saturation combined). As the LUT is 2.5D it doesn't make sense to render dark repeats of lighter colors, that will only make it harder to measure.

You don't need a lot of patches, on the other hand printing smaller than an A4/Letter is not worthwhile, so we make an A4 target.

Argyll has several presets for different spectrometer instruments which renders patches in suitable sizes for the instruments, that is as small as possible which one wants in printer profiling. In camera profiling we don't want too small patches, so we use the Colormunki preset which renders larger patches. However, it will also unfortunately make even columns offset and the patches non-square. This information needs to be passed to DCamProf commands as it needs to know the target layout.

DCamProf can add a neutral step wedge to the target, but we won't do that. A step wedge is traditionally use to linearize the photo, that is apply a curve so the brightness of the grayscale step-wedge gets correct. While film was non-linear camera sensors are linear so the the sensor output doesn't need to be linearized. However glare and flare in the lens can cause loss of contrast and thus loss of linearity. We aim to measure properly with minimized glare though and in that case step wedge is not necessary. A few black patches are kept though which are used for sanity checking that we actually don't have much glare. If you want to reduce glare further, you can have a look at DCamProf's glare matching feature. A problem with that is that it needs perfectly spectrally flat black and grays to work the best, and few printers can produce that.

Below are the DCamProf and Argyll commands for making an A4 test chart and reference files:

  dcamprof make-testchart -l 15 -d 14.46,12.26 -O \
    -p 210 custom-target.ti1
  printtarg -v -S -iCM -r -h -T300 -p A4 custom-target
  chartread -v -H -T0.4 custom-target
  spec2cie -v custom-target.ti3 glossy.cie

The dcamprof make-testchart will render the patch color specification and save to the Argyll .ti1 format. We specify the layout with -l 15 (15 lines), -d 14.46,12.26 relative dimensions of the non-square patches and -O which says even columns are offset half a patch. Then we specify 210 patches, which we know fills an A4. How do we know these parameters? We've made a dummy target in advance and rendered a TIFF with printtarg to see how it looks.

Argyll's printtarg command makes the actual TIFF that we will be printing, and also the .cht file that specifies the layout. So outputs will in this case be custom-target.tif and custom-target.cht.

Then we print on an OBA-free high quality semi-glossy paper. If you can't have it OBA-free you need to take into account if your instrument measures UV and if your light sources emit UV, you can't have a mismatch.

Print like you would a normal printer target, that is without color management enabled. Some patches will be closer in color than others, as the colors are rendered without taking printer behavior into account, but that is no problem as we have more patches than necessary anyway.

Then scan your target like a normal printer target using chartread, you can look in my printer profiling article to get more details on how to scan a target if you need that. The output from chartread is custom-target.ti3 and that is reformatted to a reference file using Argyll's spec2cie. Per default D50 is the reference light used by spec2cie, but it doesn't matter what it is as the reflectance spectra is stored in the file and thus the XYZ values are regenerated from scratch using the spectral information when used by DCamProf later on.

Step 2: choosing light and setting up

We're making a profile for both a warm light (tungsten at 2850K) and the bluer daylight D50 or D65 (5000K / 6500K). The camera reacts quite differently under these lights, so for better accuracy we need separate profiling.

As we're going to shoot under tungsten light, or standard illuminant A (StdA), best simulated by a 2850K halogen light, we need to make an indoor setup. The drawback with shooting indoors is that it requires extra equipment which adds a little cost. However, we'll use as little gear as possible that still allows us to get a high-end result.

For the daylight reference we're going to show two options. One is to shoot that one indoor too, using a Solux 4700K halogen on overdrive to simulate D50 daylight (5000K), another shooting outdoor to simulate D65 (6500K).

Simulating D65 indoors with high quality currently requires quite expensive light sources, that's why we choose to simulate only D50 for the indoor option. The advantage of shooting indoor is that it's easier to minimize glare in the measurement and we're not weather dependent and can work in a relaxed slow pace without worrying that the light is changing.

When making a multi-target setup and/or using glossy targets (we do both) I recommend an indoor setup simply because it's so much easier to minimize measurement errors.

To get some background and tips of how to simulate standard illuminants you can read the section on artificial lights.

In the indoor case our dual-illuminant profile will be StdA+D50, that is a bit tighter spaced illuminants than the "de-facto" standard (=Adobe standard) of combining StdA+D65. In terms of actual light color higher temperature illuminants are tightly spaced though so it's not that big difference between D50 and D65. So it's better simulating D50 with high quality than making a low quality D65 just to reach 6500K.

With a Solux you can actually reach D55 (5500K), but it does mean that it will burn out real quick. If you can accept that you could aim for that. Personally I did push it to D55, but I will show D50 in the example.

After I wrote the first revision of this tutorial I made a deeper investigation to verify if you lose anything by making a StdA+D50 profile instead of StdA+D65. I used spectral images to make it possible to simulate various lights and see the results (you can do this with DCamProf, which can do many more things than outputting camera profiles). The main difference between D50 and D65 is that for high light temperatures (say sky light 10000-18000K) the D50 profile will make deep blues a bit lighter, and saturation is overall a tiny bit higher. As light blues typically is a desirable subjective adjustment it's hard to see this as a drawback. So my conclusion is that StdA+D50 is just as good as StdA+D65 for a general-purpose profile.

Light source

Halogen lamp, cheap lamp fixture with home-made lamp shade strapped to a tripod, powered by variable DC power supply. It doesn't look beautiful but it does the job.

When actually shooting I had an extra shade on the back of the lamp to avoid stray light going out the back which could risk causing flare in the camera lens.

(note: the image shows my first installation which had too weak power supply and cables to be able to run the lamp in overdrive. I learned that the hard way and had to get a new power supply.)

I have solved indoor lighting like this:

Halogen lamps vary a bit sample to sample, so if we want as accurate temperature as possible we need a variable power supply and a way to measure light temperature. I've used a Colormunki spectrometer, but if you don't have that you may use a camera and an existing DNG profile. See the section on measuring light source temperature for more details. It's not that important to get spot on, in fact you can satisfy with estimations too. Run the Solux on some overdrive, say 13 volts, to get approximate 5000K, and try buying a 2850K halogen for the StdA or a slightly higher temperature and underdrive it a little (say 10 volts for a 3000K lamp).

It's a little bit messy to power halogen lamps as they need quite high current. Be sure to read the section on halogen lamps to get some further tips on power sources and how to mount them. I wish I had myself because I first bought a too weak power supply and used too thin cables to deliver proper current.

If you're thinking about using any other lamp type, do read the section on artificial light sources for profiling where I go through advantages and drawbacks of various lamps available.

Real copy setups use multiple lamps carefully placed for perfectly even illumination of the target, but we're going to use a single lamp and compensate the uneven light with flat-field correction. It's a lot cheaper, easier to set up, and you get equivalent result in the end. Having only one light source may actually be an advantage in terms of quality as less light will be bouncing around the room making it easier to minimize glare.

Tuning light temperature

The spectra of the standard illuminants D50 (daylight) and StdA (tungsten), together with the results obtained with voltage-tuned halogen lamps.

For a layman it might seem like the match could be better, but it's hard to get better results than this using any available technology. It's also more important to have smooth spectra without peaks (which halogen lamps provide) than having an exact match with the artificial standard illuminants which really doesn't exist in real life anyway.

The dip of the halogens above 640nm does not hurt precision that much as the eye is not that sensitive there anyway. The CIEDE2000 color difference is about 3.4 for both StdA and D50.

DNG profiles support only a preset number of (EXIF) light sources, and have hard-coded temperatures for them, here's a full list:

It's actually not important to match these exactly, but if you can I suggest you do. If you use a light-source you cannot tune (LED, outdoor daylight, or no variable DC supply) the CCT (correlated color temperature) will be what it is, so then you just pick the closest one. The DNG pipeline just looks at the temperature, not spectral quality so "DaylightFluorescent 6400K" does not need to be a fluorescent. However as exact matching is not that important I personally would choose one of the D sources if I've used daylight, simply for informational purposes.

A more in-depth discussion of the value of matching light temperature can be found in the appendix. The short story is that you should not work too hard to make a perfect match as it doesn't really matter and that it's in any case impossible for a camera to accurately estimate light source temperature.

Placing target, camera and light

We need to avoid glare to make an accurate linear measurement. This means that we should have a dark room to start with, it doesn't need to be pitch black but should be several stops darker than the light on the target. So if you don't have a good way to seal off the window light I recommend shooting in a different room if you can.

We should minimize any light bouncing around the room, one way is to have neutral dark textiles (preferably black) behind the target so any light that misses the target gets attenuated as much as possible.

Then the light needs to be placed so it's outside the "family of angles", that is if we replace the target with a mirror the camera should not see the lamp in the mirror. Placing the lamp far to the side is the standard solution. If we have only one lamp we will get uneven illumination of the target with this placement, but we can correct that later with flatfield correction. Don't make it too uneven though as it will increase noise in the darker parts.

To reduce the family of angles to make it possible to place the light more from the front and less from the side you can use a tele lens and place the camera as far away as you can and let the target fill the frame. When flatfield correction is not used it's important to minimize vignetting, but as we will be using that for correcting uneven light anyway it will correct vignetting at the same time and thus we can let the target fill out more of the image diagonal, and thus be able to use a longer lens.

If you have visibly uneven light, orient the target such that darker patches are on the bright side, if possible.

It may seem like we're going overkill here. Most profiling guides just show a CC24 shot in the scene just like any normal photo. Matte targets like the CC24 are indeed less affected by glare and are quite robust to measurement errors. The associated profiling software can also make robustness measures, for example not correct lightness at all which is the dimension that is most affected by glare.

However as we're both going to correct lightness and shoot a glossy target we need to take these extra measures. Glare is a very real problem, a bad setup easily almost halves the dynamic range of a glossy target and makes the measurement unusable. With a matte target we can get away with being a bit sloppy, but on the other hand it's not a big effort to do it right.

We are going to use Argyll's scanin command to read patch values, it's very sensitive to any rotation and perspective distortion, so try to shoot straight on, otherwise you may need to correct in an external application (like RawTherapee) before feeding the images to Argyll's scanin. Note that scanin is primarily designed for scanners and is thus so sensitive on orientation that perspective-corrected shots usually doesn't work, even if they look alright to the eye. So do make sure that your shots are perfectly perpendicular to the target.

Step 3: shooting the target

My shooting setup before closing the windows and turning off all lights caused the room go pitch black, except for the lamp. It's surely "ghetto style" with all the cardboard and the target attached to my office chair (it stands on pins so the target can easily be lifted away without disturbing the setup, so I can swap in the glossy target and the white card).

It doesn't need to be more advanced than this. Careful use of home-made lamp shades make sure that as little as possible of the light bounces around in the room. Before shooting I also cover up the LCD displays from the DC power supply to avoid light pollution from them.

After we've set up the lights and target we should shoot it. RAW format, exposed as light as possible, but without clipping. In-camera histograms are typically inaccurate and under-estimate the dynamic range which leads to unnecessarily dark exposures. On the other hand clipping is fatal for the result, so if you're going to expose light you need to know what you are doing.

I usually bracket and then look in a raw converter with raw histogram support (like RawTherapee) to find the ideal ETTR unclipped exposure. It's also typically possible to learn approximately how much highlight space the camera has when it starts to show the highlight blinkies. Here we make an DNG profile, and then ETTR is what we strive for. However if we would make an ICC profile and use a raw converter that pre-processes the raw data with a curve so highlights are compressed, ETTR would move the highlights into the compressed range and we would lose precision, in that case expose a bit lower.

With DCamProf there is also support to stack and average measurements to get lower noise (using the average-targets command), if you use that ETTR is not that important. I think it's more practical to tune the exposure and then use the best exposed shot. It should also be said that even with a carefully made setup the residual glare and flare issues will be a larger error source than noise so I think it's overkill using stacking on top of a good ETTR exposure.

If shooting outdoor I recommend not using stacking as it lengthens the workflow, and makes it more difficult to complete shooting before light has changed.

Using your chosen method iterate to find the optimal exposure for a shooting aperture of f/8 (135 equivalent, on medium format I use f/11). Focus on the target. I actually usually defocus a bit which blurs out any surface structure so we get pure color fields. Defocus should not really change anything as the patch surfaces will be averaged anyway, but I prefer having such images as they are easier to inspect visually concerning noise levels and color. Defocusing too much will cause Argyll's scanin to fail so I don't really recommend this method as it's so much easier to just focus on the target and shoot.

If we're going to do flatfield correction and you don't have a special target speckled with white patches (like in our example with CC24) we need to shoot a white card too with exactly the same setup, don't move the camera or light and put the white card in the exact same position as the target. The white card needs to be at least as large as the target of course. It's not necessary to buy an expensive dedicated white balance card for it though as an exact white is not necessary (flatfield correction result will still be the same), I use a blank sheet of my smooth matte thick printer papers instead. Even the smooth papers have a little texture, but it will be evened out in the flatfield process, so don't worry about that.

If you employ stacking you can still skip it for the flatfield shot. As it's all-white the noise level will be low. The DCamProf flatfield algorithm will also blur the flatfield shot slightly which evens out any noise (or dust particles) in it.

Shooting checklist:

Shooting the target outdoors

When you shoot outdoor you normally have light coming from everywhere, you cannot shoot from a dark position like you can indoor with controlled light. This means that glare is a major concern. For matte targets you can typically live with it, but semi-glossy targets need special setup and care when shooting otherwise the result will be so hurt by glare that it's unusable in profiling.

The image shows a setup which significantly reduces glare. In a test with a target with 7.9 stops of dynamic range (according to spectrometer reference measurement) the shown setup managed to get 7.2 stops. When the black surrounding box was removed the results dropped to 6.7 stops, which can be the difference between a usable and an unusable result.

The setup uses the guiding principle to have light outside the "family of angles", here by cutting off undesired light with the cardboard box covered with black cloth. The target is shot at a low angle to make sure all direct reflections comes from the black cloth (that is as little light as possible).

This setup will not have perfectly even light, so we will have to employ flatfield correction. As that can be done with high accuracy we don't need to see it as a problem.

Outdoor setup. Note this was temporarily setup on a balcony for demonstration, in a real shooting situation you should be in a more open space. The lens shade has been lengthened to further minimize flare.

More side light will reach the lens when shooting outdoor, which means some of the deepest reaching dynamic range can be lost due to flare. It won't be visible or a problem in real pictures but will disturb measurement of dark colors. Standard lens shades are designed to not vignette on largest aperture, but when shooting at say f/8 you can have a significantly longer lens shade, often more than twice. I recommend to lengthen the lens shade, make it as long as possible. You could make one out of several layers of black paper, or just tape on another lens shade that happens to fit inside the first.

Use a lens with few lens elements and high quality coating. Remove any filter (also protecting clear filters). This reduces flare. It's easier to shoot and you get less reflection angle if you use a longer lens, but rather use say a 85mm than a 70-200 zoom with 20+ lens elements to reduce risk of contrast-reducing flare.

It's extremely important that you make the viewfinder light tight, otherwise dynamic range will certainly be hurt. It's not enough just looking into it, you will have light leaks around the eye. Seal it off completely and use live view to shoot. You easily lose half a stop if sloppy with covering up the viewfinder.

If you shoot this way a polarizing filter will not make any significant contribution to the result. Therefore I recommend to not use it, as those filters are not perfectly color neutral.

While DCamProf will show you a dynamic range comparison you can manually check it too by comparing a white and black patch: check your Y reference values (Y white divided by Y black) from your XYZ spectrometer measurement, and compare them with an average G value (raw green), G white divided by G black.

Outdoor light can change fast. I think the best occasions are overcast midday (should be similar to D65) with thick even clouds that make light reasonably stable. If you have a spectrometer and a portable computer I recommend recording the actual light spectrum, which can be used by DCamProf when making profiles. Put your cardboard box in an open space so the daylight is not polluted by reflections from a nearby colored wall for example.

If we don't have a target speckled with white patches (such as the CC24) we need to make a separate flatfield shot with a white card. This must be with the exact same position and the same light. A little light change in light temperature does not hurt, but a say shifting cloud can shift the balance of the light so the flatfield becomes wrong. To minimize such risks we need to work swiftly.

  1. Setup the target in its box and camera, stable on a tripod.
  2. Fine-tune the exposure, as light as possible without clipping.
  3. Then do the following swiftly:
    1. Shoot the target.
    2. Cover the target with the white card and shoot again.
    3. Repeat with the next target if you shoot more than one.
    4. Measure the light with a spectrometer (if you have one)
  4. Check that all shots were properly exposed, it's easy to make mistakes and the light can change fast. It's not great getting indoors discovering on the computer that the shots are underexposed or clipped.

If you don't have the opportunity or otherwise don't succeed with making a target shot with low amount of glare, I suggest heavy LUT relaxation of the lightness dimension when you make the profile, or even disabling lightness correction completely. How this is done will be shown in later steps in this guide.

Step 4: converting raw files to TIFF

Before conversion, JPEG view. Note that it looks over-exposed, but it's just very carefully ETTR. Also note that we let the target fill the frame, to avoid picking up irrelevant surroundings that may cause flare. As we will apply flat-field correction we don't need to worry about the vignetting.

After conversion. Dark due to linear gamma (and no brightening curve), and green cast due to that camera has a more sensitive green filter. This look is normal. Thanks to the linear gamma the unevenness in the light becomes even more clear than in the JPEG.

After flat-field correction. The uneven light and vignetting has been corrected in full.

Argyll's diag.tif generated by the scanin tool, a diagnostic image showing how the patches where matched. Here we see that we got a match without any issues: the colored squares show the sampled areas and they are all within the actual patches without touching any neighbors or separators.

To make profiles with DCamProf we need to make linear 16 bit TIFF files out of our raw files.

Personally I use RawTherapee. I'll show how you can do it with DCRaw as well, but it's easier to do it with RawTherapee and there you also have the ability to crop, rotate and perspective correct.

If you intend to use the profile in Lightroom I recommend to first convert to DNG using Adobe's DNG Converter and then convert that DNG using RawTherapee or DCRaw. The reason is that some raw formats have calibration data in them, and different raw converters may interpret it differently. By converting to DNG first you get Adobe's interpretation and the DNG can then be used in other software.

The DCRaw command to make a linear conversion is:

 dcraw -v -r 1 1 1 1 -o 0 -H 0 -T -6 -W -g 1 1 <file>

With DCRaw you cannot crop or rotate so you need to do that in some other software.

The images should not be white-balanced (they can be if you want to make an ICC profile, but here we're making a DNG profile and it requires unbalanced input). As cameras have higher green sensitivity the files will have a strong green cast, and they will also be very dark due to the linear gamma.

We have shots of a white card too, and those need to be converted as well with the exact same cropping as the target (and transforms, if any). The cropped area of the white card should only show the white surface, no surroundings. If you can't make an identical crop that covers the full target without showing edges or surroundings of the white card you need to redo the shots. Making the exact same crops with RawTherapee is easy as you can copy-paste adjustment profiles.

Step 5: getting patch values

DCamProf needs a .ti3 file, which is an Argyll text file format which contains for each patch camera raw values, CIE XYZ reference values and (ideally) reflectance spectrum.

To get this we need the following:

We have already discussed these components in step 1: choosing test targets.

Apply flat-field correction

To apply flatfield correction we use DCamProf's testchart-ff command:

 dcamprof testchart-ff cc24.tif ff.tif cc24-ff.tif

Here cc24.tif if the TIFF of the CC24 target, ff.tif is the white card shot, and cc24-ff.tif is the corrected output. Our custom target are speckled with whites which means that we can instead do flatfield correction on the .ti3 file (thus not needing any white card shot), but if I already have a white card shot like in this case I usually do TIFF flatfield for that as well.

See DCamProf's reference documentation if you want to do it on the .ti3 instead.

Scanning patch values

With the files ready, we get patch values using Argyll's scanin like this:

 scanin -v -p -dipn cc24-ff.tif ColorChecker.cht cc24.cie

The output will be called cc24-ff.ti3 in this example, and a file diag.tif will also be generated which shows if patches was matched. Usually you see in the console if scanin succeeded, but if you're a first time user the image can be easier to interpret. It will also make it clear if you have some issue in your images, not straight enough, or something obstructing for example.

If it just doesn't want to match (it's extremely sensitive on orientation), make sure that your shot was perfectly perpendicular to the target and any residual rotation was corrected. If your shot was not perpendicular and you have used perspective correction to compensate it's likely that it won't work, scanin is just too sensisitive so any residual patch scale differences can cause it to fail.

Match glare

This tutorial was originally written before DCamProf had the glare matching feature. If you shoot the targets well and do everything you can to minimize glare, they will have low amounts of it so any glare matching will probably make negligible difference. However I would probably do it anyway when redoing this workflow as it doesn't hurt. Here's a brief description of how to do it:

  dcamprof testchart-ff -L cc24-layout.json cc24-ff.ti3 cc24-ffgm.ti3

  dcamprof testchart-ff -L -l 15 -d 14.46,12.26 -O custom-target.ti1 \
    glossy-ff.ti3 glossy-ffgm.ti3

In the CC24 case we use the bundled layout description (cc24-layout.json), and in the custom target case we provide the layout with flags and the .ti1 file. DCamProf uses the position of white, black and middle gray patches to model glare and will then apply glare to the reference values. That is it doesn't fix the raw samples, but "messes up" the reference values by adding simulated glare to them so it matches. This reverse approach is used because it's much more robust than linearizing.

Merging targets

In this tutorial we have shot two targets, the CC24 and a custom semi-glossy printed target. With both scanned to .ti3 files we want to combine those to a single file which are then used when making the profile.

We use DCamProf's make-target command for this:

  dcamprof make-target -p cc24-ff.ti3 -a cc24 -p glossy-ff.ti3 -a glossy -d 0.03 combo.ti3

Inputs are cc24-ff.ti3 and glossy-ff.ti3. We assign them separate class names "cc24" and "glossy" (-a) which is necessary otherwise make-target will consider them as a single bunch of patches. With separate class names they will be prioritized in order given, that is CC24 is at higher priority and any patches of similar chromaticity in the glossy target will be excluded. We do this way as we know the spectral shapes of the CC24 is better than of the glossy target. With -d 0.03 we increase the minimum u'v' chromaticity distance between classes a little (default is 0.02), that is make sure any patches coming from the glossy target is at a safe distance from the CC24 target patches.

We save the output to combo.ti3, which in this example will contain all patches from CC24 and only high saturation patches from the glossy target, just as we intended. The combined target keeps the class names which we will be using when applying weighting in a later step.

Step 6: making the daylight profile

We'll start with making the daylight profile. Cameras usually have less problems matching colors in daylight than in tungsten, meaning that it will be a little bit easier to make a well-behaving profile.

Making a basic profile using DCamProf is really easy, we can make it in a single step directly from the .ti3 with only default parameters. Per default DCamProf does automatic smoothing that flavors robustness over accuracy (to fit casual users). We want to take this a step further though and make the smoothing manually so we can precisely control the trade-off between smoothness and accuracy.

As we're using a highly saturated target we can also expect that the camera gets difficulties matching, especially in tungsten light, therefore we have a particular strong reason to work manually. While shooting a target and getting its values with as low measurement errors as possible is a craft, making a profile from the result is an art. You need to apply your judgment and taste to make suitable trade-offs between accuracy and smoothness. As a general guide it's better to make a profile overly smooth and sacrifice accuracy than the other way around.

When using DCamProf you will first make a profile in its own native profile format, which then later is converted to a DNG profile or an ICC profile.

A DCamProf native profile (and indeed also a DNG profile) consists of a pure linear conversion, a matrix (see the appendix on camera colors for a more detailed description), which brings the colors as close to the goal as possible, and then the residual error is corrected by a LookUp Table (LUT) which can be seen as a rubber sheet which is stretched to reach appropriate positions. The matrix part will be perfectly smooth as it's a linear conversion, while the LUT stretching can cause some bad non-linearity which can be manifested as broken gradients in some pictures (typically in out of focus backgrounds where one color transitions smoothly into another). Designing a high quality profile for general-purpose photography is mostly about relaxing the LUT in suitable ways so smoothness is maintained while still improving accuracy over a pure matrix profile.

We're first going to make a "colorimetric" profile, that is a profile whose purpose is to as accurately as possible (with smoothness trade-off!) capture the color values in the standardized CIE XYZ coordinate system. This is what you use in reproduction work, for example when you copy a painting or some other artwork that can be printed. The colors you capture and then print should match the original. However, for general-purpose photography when we shoot real scenes a colorimetric profile will make pictures appear flat and dull due to various psycho-visual phenomena. The solution is to apply a contrast-increasing tone-curve ("S-shaped"). We will do that later on when we convert to a DNG profile.

Adding curves and subjective adjustments is with DCamProf made in the DNG/ICC profile generation step. DCamProf's native profile format only supports colorimetric profiles without contrast curves. It's quite common that camera profiling software forgets about the contrast curve step and just add it on top of the colorimetric profile without further adjustments. This can lead to inaccurate and garish colors. With DCamProf a significant effort has been put into the handling of curves, but first let us get on with the base colorimetric profile.

Make a preliminary profile and plot it

Typical view when plotting the first LUT using the command described here. Due to the many patches it becomes a bit hard to see, especially in this small screen shot. When you make your plot, use as large window as possible, and zoom in on details when needed.

The same plot with set view equal xyz that makes sure the Z axis (lightness) has the same scaling as XY (chromaticity), which is necessary to get the correct length of the error vectors. The plot then becomes very "high" and a bit hard to fit (you can scroll around though), so this view is usually only used temporary when checking error vectors.

Note that we only see the olive vectors here, that is those showing how much the LUT stretched to match each patch. The black error vectors are not visible. The reason for this is that as we plot a preliminary profile without any LUT relaxation there is almost 100% match on each patch, thus very short error vectors and thus invisible.

The same plot viewed straight from above so you see only the XY plane, that is the chromaticity plane. This is a very useful view as it's easier to get an overview when it's only a 2D plot, and you can look at the lightness axis later.

Here we see a notable bad compression of the LUT in the skintone range, (A01, A02), and not as bad but unhealthy stretch in the blue area, close to B02.

The label names does not show our class names ("cc24" and "glossy"), so there are some duplicates. The CC24 patches are the lower saturation patches, and the glossy the saturated towards the edges. Note that some of the glossy patches actually reaches outside Pointer's gamut. This is normal, Pointer's gamut is a bit smaller than what's possible to achieve with modern printers and papers.

First we render a preliminary fully corrected colorimetric profile with data for plotting:

 dcamprof make-profile -r dump1 -l 0 \
   -i light.sp combo.ti3 preliminary.json

Parameters explained:

With the preliminary profile generated we need to start plotting to see how the LUT looks. For this we will be using the free and open source gnuplot. It's a command line tool that plots to a separate window, very flexible but not so user-friendly. Following this tutorial you should not need to learn anything more than described here though.

Start a command line terminal, change to the dump1 directory and start gnuplot with a gray background:

 gnuplot -background gray

Then run the following plot command:

 gnuplot> splot 'nve-lut.dat' w l lc "beige", \
   'gmt-locus.dat' w l lw 4 lc rgb var, \
   'gmt-prophoto.dat' w l lc "brown", \
   'gmt-adobergb.dat' w l lc "red", \
   'gmt-pointer.dat' w l lw 2 lc rgb var, \
   'gmt-fm.dat' w l lc "blue", \
   'gmt-prof.dat' w l lc "purple", \
   'target-nve-lutve2.dat' w vec lc "black", \
   'target-nve-lutvm.dat' w vec lw 2 lc "olive", \
   'targetd50-xyz.dat' pt 4 lc rgb var, \
   'targetd50-xyz.dat' using 1:2:3:5 w labels offset 3

The .dat files are text files with plot data. The command will make a 3D plot (splot) and show the LUT (nve-lut.dat) as a beige grid, and the spectral locus (gmt-locus.dat), ProPhoto RGB, Adobe RGB triangles and Pointer's gamut as reference. Then we show the gamut (reach) of the linear matrix (gmt-fm.dat) and the resulting profile gmt-prof.dat. Note that the profile's gamut will not (significantly) exceed the matrix, not the locus, and not ProPhoto. This is a built-in gamut limitation of DCamProf.

On that we have the D50 target patches (targetd50-xyz.dat) with labels (adjust offset 3 if labels are not aligned as you like), and finally two vector sets: thin black vectors showing DE matching errors (target-nve-lutve2.dat) and wider olive vectors showing the local LUT stretching (target-nve-lutvm.dat).

The LUT is anchored to the maximum gamut edge, that is what's innermost of the locus, matrix or prophoto. If you have patches close to the anchored edge you will probably see some stretching or compression there.

This plot command will be used throughout the workflow for evaluation various aspects of the profile. You can indeed plot many other things, but this comprehensive multi-plot will fulfill the needs we have for generating a profile. If you're interested in what else you can plot, see DCamProf's reference documentation.

How to navigate with gnuplot:

I've tested this on Linux, there may be some differences on how you navigate gnuplot on your platform and your mouse. If so look in the documentation for gnuplot.

The coordinate space used here is DCamProf's "LUT space", which is u'v' chromaticity on XY and then Lab's L times 0.01 on Z (0.0 – 1.0 range instead of 0 – 100 that is). This is a linear space with decent perceptual uniformity, that is a fixed distance anywhere in the plot corresponds to a fixed color difference. However due to the linearity requirement it's only very coarsely perceptually uniform and specifically high saturation colors should be closer spaced to be more perceptually correct. The clearest example of the non-uniformity is the "line of purples" where colors are a mix of near-black violets and near-black reds and are thus considerably harder to differentiate than the coordinate system suggests. However as we have error vectors in CIE DE2000 units we can rely on those when making more precise error evaluations.

The most common "perceptually uniform" coordinate system is CIELab (or just "Lab"), which you may have come across in Photoshop or other image editing software. The reason DCamProf is not using that is that the ab plane is not independent of lightness, and the internal 2.5D LUT design needs a pure chromaticity plane. Don't worry if you don't fully understand the coordinate system, but please read a bit about chromaticity diagrams if you haven't seen one before. If you rotate the plot so you see it straight from above what you see is a u'v' CIELUV chromaticity diagram.

Per default gnuplot will use the same scaling of the XY axis (ie the chromaticity plane), and then adjust Z scaling to fit. This usually means that Z will be strongly compressed which can be misleading if we evaluate LUT bends or vector lengths along the Z axis. Turning on and off equal axis is done with the following commands:

 set view equal xyz
 set view equal xy

I use them all the time when navigating the plot. It's often hard to fit the whole plot in the window if we have equal axes, but to evaluate error vectors it's vital that the axes are equal (and then you thus typically need to look at one part of the plot at a time).

Exclude "bad" patches

Zoomed in plot shows a problem area in the LUT. We see here that the dark skin tone patch on the CC24 A01 stretches quite strongly in the opposite direction to the brighter skintone patch A02 which has almost the same chromaticity.

This view also shows the neutral axis where we have the six gray-scale patches of the CC24. As we can see they are not really along the same axis and there is a quite large error vector there which means that at least one of the patches differs considerably from the others. As they are so close they get a collective average correction though, and as we see no stretch problem I don't think it's necessary to remove any patch there.

With these many patches and high saturation there may be some bad ones. Either these are bad due to measurement errors (can happen on very dark colors), or simply because the camera struggles with some particular color.

A "bad" patch as we see it is one which causes a correction in an opposite direction than surrounding patches and thus causes a bad stretch in the lookup table. In those cases it's best to exclude those.

To exclude a patch you add the class name and patch name on a line in a text file, which we can call exclude.txt.

When looking at my profile I found one such patch, as seen in the image. This happens to be the dark "skin tone" patch of the CC24 which in terms of chromaticity is very close to the lighter "skin tone" patch. As the LUT is 2.5D the lightness axis is not considered, so those patches become very close.

How do we know that we should exclude the dark rather than the light? Measurement error is much more likely on dark patches so a good rule of thumb is to exclude those when there are a similar lighter color with a conflicting correction. We can also see that the the amount of LUT stretch required (the olive vectors) is suspicious compared to other surrounding colors.

The text we add to exclude.txt:

 cc24 A01

Note that patches may be named the same in different targets so we need to add the class name too, cc24 in this case. After we've added the exclude text file, we re-render our preliminary profile like this:

 dcamprof make-profile -r dump1 -x exclude.txt -l 0 \
   -i light.sp combo.ti3 preliminary.json

that is we added -x exclude.txt, the rest is kept the same. Note that excluded patches are typically two or less, often we don't need to exclude any patch at all. If we've had a glossy target photo suffering a lot from glare we may need to exclude many dark patches though, but the we should probably redo the photo instead and try to minimize glare further.

Design the matrix

Now when we have learned plotting and excluding obviously bad patches, we can go on designing the matrix. The linear matrix is the linear foundation which the non-linear LUT is placed upon. As the LUT can stretch and bend in any direction the matrix could in theory be anything, but in practice the matrix design is important for the following reasons:

DCamProf can generally handle this well automatically and then we could skip this step. But this is an advanced tutorial so let's dive in.

After this section was written v1.0.4 of DCamProf has been released, which introduces an additional way to control matrix optimization, using -v parameter. For now turn to the DCamProf documentation to see how it's used.

We've already made it more difficult for us by combining two targets. Then we need to handle conflicting goals:

My way to approach this is to do no weighting to start with, that is let DCamProf consider both targets as equals, then design the other aspects (the blue stuff), and then add weights, and if that causes significant changes to our blue considerations we re-run that again with the chosen matrix weights.

So let's put the weighting to the side for a while and take a look at the blue color. We do this mainly for one reason: making conscious decisions about how to relate to camera limitations.

A profile becomes more robust if it doesn't force the camera in directions it doesn't really want to go. Some cameras have a strong and overlapping blue response (to improve high ISO performance I suppose), which makes them "want" to render deep blue colors lighter than we see them. If we force such cameras to render blues accurately dark we can get an unstable profile.

I've tested quite a few cameras so far, and the only hardware-related color response issue I've found is this particular one, problems with dark blue. This blue is well-represented in the CC24 color checker with the deep blue patch (named "C01" in our reference file).

Many, or actually most commercial profiles, choose to render these type of blues lighter than we seem them. While not all cameras needs this from a hardware perspective it's a subjective adjustment that many probably like as it improves the visibility of varying tones in blue colors; it's very difficult to separate small variations in deep blues, while it's much easier in lighter blues, especially if they slant towards cyan rather than purple.

It's beautiful design to first make an accurate colorimetric profile and then make subjective adjustments on top of that. Therefore as a designer I think it's a bit painful to discuss subjective adjustments at this stage. However, when it comes to the particular subject of deep blues it's often better in terms of robustness and tonality to adjust the colorimetric rendering. The technical reason is that we want to avoid strong negative luminance components in the matrix, and if a blue-sensitive camera is forced to render blues accurately dark it needs to subtract a lot of blue, which means that the matrix will move to out-of-gamut negative positions in extreme ranges and thus form a less robust profile. This will for most cameras only be visible for "extreme" colors (artificial colored lights etc) or "extreme" white balance settings (low temperatures, leading to a blue cast), but any high quality general-purpose profile deals with these cases.

So before we move further you should consider 1) from a subjective perspective do you want the profile to render blues accurately dark, or should it render them lighter? 2) if you don't want to render them lighter, is it then worth to sacrifice robustness of deep blue colors if your camera color response favors light blues?

To investigate this we start off with a preliminary pure matrix profile, but with a curve (and a neutral tone reproduction, that is no curve-related color shifts). Here we render a DNG profile with one command directly (normally you render a native profile first, and then run the make-dcp command to do the DNG profile, but for basic profiles you can render them directly using make-profile):

  dcamprof make-profile -d "unlimited" -n "Canon EOS 5D Mark II" \
    -x exclude.txt \
    -i light.sp -l 0 -t acr -y -10 -L combo.ti3 test.dcp

Replace the camera name with your camera. It must match exactly what the raw converter expects (at least for Adobe's products) otherwise the profile won't be visible. The -t acr parameter adds a default curve (DCamProf uses the neutral tone reproduction per default so it will render a LUT for that), and -y -10 just makes sure that the matrix won't be limited.

DCamProf actually makes three matrices, one "ColorMatrix" which is only used for light temperature estimation (that is no real color reproduction), one "LUTMatrix" which is a technical matrix only used for avoiding clipping in a DNG pipeline. You don't need to care about those two, just look at the "ForwardMatrix", it's that that is the matrix.

So in the console output from the make-profile run look for the forward matrix. For a Canon 5D Mark II it can look like this:

  "ForwardMatrix1": [
    [  0.828276, -0.010988,  0.146931 ],
    [  0.343230,  0.756043, -0.099273 ],
    [  0.041395, -0.179915,  0.963721 ]
  ]

Don't worry about the negative components on the X and Z rows, look at the blue on the middle (Y, pseudo-green/luminance) row which is −0.099273 in this case. All(?) cameras need some negative factor here, but not until it's smaller than say −0.20 we can say that we have problems. For a Sony A7r-II the result is:

  "ForwardMatrix1": [
    [  0.766137,  0.221330, -0.023249 ],
    [  0.267829,  1.016132, -0.283960 ],
    [  0.015094, -0.140933,  0.951041 ]
  ]

That is we see −0.283960 on the blue subtraction, which is large. The largest I've observed so far is −0.32 which was on a Sony NEX6.

So if your factor is less negative than say −0.20 you can do with your blues any way you want, but if it's more negative then you better lighten it or live with issues in the deep blue range. Cameras that have their noise floor clipped (like the Sony NEX6) can behave very unstable even in the normal color range if you have a matrix with a strong negative Y blue factor.

Anyway, now let's look at our CC24 test shot in your favorite raw converter with this profile loaded. The curve with DCamProf's default neutral tone reproduction lets us do an easier perceptual evaluation than if we would look at the flat colorimetric profile. You can skip the curve though (-t acr) if you think you can evaluate the flat colorimetric result directly. Note that we can't use just any curve as they shift hue (that is don't apply a manual RGB curve in your raw converter), it's important that it's a neutral tone reproduction like DCamProf provides.

As we're looking at the matrix-only result the color accuracy will not be as good as it can be, but any modern camera should be pretty close. Take a look at the deep blue patch, compared with the real thing, and think about other blues of this kind. Would you like them to be rendered lighter than the current profile is showing? If you're satisfied with the current lightness but you saw a strong negative blue component in the matrix, would you still mind if they became a bit lighter if that makes the profile more robust?

There are two ways to make the blues lighter. Either limit how strong negative factor that is allowed in the matrix, or adjust the target reference value (that is tell DCamProf that the blue patches are lighter than they actually are). Limiting is usually enough. Render a few profiles stepping from say −0.25 to 0.0:

  dcamprof make-profile -d "25" -n "Canon EOS 5D Mark II" \
    -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.25 -L combo.ti3 test-limit1.dcp
  dcamprof make-profile -d "20" -n "Canon EOS 5D Mark II" \
    -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.20 -L combo.ti3 test-limit2.dcp
  dcamprof make-profile -d "15" -n "Canon EOS 5D Mark II" \
    -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.15 -L combo.ti3 test-limit3.dcp
  ...

If your camera isn't problematic on the blues the first will look identical as the matrix doesn't become limited. Then the blues will become progressively lighter, and also the other colors will be affected, the stronger blue component the stronger effect. Hue should stay about the same though.

Your choice of brightness should hopefully have a blue negative factor less negative than −0.20, otherwise you'll have to risk robustness. Note that the -y parameter is just a limiter to the optimizer, the actual value in the forward matrix does not become exactly that number, so do look it up to see what it became you may not need to push as hard as you think. I recommend comparing with in-camera JPEGs. Making blues lighter than those usually doesn't make much sense.

If you think this visual evaluation is hairy you can skip it and let DCamProf do it's default in the matrix limiting, which will cause blues render a bit lighter (assuming the LUT is relaxed) on the problematic cameras.

Another "hardware-related" adjustment is the hue of (deep) blues. Take a look on the blues and purples on the color checker. Are they too red? Probably they're very close to correct, but it's still a matrix-only profile we're looking at so they can be a bit off. If we want to push the matrix optimization in some other direction color-wise than the current result DCamProf has a "target adjustment" configuration file.

We're entering deep water here, adjusting hues to be something different than correct. Again it would be cleaner to save any subjective adjustment to "look design" that we will discuss separately. However there's a reason I ask about the red component in the blues: from experience here is where some cameras can go unstable, more specifically when normal blues are a little red some deep blue colors can become clearly purple, incorrectly so. A more stable behavior can be had if you push the matrix more towards cyan (stronger green content) of the blues.

Generally I don't recommend changing hue at this stage, but if you should change something the first thing to look at would be changing blues for this reason. If you know you'll want to make this kind of adjustment later for subjective reasons and your camera matrix wants a strong negative blue component it can be a good idea to make it already at this stage.

Here's how. Create a JSON text file with the following content:

  {
    "GlobalAdjustments": {
        "AddHuePerHue": {
            "CurveType": "RoundedStep",
            "CurveHandles": [
               [0, 0],
               [210, 0],
               [230, -10],
               [280, -10],
               [300, 0],
               [360, 0]
             ]
        }
    }
  }

Let's call it adjust.json (JSON is a generic format for structured data that is easy to read by both humans and computers, and DCamProf uses that for many of its data files.)

Here we've made a "global adjustment" which doesn't point out any specific patch, it just says that between 230 and 280 degrees hue (CIECAM02 JCh) we should subtract 10 degrees, and then a soft curved transition between 210-230 and 280-300 degrees. Only patches that matches our adjustment will be changed (when you run the software you'll see a list of changes to patches that are made), so it's not a generic modification of the target as such. The reason we do this is because we're using a combined target with lots of patches so it would be messy to point out one by one.

If we would have used only the CC24 target it's generally easier to target patches directly, and here's an example where we do that:

  {
    "PatchAdjustments": [
      {
        "Name": "C01",
        "Class": "cc24",
        "ScaleRGB": [ 0.8, 1.0, 1.0 ]
      }
    ]
  }

It points out the "C01" patch (the deep blue patch on the CC24) and scales the RGB values in ProPhoto space, here reducing red to 0.8 (80%). Lightness is kept constant automatically, RGB scaling is here just provided as a familiar way to adjust hue. Refer to DCamProf's documentation if you want a full description of what you can adjust using this configuration file (you can change lightness and chroma too for example). For a CC24 target adjusting blue with only C01 adjustments is very effective.

However, for our combo.ti3 we need to use the less user-friendly global adjustment. We could choose to use only cc24-ff.ti3 at this stage, but then the matrix would only be optimized for that target, which may be what we want but we don't know that yet.

You may need to exaggerate the adjustment, broaden the range you modify or increase the angle. We're just modifying the target, the matrix optimizer tries to fit "the average of all" as good as possible. It's a trial and error process. A new matrix profile with this adjustment is rendered like this (here assuming we've chosen -y -0.20 earlier):

  dcamprof make-profile -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -t acr -y -0.20 -a adjust.json -L \
    combo.ti3 test-adjust.dcp

Re-run until you've found a desired start color. You could of course use this technique and alter hues of other patches too, to steer the matrix optimizer in the direction you want. In the end it's an impossible problem to solve though, changing one color will affect other similar ones so it may become an exercise in frustration if you try to modify too much. I don't recommend trying to make general subjective adjustments at this stage. If you change anything here it should be to make the camera struggle less and make it more stable. My experience is then that you only need to think about the deep blue colors.

The next stage is to decide how much the matrix should focus on the normal colors, represented by CC24, and our saturated colors, represented by the glossy target. I recommend to put as much focus as possible on the CC24 (possibly solely that) and only include as much weight on Glossy as needed to expand the size of the matrix coverage, while avoiding to significantly disturb the CC24 matching.

This shows the matrix weight optimization plot, with a few different matrix gamuts. The yellow is the original gamut which cuts the glossy patches close on the blue-cyan side. Then we removed bad patches and then we got a new matrix which is the blue one, that is excluding the bad patches immediately gave us a better matrix. We could satisfy with that but I chose to make some custom weighting anyway.

The green is full weight on cc24, the orange full weight on glossy, and black is what I ended up with here, cc24 at 1 and glossy at 0.2.

To do this we (ideally) need to plot. This plot is useful when working with matrix optimization:

 gnuplot> splot 'nve-ref.dat' w l lc "beige", \
   'gmt-locus.dat' w l lw 4 lc rgb var, \
   'gmt-prophoto.dat' w l lc "brown", \
   'gmt-adobergb.dat' w l lc "red", \
   'gmt-pointer.dat' w l lw 2 lc rgb var, \
   'gmt-fm.dat' w l lc "blue", \
   'target-mtxve2.dat' w vec lc "brown", \
   'targetd50-xyz.dat' pt 4 lc rgb var

Here we only plot a reference grid rather than the LUT (nve-ref.dat), and then brown DE error vectors for matrix-only correction (target-mtxve2.dat).

We want short error vectors for the CC24, and we want to have some space between the glossy patches and the matrix limit. Pretty simple. We then generate a preliminary profile with weights and dump data for plotting:

 dcamprof make-profile \
   -r dump1
   -i light.sp \
   -l 0 \
   -x exclude.txt \
   -y -0.20 -a adjust.json \
   -w cc24 1 -w glossy 0.2 \
   -L \
   combo.ti3 preliminary.json

Note that the -y -0.20 -a adjust.json parameters are an example from the blue optimization, use the ones you got (if any). The weights you adjust is the 1 for cc24 and 0.2 for glossy in the example above. This means cc24 is considered 5 times more important than glossy. Try a few numbers, such as 1 on cc24 and 0 on glossy to make the profile to care only about cc24.

As an alternative or complement to plotting you can look at the error stats printed from make-profile, which is printed per class and all together. Here's a snippet:

 Patch matching for class "cc24" (23 patches):

 Matrix patch match average DE 1.44, DE LCh 0.92 0.38 0.75
                     median DE 1.21, DE LCh 0.72 0.30 0.69
                        p90 DE 2.39, DE LCh 2.14 0.75 1.54
                        max DE 3.14, DE LCh 2.91 1.28 2.02

 Patch matching for class "glossy" (47 patches):

 Matrix patch match average DE 2.70, DE LCh 1.43 1.22 1.41
                     median DE 2.16, DE LCh 0.96 0.81 1.23
                        p90 DE 4.57, DE LCh 3.85 3.10 2.49
                        max DE 6.73, DE LCh 4.96 4.40 3.12

The median value is the best value to look at to get an overall feel of how large the error is, the 90th percentile shows how bad it becomes for the less well matched patches, and max is the worst case.

Here is the same stats if we choose to put full weight on glossy and zero on cc24:

 Patch matching for class "cc24" (23 patches):

 Matrix patch match average DE 2.39, DE LCh 1.16 1.20 1.16
                     median DE 2.05, DE LCh 0.93 0.70 0.63
                        p90 DE 4.84, DE LCh 2.94 3.60 2.34
                        max DE 6.37, DE LCh 3.34 6.35 3.23

 Patch matching for class "glossy" (47 patches):

 Matrix patch match average DE 3.51, DE LCh 2.78 1.42 1.40
                     median DE 3.31, DE LCh 2.65 1.43 1.23
                        p90 DE 4.92, DE LCh 4.32 2.01 2.74
                        max DE 5.86, DE LCh 5.34 3.24 3.16

We see here that the cc24 matching gets a bit worse, but not drastically worse, while glossy matching becomes less bad in the worst case, but actually worse median. This may seem illogical, if the matrix does its best to match glossy shouldn't the results improve more, and why doesn't cc24 get that much worse? The reason is simply that the cc24 set with its less saturated colors are easier for the camera to match, while glossy are tough to match linearly, regardless how hard we try. This means that the result of the weighting can seem somewhat "random". My suggestion is that don't see the stats for the glossy that important, rather look at the cc24 stats that it doesn't get much worse, and that we have some space in the plot between the matrix border and the glossy patches.

Note that although -L makes sure we only show matrix stats in the output, the profile will contain a LUT, which has maximum correction as -l 0 is provided (meaning that the actual result matrix + LUT stays about the same regardless weighting). We won't use the LUT in this preliminary profile though, we do that separately. When we relax the LUT, which we will do, it will come closer to our designed matrix.

Find suitable trade-off between accuracy and smoothness

Result after our manually tuned step-by-step relaxation. Now we see the black error vectors (representing CIEDE2000 color errors), and the olive LUT stretch vectors are shorter than in our first un-relaxed LUT.

We see the typical result that high saturation colors become a bit less saturated when we relax. This is most clearly seen in the cyan-green range, where the black error vectors point towards less saturation, while the olive LUT stretch vectors still point in (roughly) the opposite direction meaning that we have still kept some of the saturation correction, so the error is less than it would be with a matrix-only profile.

With a preliminary profile (with final matrix) and ability to plot and view we can now iteratively improve the profile until it looks good in the plot. First we make two reference profiles to visually compare with later on, one "exact" (no LUT relaxation) and one matrix-only (-L flag):

 dcamprof make-dcp -d "no relax" \
   -n "Canon EOS 5D Mark II" \
   preliminary.json no-relax.dcp
 dcamprof make-dcp -d "matrix-only" \
   -n "Canon EOS 5D Mark II" -L \
   preliminary.json matrix.dcp

We also copy the native profile to a separate file so we can import the final matrices from there:

 cp preliminary.json matrix.json

Then on to LUT relaxation: we want to relax sharp bends in the LUT while keeping accuracy where it counts. The cc24 set corresponds to the normal range and the colors we consider the most important, and then we have the glossy set of saturated colors which we can relax a bit more.

It's often an advantage to relax fitting of the cc24 too though, so we experiment with increasing the overall max acceptable DE for the cc24 set as well, not just the glossy set. In many cases you can achieve some relaxation of the LUT with an undetectable increase in color accuracy error.

Here's some general guidelines:

The LUT is relaxed per class using the -l parameter with five DE values each:

  1. Max acceptable negative lightness error (how much darker the patch may be).
  2. Max acceptable positive lightness error (how much lighter the patch may be).
  3. Max acceptable negative chroma error (how much desaturated the patch may be).
  4. Max acceptable positive chroma error (how much over-saturated the patch may be).
  5. Max acceptable hue error.

Setting the values is a trial and error process, looking at the plot after each adjustment. After some iterations I ended up with this:

 dcamprof make-profile -r dump1 -x exclude.txt -m matrix.json \
   -l cc24 -100,100,-1,0.5,0.5 -l glossy -100,100,-5,2,2 \
   -i light.sp combo.ti3 final-1.json

That is lightness axis is disabled (-100,100) very small errors accepted on the CC24, and some larger errors on the glossy set particularly letting it desaturate the patches quite much. All according to the guidelines above.

In addition to looking at the plot, I also recommend to look at the matching statistics that DCamProf puts out on the console when you render a profile. This is the same as for when we designed the matrix, but as we don't have the -L parameter the stats will show the result after the LUT is applied. Here's a snippet:

 Native LUT patch match average DE 1.94, DE LCh 1.09 0.83 1.04
                         median DE 1.66, DE LCh 0.82 0.87 0.80
                            p90 DE 3.91, DE LCh 2.74 1.46 1.94
                            max DE 4.76, DE LCh 3.88 3.02 4.24

The plot's error vectors say more, but I think looking at these overall stats (per class) helps to see in a few values how much precision is hurt when we relax more. We also see the errors split in Lightness Chroma and Hue, in general you can accept most in terms of lightness errors, and least in terms of hue.

As a sanity check you can make one run which shows the matrix only result (-L) so you have that to compare to.

The more saturated a color is the larger error we can generally accept, while we want colors close to neutral to be accurate. To see this we need to look at the plot.

In the dump directory you can also find matching reports for each individual patch in the form of TIFF files. I usually don't view them myself, but you may find them useful as they give you visual representation of the error. The files are named patch-errors*.tif, the same patches in all but sorted on overall, hue, chroma and lightness errors respectively.

Evaluate the result

Here's an illustrative example of the differences between the no-relax.dcp (exact, with possible smoothness issues), matrix.dcp (matrix-only) and the final relaxed profile as applied on the image of the glossy target. We use the target as the test image as it samples colors in a grid over a wide gamut. As the image is an animated GIF limited to 256 colors you see dithering artifacts, so this is only intended to show what type of differences you will see and how large they typically are.

Ironically when you do A/B comparison like this you will notice that lightness differences are the easiest to notice, but at the same time they are typically the least likely to be disturbing for general-purpose photography. That is while hue and saturation errors can look "wrong" without having anything to compare to, lightness errors are easy to detect when comparing but don't look wrong if we have no reference.

We can also see that the matrix-only profile provides a quite good result, which is expected for any reasonably modern camera. It's typically a bit low on saturation and have quite some lightness errors, but it rarely has any disturbing hue errors. You may very well decide that the matrix-only result is good enough, but if so please note that when we later apply a tone curve we will still need a LUT to compensate the negative color appearance effects introduced by the curve. So we can argue that as we're going to have a LUT anyway we can have a correcting LUT as well even if it's not making a huge difference.

Let's convert the native format to a DCP (one without curve, and one with curve) so we can use it in our raw converter for visual evaluation:

 dcamprof make-dcp -d "Final 1 linear" \
   -n "Canon EOS 5D Mark II" \
   final-1.json final-1.dcp
 dcamprof make-dcp -d "Final 1 curve" \
   -t acr \
   -n "Canon EOS 5D Mark II" \
   final-1.json final-1-curve.dcp

With the profile ready it's wise to sanity check the result with the no-relax profile and matrix-only profile we rendered earlier. Ideally it should have noticeably better high saturation correction than the matrix-only profile, and not lose too much accuracy compared to the profile without relaxation.

It's likely that the final profile will be closer in look to the matrix-only profile than the no-relax profile. The reasons for this are that we have put our focus on the important normal range of colors and those are generally quite well corrected with only a matrix, and that we have prioritized smoothness over accuracy bringing us closer to a matrix result. There should be some accuracy improvement though.

You can use RawTherapee for evaluation, I then usually look at the glossy target shot as it samples a wide gamut and that way I get an overview where the errors are.

DCamProf will output statistics when generating the profile, but you can also test a finished profile with the test-profile command. If we don't provide the test target it will only make some basic tests and dump a test gradient, but as we have the test target we can provide that too and then the matching performance is tested:

 dcamprof test-profile -r dump1 -i light.sp \
   combo.ti3 no-relax.dcp
 dcamprof test-profile -r dump2 -i light.sp \
   combo.ti3 matrix.dcp
 dcamprof test-profile -r dump3 -i light.sp \
   combo.ti3 final-1.dcp

In the dump directory you can find some TIFF files, the graphical patch matching reports (patch-errors*.tif, different names for different sortings) can give you some insight into how large the color differences are to your eye. The test gradient is named gradient.tif. I usually don't evaluate that at this stage though. Often the no-relax LUT looks smooth enough on the test gradient, at least at first glance. I think it's easier to see smoothness issues at this stage by plotting the LUT as we've done earlier. I use the test gradients frequently when developing a subjective look though, for the reason that those LUTs are 3D and thus hard to view in a plot.

Comparing plots between the different profiles and looking at the black error vectors is a good way to get a quick overview of the errors and differences in correction between the profiles. I don't think we need to get too deep into this evaluation though, especially if we intend to add a subjective look on top.

If you think that the matrix result is already good enough you can of course choose that one. The advantage of the matrix profile is that it's extremely robust guaranteed to be without smoothness issues. When we add a curve later on, and possibly some subjective look adjustments, there will be a 3D LUT added on top anyway, but if you want we can have a matrix-only profile as the base (to avoid clipping DCamProf will use a LUT also in the "matrix-only" case, but that's a purely format-technical issue).

If you disassemble the final DCP you will notice that there is value scaling in the LUT even if you have disabled the lightness axis. This is because the DCP LUT works in the RGB-HSV space, and DCamProf works in a space with better perceptual uniformity, meaning that a flat lightness plane will not be entirely flat in the RGB-HSV space. The deviation is small enough to not cause any problem though.

Color constant behavior

If your daylight is close to D50 or of unknown temperature you may choose to apply color-constant behavior (-C) to make-profile. This makes sure no CAT (chromatic adaptation transform) is applied so colors will look exactly as if shot under D50 even if the actual light is a bit different. This typically makes sense for a generic daylight profile intended to be used in various types of daylight. Another way to achieve the same thing is to simply specify that the light was D50 even if it wasn't. That will hurt the precision of the color temperature estimation ability of the DNG profile though, so I don't recommend that if you have the possibility to provide the actual illuminant spectrum instead.

Personally I usually don't provide the -C parameter, as if the light is close to D50 the changes will be minimal anyway, and if it's far from D50 I don't mind that the color inconstancy aspects of human vision is modeled. If you want more background to this I suggest reading the section about chromatic adaptation transforms in the DCamProf reference manual.

Step 7: making the tungsten profile

The tungsten profile is made in the same way as the daylight profile, so just re-run the workflow. You may notice that the camera struggles more to match, so you may need to relax more than for the daylight profile. This is the reason I started out with the daylight profile, so you got some experience with the "easier" case first.

I used a setup with a tungsten halogen lamp. Some observations from my run:

I ended up with the following command:

  dcamprof make-profile -r dump1 -m matrix.json -x -x exclude.txt \
    -l cc24 -100,100,-1.5,1,0.8 -l glossy -100,100,-5,2,3 \
    -i light.sp combo.ti3 final-2.json

Also in this case the dark skintone patch of the CC24 had to be excluded. This is not always the case though, when I've made profiles for other cameras the matching has been good.

Step 8: choose a tone curve and exposure offsets

When we reproduce a scene on screen or on paper the luminance is typically lower which leads to that the eye experience the image as lower contrast, a bit dull even, this even if the (mid-tone) contrast is 100% accurate. This is a normal perceptual phenomenon and the solution is as old as photography: we apply an S-shaped contrast curve. Today there are much more advanced models than a curve, but all currently established raw converters still use the curve concept. In digital photography the curve compresses highlights more than shadows as that suits the linear sensor behavior better, but the principle is the same as it was on film. By compressing highlights and shadows we get increased midtone contrast so the whole image seems to have higher contrast, and we can get a better perceptual match with the original scene.

A less known side effect of applying contrast is that the appearance of colors change. In human vision contrast and color appearance is tightly connected which means that if we want to retain the original color appearance when changing global contrast we must make some adjustments to the colors. Broadly speaking higher contrast requires higher saturation. Suitably increased saturation happens to be a natural side-effect of a basic RGB curve which is what's been traditionally used in digital photography. However an RGB curve will overdo saturation and it will also distort color so it's far from perfect, in fact there is still today no broadly used standard curve that is reasonably perceptually accurate. It's actually not possible to make it 100% accurate, as that would require image-dependent local adjustments which a camera profile can't do.

DCamProf provides its own custom curve, a "neutral tone reproduction operator" to make it possible to embed a curve without distorting color appearance, and I think this is one of the more important features. Without that it doesn't matter how accurate we make our profile, as soon as we apply a curve in the raw converter the perceptual accuracy goes down the drain. And no, applying contrast in the Lab or HSL lightness channel will not cut it (although it may work well for smaller adjustments or for creative effect). As I also contribute to the RawTherapee project, there's now actually a "perceptual" curve there which is based on DCamProf's neutral tone reproduction operator (a bit simplified), so for RawTherapee you can provide a profile without a curve and instead apply it using the built-in curve adjustment, but as far as I know RawTherapee is unique in this aspect. For convenience you may still want to embed it in the profile though and the curve in DCamProf while similar is not exactly the same as in RawTherapee.

For a longer more detailed discussion on how tone curves affect color, see the tone curve section in DCamProf's reference manual.

Anyway, in order to make our profile fit for all-around photography we need to have an S-shaped tone curve to apply some contrast. So which shape to choose? With Adobe Camera Raw and the DNG reference code comes a standard curve which is used in many of Adobe's own profiles and it's also available as a built-in choice in DCamProf. It will provide a good result and if you don't have some special need I suggest using that (-t acr provided to make-dcp).

The typical reason to want some other curve is to better match the look of in-camera JPEGs. This can indeed be important. With Adobe's curve the look may become significantly brighter or darker than the in-camera JPEG, and while it's okay if you will "expose to the right" (ETTR) manually anyway (common for planned photography shot from a tripod), the camera's auto exposure is of course tuned for the in-camera JPEG curve. That is to get good results without adjustments you need the curve to match what the camera expects.

For DNG profiles there are actually three parameters for this, the curve itself, a baseline exposure offset and a black render tag. The DNG raw image file can also in itself contain a fixed baseline exposure which is added to the offset in the profile, at least if you're using Adobe's products. The exposure offsets and black render tag may or may not be supported by your favorite raw converter, so they may or may not be usable. The curve is generally supported though if the converter has any decent DNG profile support.

The baseline exposure offset is sort of redundant as a curve can also include an exposure offset (it's just the average slope of it), but if the offset is large the curve gets an extreme shape which is hard to design so in that case it can be easier to separate them. The same can be said about the black render tag. That tag does not quantify an offset, it just tells the raw converter if it should make an automatic black subtraction (that is clip away darkest shadows if there is no detail there) or leave as is.

Matching the curve used by the camera

A typical tone curve for digital camera profiles designed as a spline with three control points (plus start and end) in RawTherapee's curve editor.

How to get the curve from your camera? Obviously we could shoot a backlit step wedge and make a precise measurement-based match that way, but there's no real need to make an exact match, we won't have the exact camera appearance anyway concerning color. We just need to make a curve that has about the same brightness and contrast as the camera so when we use the camera's auto exposure we get a good result.

To do this I think visual matching works well, and you can use RawTherapee for that.

  1. If possible set the camera to write JPEGs together with the raw.
    • If possible set color space to sRGB, unless you know what you're doing and can display the JPEG properly with AdobeRGB (or whatever the other color space is).
  2. Shoot basic sunny outdoor scenes with both highlights and shadows.
    • It should be contrasty, but avoid back light.
    • Avoid extremely saturated colors as they will exaggerate differences between profiles and make it harder to match curves.
    • Preferably shoot more than one so you have a few to test.
  3. If you're using a DNG workflow, convert the raw to DNG using your chosen DNG converter (it may add a baseline exposure offset tag).
    • If you use DNG files with non-zero baseline exposure and you intend to honor that (as Adobe Camera Raw does), make sure you apply corresponding exposure in RawTherapee (at the time of writing RawTherapee ignores any baseline exposure in the DNG file, but this might change).
  4. If you couldn't get JPEGs directly, use for example exiftool to extract the embedded preview image from the raw. If the color space is not sRGB you may need to attach a profile to it (usually AdobeRGB) which can also be done with exiftool.
    • Make sure you get the camera's preview, not a re-rendered preview made by your DNG converter if you're using that.
    • exiftool -b -PreviewImage -w _preview.jpg _MG_0715.CR2
    • exiftool "-icc_profile<=AdobeRGB.icc" _MG_0715_preview.jpg
    • Test -ThumbnailImage or -JpgFromRaw instead of -PreviewImage if you don't get any output or get a tiny thumbnail image.
  5. Open the raw file in RawTherapee and bring up the JPEG side by side on screen, either by launching another RawTherapee instance and open the JPEG there or bring it up in an image viewer.
  6. Apply (Neutral) processing profile so you get a clean start.
  7. Fold out "Tone curve 1" by choosing "Custom" (which is a spline curve).
    • "Curve type" can be set to any, some are more saturated than others, try one that matches the look of the camera JPEG the best (makes it easier to match curve, optionally use the saturation slider to make a better match).
    • You can make the panel wider to make the curve larger and easier to fine-tune.
  8. Add three control points to the curve, and make an S-shape similar to the one shown in the screenshot, it's a good starting point.
    • You can also load this example acr.rtc which is almost exactly the same as the Adobe Camera Raw default curve.
  9. Look at the darkest shadows in the JPEG and see if it's likely some black subtraction has been made. If so match as well as you can with the "Black" slider.
  10. Is your image considerably darker? Adjust "Exposure compensation" to make a better match.
    • Small offsets like 0.1 – 0.2 stops can typically be solved by brightening using the curve, while above that then it's better to have an exposure compensation.
  11. Fine-tune the curve to match by moving and adding control points. Try to keep down the number, as the more you have the harder it becomes to make it smooth.
  12. Save the curve to an .rtc file.
    • The .rtc file can be used directly by DCamProf.
  13. Write down if you had to adjust the black slider and how much exposure adjustment you needed if any.

It is indeed hard to make an exact match, but it's not important. This is just about getting predictable results from the camera's auto exposure. It's more important that you like the shape of the curve, that it has suitable contrast and shadow compression. I often find it desirable to keep a little more shadow detail than camera JPEGs do for example.

If you had to adjust black subtraction and/or exposure you have some choices to make. Either you make a processing profile for your favorite raw converter that contains these presets, or you include the settings in your DNG profile. What is best depends on the feature set of the raw converter (if it supports the offset DNG profile tags or not, and how presets are managed) and what you prefer.

You can also try to reshape the curve to compensate for any black subtraction and exposure offset.

If we start with black subtraction this can be 100% mirrored with a curve, but it will then irrecoverably cut shadows. It's better to just add an extra handle for the darkest shadows and compress a bit more there. Your will undoubtedly get a less contrasty look in the shadow range this way, but also more shadow detail which you may prefer anyway.

The exposure offset can also be mirrored with the curve but again not without unrecoverable clipping, so you could instead just increase highlight compression to increase brightness overall to match.

In general I think embedding an exposure offset in the profile makes more sense than black subtraction, especially since black subtraction cannot be set as a specific number but the result will instead vary between raw converters. My recommendation is thus combine the curve with an exposure offset if it makes sense, but try to avoid black subtraction.

The total baseline exposure should rather not be negative. That is the file's baseline exposure plus the profile's baseline exposure offset should be zero or positive. If you make it negative you will force the raw converter into showing potentially clipped highlights which is not a good default.

Notes on baseline exposure

The DNG specification has two baseline exposures, one that is stored in the DNG file itself, "baseline exposure", and one in the profile "baseline exposure offset". The latter was introduced in version 1.4 of the standard, prior to that baseline exposure could only be embedded in the DNG.

This is an unfortunate situation, if you ask me it's a poor design choice made by Adobe. One explanation I've heard is that depending on factors such as ISO the baseline exposure may vary, and as the profile is the same regardless of ISO the DNG file must itself contain a baseline exposure. However the DNG spec does not specify how it should be used so the DNG converter may very well put in a fixed offset which would rather be present in the profile.

For most cameras there is no reason to have different baseline exposures for different ISOs (or other settings), and then the baseline exposure is 100% related to the profile, as it will depend on the curve shape which number you want. Naturally Adobe's DNG converter will embed a baseline exposure tag with its DNG files that is adapted to work with Adobe's proprietary profiles, and it may not really suit your profile.

It would be much better if the DNG profile itself specified all the baseline exposure, which it can with the new baseline exposure offset tag which is stored in the profile. Unfortunately the specification says that it shouldn't override the DNG file tag, but just add an offset to it and that is what happens in Adobe's products. This means that you still need to know what value your DNG converter will put there, and if your raw converter cares about the value. Many raw converters can do both DNG and native raw. The native raw file has no baseline exposure offset, meaning that a DNG profile may need a different baseline exposure offset when used with native raws than when used with Adobe's DNGs (unless you use Adobe's products which have the values hard-coded).

I recommend to test your favorite raw converter to see how it reacts to baseline exposure, it's not certain that it will care about the value in the DNG file. It's not unlikely that you may need one offset for Adobe's products and a different offset for others.

Step 9: merging into a dual-illuminant profile

To make the finished dual-illuminant profile we simply combine the two single-illuminant ones. It's important that the first profile is the one with the lower temperature, that is tungsten in our case.

  dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile" -i StdA -I D50 \
    -b 0.3 -t curve.rtc -g adobergb-strong \
    final-2.json final-1.json final-dual.dcp

Here we add the exact camera name and embed a custom contrast curve we got from the RawTherapee workflow (use -t acr to use Adobe Camera Raw's default tone curve). We also add a baseline exposure offset of 0.3 which we got in the curve workflow. Per default DCamProf will via the black render tag instruct the raw converter to not do any automatic black subtraction, but if you want that to happen include the -B flag. You should have made that decision when you chose the curve.

I've added -g adobergb-strong which will make a gamut compression towards AdobeRGB. You may or may not want that (I think most will as most raw converters today expect some gamut compression in the profiles). You can use a weaker variant -g adobergb if you desire, but the stronger variant is closer to what you see in most commercial profiles.

Also note that we specify the illuminant names, StdA and D50 in this example (they should be as close as possible to the lights you actually used), as the input profiles only have "Other" as tags as custom lights were used.

Now we've completed the workflow and the profile is now ready to use in your favorite raw converter, unless you also want to design and embed a subjective look, which we discuss separately.

Avoiding white balance shift

Due to a less fortunate design choice, Adobe Lightroom does not store raw white balance multipliers for custom white balances, but rather temperature and tint. As each profiling workflow has slightly different light and DCamProf's matrix optimization is not the same as Adobe's proprietary in-house profile maker the resulting profile will have different color matrices from Adobe's bundled. As a consequence it will estimate temperature and tint differently, possibly with quite much differently (as the estimation is by nature very imprecise). This means that if you open a raw where you have set a custom white balance and then change profile to your new one you will get a white balance shift. This had not happened if Lightroom had stored the white balance multipliers itself, which it does if the white balance is kept at "As shot".

If you're a Lightroom user or use a converter with the same behavior you may want to skip using DCamProf's temperature estimator and instead copy the one from the old profile. You do this by adding -m old.dcp parameter to the final make-dcp command. For dual-illuminant profiles this will also overwrite the specified illuminants, as those must be the same as the reference in order to provide the same temperature estimation. If those does not match the illuminants used in your workflow you get a shift in how forward matrices and correction LUTs are mixed for intermediate white balances, the effect on color is normally negligible though.

For example if you have StdA and D50 and you copy from a bundled profile that has StdA and D65 (the typical scenario) you don't need to worry about the mismatch, the effect is negligible.

If you don't need the white balance of your new profile to exactly match the bundled or other profile, you skip this of course.

Simpler workflows

Adding an extra custom target with super-saturated colors doesn't make a huge difference to the profile. The reason is that cameras are worse at matching those colors, and to retain smoothness we need to compromise and relax the LUT, which brings us closer to the result with only lower saturation colors.

In other words a profile made with only the CC24 will be of high quality too. The print quality and stability of those targets are good as well, so if you don't have a spectrometer to make your own reference file it's fine to use the bundled CC24 reference file that comes with DCamProf.

If you don't have a spectrometer to measure the light source(s) there are some minor implications, discussed in the measuring light temperature section. Approximate guesses of light source temperature (and spectrum) will generally not hurt color correction performance in any significant way, but can hurt a DNG profile's ability to correctly estimate light temperature of a scene illuminant. For personal use this generally doesn't matter, but it you make a profile distributed to others your users may expect a good light temperature estimation and then it may be worthwhile to get that spectrometer. It's worth noting though that light temperature estimation will regardless not be very exact, and maybe you end up copying the color matrices from the old profile anyway as discussed in the avoid white balance shift section.

The workflow summaries section outlines both the full workflow and a few simpler ones.

The easy way

Since many will ask for it, here's the simplest possible way to make a profile with good result. We make a single-illuminant D50 or D65 profile as that's most all-around.

First get hold of raw a shot of the standard 24 patch color-checker (CC24) in some sort of daylight (real or artificial) for your camera. If you can't do it yourself you can quite often find it on the net. The Imaging Resource camera reviews is a good place to start. Imaging resource also have shots of a larger semi-glossy color checker target, but the shots generally suffer so much from glare that the semi-glossy target is virtually unusable (I've tested a few and all suffered heavily, but it may not apply to all). Anyway, choose a shot of the matte CC24 — it's the most robust and provides good solid results. The Imaging Resource web site can be a bit hard to navigate and the raws hard to find. Raw shots are typically found in the "thumbnails" section. Pick one shot at the base ISO.

If you shoot the CC24 yourself, shoot it outdoor on a sunny midday (D50), or midday in overcast weather (D65). Have as even light as possible on the target, shoot at f/8, use a lens shade, cover up the viewfinder and have the target quite small in the center of the frame.

Warning: X-Rite changed their colors slightly for all targets produced November 2014 and later. Make sure your reference file matches. DCamProf is distributed with a reference file for both the old and the new. If you are unsure which one you have, it doesn't matter that much if you happen to pick the wrong one as they are quite close.

An image for a CC24 cropped and converted ready to be scanned with the scanin tool. It looks dark due to the linear gamma, and the green cast is there because a camera's green channel is the most sensitive at the raw level.

An image of the ColorChecker Passport ready to be scanned, note that it must be fully open with both pages visible even if we will only use the CC24 part of it. It's also important that it's oriented in the way shown. This image has some residual perspective distortion, but scanin can usually handle it by using the -p parameter.

Then rotate and perspective correct (if required) and crop the shot so you have a perfectly aligned and framed CC24, and export to a "raw" TIFF without white balance. Name it cc24.tif. You can use RawTherapee (recommended as it provides rotate and crop functions) or DCRaw. More details on converting to a "raw" TIFF is found in step 4 of the tutorial. The DCRaw command to make a linear conversion is:

 dcraw -v -r 1 1 1 1 -o 0 -H 0 -T -6 -W -g 1 1 <rawfile>

Use Argyll's scanin tool to read patch values (the first command for CC24 targets produced before November 2014, the other for targets produced November 2014 and later):

 scanin -v -p -dipn cc24.tif ColorChecker.cht cc24_ref.cie
 scanin -v -p -dipn cc24.tif ColorChecker.cht cc24_ref-new.cie

If you have shot a ColorChecker Passport instead of the larger ColorChecker your image should contain it fully open with both pages so it can be recognized in the scanning (only the CC24 part will be used here though). The image should be rotated so the colorchecker text is read normally left-to-right. The passport has slightly different shape of the patches than the larger colorchecker so you need to use the corresponding .cht file:

 scanin -v -p -dipn cc24.tif ColorCheckerPassport.cht \
   cc24_ref-new.cie

The cc24_ref.cie / cc24_ref-new.cie file is found in DCamProf's data-examples directory, and ColorChecker.cht / ColorCheckerPassport.cht comes with Argyll. The scanin command above will produce the file cc24.ti3, and the diagnostic diag.tif TIFF image which you look at to see that the patch matching succeeded. The scanin tool is sensitive on target alignment and cropping. Failed scans of an "almost" perfectly aligned target is common. If scanning fails looking at diag.tif which may provide leads to what the alignment problem is.

Make a DCamProf native profile:

 dcamprof make-profile -i D50 -C cc24.ti3 my-profile.json

Replace -i D50 with -i D65 if the latter is more true to the light that was used. DCamProf will auto-relax the profile's lookup table in a suitable way, to prioritize smoothness over accuracy.

Convert the native profile to a DCP, and apply a tone curve using DCamProf's neutral tone reproduction operator that strives to maintain a neutral and realistic color appearance despite the curve:

 dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile" \
   -t acr -g adobergb-strong my-profile.json my-profile.dcp

Replace the camera name above ("Canon EOS 5D Mark II") with the exact camera name for your particular camera, and "My Profile" with what you want the profile to be called. The camera name must match what the raw converter is expecting. You now have a general-purpose profile with realistic color reproduction ready to use.

So how high quality will this profile have? Assuming the CC24 shot is okay, it will provide the same overall look as a profile from the more elaborate workflows. It will have a little less precision as we use the automatic defaults that relax (smoothen) the LUT at bit more (for robustness), and we have shot the CC24 in a less rigid setup.

I'd say that it will look more natural than what you get from typical consumer software, thanks to the neutral tone reproduction operator, a feature that is lacking in most (all?) currently available commercial consumer profiling software.

The profile DCamProf renders per default strives to be as true to the original colors as possible, and that is what you've got in this workflow. If you want to adjust on that you can design an own look and embed in the profile. This is a quite difficult task which is discussed separately in the subjective look section. However, you may not need to: I've designed an all-around subtle look that I think many will like out of the box. I think looks should be subtle, and this one is so subtle that you may not see any difference at first glance, but if you do A/B swaps you'll see it. The look is stored in the neutral-plus.json file, and it's documented in its comments what it does (open and read). It's called "Neutral+" as it intends to be "better than neutral, but still neutral" rather than adding a distinct look. If you want to try this look you provide it when you render the DCP:

 dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile+" \
   -t acr -o neutral-plus.json my-profile.json my-profile+.dcp

The configuration itself also contains a gamut compression towards AdoberRGB so you don't need the -g adobergb-strong parameter used before.

I warmly recommend to make both the neutral profile, and then this "neutral+" too and compare to see how you like the concept of having a subtle look embedded. Although my personal taste of course have affected the design and that may differ from yours, there's no controversial elements in it. The type of adjustment I do can be found in other profiles too. My intention has been to design something broad, just as if I'd been doing a bundled profile for a commercial raw converter.

And then a final note on white balance shift in Adobe's products when a custom white balance setting is used: for a profile to produce the same white balance as Adobe's own profiles it must have the exact same color matrices. I think this is a design flaw of their products, but if you are a Lightroom user you may want to compensate for that. If so add the following -m adobe.dcp to the make-dcp command line where you replace adobe.dcp with the native Adobe Standard profile provided with Adobe's camera raw. Note that tint shifts can still occur, especially for low temperatures far from "daylight" as the profile generated here is a single illuminant profile for daylight (unless you used some other test shot), and Adobe's bundled profiles are dual-illuminant.

Where to install your profiles? Depends on your raw converter, check its documentation. If it's Adobe Lightroom / Camera Raw: Microsoft Windows: C:\Users\<username>\AppData\ Roaming\Adobe\CameraRaw\CameraProfiles, and Apple OS X: /Users/<username>/Library/Application Support/Adobe/CameraRaw/CameraProfiles/. These are hidden directories so you may need to make some trick to make them show (don't make me google it for you). You must restart Lightroom for it to detect new files. If the profile isn't listed make sure you have named the camera correctly (-n parameter).

Making an ICC profile

If you want to make an ICC profile instead, you can reuse most steps in this DNG profile tutorial. However towards the end there are some specific ICC steps, and worse, they may differ between converters as the use of ICC profiles in raw conversion is less well standardized than the use of DNG profiles.

You can't make dual-illuminant ICC profiles, instead you make one profile per illuminant you want to support.

For now you have to turn to the DCamProf reference documentation to get help with most ICC-specific aspects. One of the best ICC-supporting raw converters is Phase One's Capture One and that has been a reference converter when developing DCamProf's ICC feature set. So here follows a basic workflow specifically for Capture One:

The easy way, for Capture One

As DCamProf has received quite some interest from Capture One users I provide here a quick and easy (as easy as it can be) workflow for it. By taking in elements from the main tutorial you can expand on this if you like.

Note that Capture One is not by any means "representative" for an ICC-using raw converter. It's alone with its special format of ICC profiles, which means that an ICC profile made for Capture One can only be used there.

Also please note that this workflow won't work for Leaf digital backs, as they have an own type of color pipeline and its own ICC profile format (inherited from Leaf Capture which was discontinued when Phase One bought Leaf). Phase One also put some effort in locking out competing medium format products so profiling any of those will probably not work either. All Phase One cameras and non-medium format cameras should work though, as far as I know.

Now let's get to work; first get a raw shot of the standard 24 patch color checker (CC24), lit by some sort of daylight, either shoot one yourself or find one on the net. How to do that you can read about in the DNG version of the easy way.

Note that as Capture One uses a curve on the raw data before feeding it to the profile, an ETTR exposure is actually not ideal as it will compress the highlights. Instead strive for the white patch to be around value 240 in Capture One.

Open the raw file in Capture One, crop the image so only the CC24 is visible, and rotate it so it's perfectly vertical (or horizontal). Perspective correct if required, it must look flat and regular, otherwise Argyll can't match it.

Select ICC profile: "Phase One Effects: No Color Correction", and curve: "Linear Response" (don't use "Linear Scientific"). White balance setting doesn't matter so you can leave it on "as shot" (DCamProf will know which patch that is white and automatically compensate). Then export using "Export variants", and select "16 bit TIFF", and "Embed camera profile". You now have a TIFF file, let's call it cc24.tif. To prepare for a later step in the process export another file in the same way, but select the standard film curve, "Film Standard" or "Auto". Let's call that file curve.tif.

Use Argyll's scanin tool to read patch values from cc24.tif. The command below is shown in two versions, the first for CC24 targets produced before November 2014 (using the cc24_ref.cie reference file) and the other for targets produced November 2014 or later (using the cc24_ref-new.cie reference file). Find out when your CC24 target was printed and run the appropriate command:

 scanin -v -p -dipn cc24.tif ColorChecker.cht cc24_ref.cie
 scanin -v -p -dipn cc24.tif ColorChecker.cht cc24_ref-new.cie

If you have shot a ColorChecker Passport instead of the larger ColorChecker your image should contain it fully open with both pages so it can be recognized in the scanning (only the CC24 part will be used here though). The image should be rotated so the colorchecker text is read normally left-to-right. If uncertain of how it should be oriented, see the example picture in the DNG version of the the easy way (note that the exported pictures here won't be as dark or have the green cast though). The passport has slightly different shape of the patches than the larger colorchecker so you need to use the corresponding .cht file:

 scanin -v -p -dipn cc24.tif ColorCheckerPassport.cht cc24_ref-new.cie

The cc24_ref.cie / cc24_ref-new.cie file is found in DCamProf's data-examples directory, and ColorChecker.cht comes with Argyll. The scanin run will produce the file cc24.ti3, and the diagnostic diag.tif TIFF image which you look at to see that the patch matching succeeded.

To make a profile DCamProf needs to have linear RGB data from the camera. Capture One doesn't provide that, instead it always applies an encoding curve (to work around integer precision issues). This has nothing to do with the "film curve" you select inside Capture One, but just an internal encoding curve which is not visible in the software. Fortunately Capture One embeds this curve in the TIFF so DCamProf can extract it and reverse the effect and thus get linear RGB data. So we re-process the cc24.ti3 to linearize the RGB values, by extracting the encoding curve (called "transfer function") from the TIFF:

 dcamprof make-target -X -f cc24.tif -p cc24.ti3 linear-cc24.ti3

If DCamProf complains of a missing transfer function when running this command then the cc24.tif was not exported properly from Capture One, it must contain the TransferFunction tag. After the successful make-target command we got linear-cc24.ti3 with the linear RGB values so we can make the profile in the same way as in the normal workflow:

 dcamprof make-profile -i D50 -C linear-cc24.ti3 my-profile.json

Replace -i D50 with -i D65 if the latter is more true to the light that was used in the CC24 shot.

Now we've completed the easy part. What is left is to convert this profile to an ICC profile which works like Capture One expects a general-purpose profile to work. Capture One allows you to select "film curve" separately, but the profile itself should also have some curve in it (disclaimer: I haven't looked at all Capture One's profiles, so there may be exceptions!). That curve is merged into the profile's 3D lookup table so it cannot be easily extracted, meaning that you have to design it manually instead.

Now we will be using the curve.tif file exported earlier. DCamProf can compare this file with the file with linear curve (cc24.tif) and that way figure out the shape of the embedded tone curve:

 dcamprof tiff-tf -f cc24.tif curve.tif tone-curve.json

The tone curve is now stored in the file tone-curve.json. When you run this command DCamProf may warn that the curves don't end at 1.0, don't worry about that, it's normal for Capture One and is automatically compensated for.

Now we have all we need to make a preliminary ICC profile:

 dcamprof make-icc -f curve.tif -t tone-curve.json \
   my-profile.json prelim-profile.icc

The encoding curve and the tone-curve will cancel out each-other so the result is linear, but DCamProf needs to know which curve it will be used with in order to adjust color appearance properly, that's why we provide the curves like this.

Copy prelim-profile.icc to where your Capture One stores custom ICCs, which is C:\Users\<username>\AppData\Local\CaptureOne\Color Profiles on Windows, and /Users/<username>/Library/Colorsync/Profiles on Mac OS X. These are hidden directories so you may need to make some trick to make them show (don't make me google it for you). Then restart Capture One, and you will find the profile under "Other".

Lightly S-shaped curve made manually "by eye" using the Curve Tool inside Capture One, to match our desired end contrast. The coordinates in the nodes are then transferred to a JSON file which is used when the final ICC profile is rendered by DCamProf.

Open a "representative" file with a good amount of contrast and apply the preliminary profile, and the film curve you have chosed. Then duplicate this file and apply Capture One's bundled profile on the other. Compare them, I think it's easier to do it by swapping than bringing them up side by side. You will then probably notice that the preliminary profile has slightly less contrast than Capture One's bundled profile, despite that we use the same curve on both. This is because the profile itself apply a curve. If you don't see a difference or is just happy with the way it is you don't need to do anything more, then the preliminary profile is the final one. Otherwise on to the difficult step:

Use the curve tool inside Capture One to match the contrast. That is apply a lightly S-shaped curve on the preliminary profile so the contrast matches the bundled. An exact match is not necessary, what you find most pleasing is the best for you.

When ready, you create a new text file named lut-curve.json and manually transfer the curve coordinates. Here's an example content of the file:

 {
   "CurveType": "Spline",
   "CurveHandles": [
     [ 0,0 ],
     [ 14,8 ],
     [ 27,20 ],
     [ 115, 118 ],
     [ 229, 233 ],
     [ 255, 255 ]
   ],
   "CurveMax": 255,
   "CurveGamma": 1.8
 }

It's the coordinates within brackets you should replace with yours, the rest should be the same as the example. The curve always starts at 0,0 and ends at 255,255. If you think this step is difficult or tedious you can just copy the example above (here ready in a file: lut-curve.json), it's quite likely that it will work well also with your profile (although I can't guarantee it).

(If you're the perfectionist type you should take great care when making this curve, especially in the shadow range which may be difficult to get exactly right inside Capture One. It may be worthwhile to fine-tune the handles directly in your lut-curve.json by making one profile, adjust, make a new profile and compare, that is trial-and-error. Note that the handle values are floating point so you could adjust [14, 8] to [14, 7.4] for example.)

Now with the LUT curve ready we can at last make the final profile:

  dcamprof make-icc -n "Canon EOS 5D Mark II" -f curve.tif \
    -t tone-curve.json -t lut-curve.json -g adobergb-strong \
    my-profile.json my-profile.icc

As you see we provide both curves now, which then will be cascaded. The first tone curve will be "canceled out" by the encoding curve extracted from curve.tif just as before, but the residual LUT curve will then end up in the profile's LUT (3D Lookup Table) just as we want. We also add gamut compression towards AdobeRGB (-g adobergb) as most will want that.

Replace the example camera name with your camera's name. Capture One actually ignores it so it's only for informational purposes. Instead it's the file name that is displayed inside Capture One, so you may want to choose something better than my-profile.icc.

Now the profile is ready to use, copy it as you did with the preliminary profile. You can remove the preliminary profile as you don't need it any longer. Restart Capture One and try out your new profile.

If you want to make a version of the profile with the "Neutral+" look presented in the DNG profile case, just download neutral-plus.json and add it when you render the ICC:

  dcamprof make-icc -n "Canon EOS 5D Mark II" -f curve.tif \
    -t tone-curve.json -t lut-curve.json -o neutral-plus.json \
    my-profile.json my-profile-look.icc

As the look configuration contains gamut compression, you don't need to add the -g adobergb-strong parameter. The "Neutral+" look is designed to be "better than neutral, but still neutral" and is very subtle. I recommend trying it out.

Making a profile from SSFs

An alternative approach to using test targets for making a profile is to measure the camera's spectral response ("spectral sensitivity functions", SSFs) and then make the profile "virtually" by matching it with spectral databases of the colors you're interested in. For example you can make a profile against a database of real color spectra measured in the nature if you're a landscape photographer.

DCamProf supports this way to work, but it requires that you have the SSFs for your camera. This can be measured with a monochromator setup, which unfortunately is very expensive if bought new. If you're a skilled do-it-yourselfer you can buy an old monochromator, integrating sphere and spectroradiometer from eBay and build your own setup at a fraction of the cost, but it won't be that easy to get it all working, and you will probably need to write some custom software too.

Another alternative to do a full measurement of SSFs is to use an SSF estimation method. The method described in "code for recovering camera spectral sensitivity from a single image" can produce quite good results and Matlab source code is there. I have not used it myself but heard reports from others that have had quite good results.

An SSF-based profile is not necessarily better than a profile made with traditional methods, but it has some interesting advantages. This is discussed in more detail in the DCamProf reference documentation. At some point I may add a tutorial for making a profile from SSF, meanwhile DCamProf's reference documentation provides the necessary information.

A quick note if you are a Capture One user: for most(?) cameras Capture One will just pass along the raw data and apply a curve before it's passed to the ICC profile, and in that case you can make profiles from SSF using DCamProf. However for some models, such as the Phase One P45+, Capture One will apply some hard-coded pre-matrix (or other sort of pre-processing, a matrix is most likely though) that will distort the raw data. DCamProf cannot revert this pre-processing and therefore the SSF workflow cannot be used. A traditional workflow will work though as DCamProf then will base it's "raw" values on the pre-processed data throughout. It will of course also work if the SSF curve was actually extracted through Capture One, which is not likely.

I don't know of any way to figure out for which cameras Capture One applies this type of pre-processing, but if you make an SSF-based profile and it looks under-saturated, it's probably because Capture One applies some sort of pre-matrixing for that model.

There may be other ICC-using raw converters that also do pre-matrixing or other types of pre-processing that breaks compatibility with SSF-based profiles, so keep your eyes open. When it comes to DNG profiles however you can be sure that the true raw data is delivered to the profile as that's defined in the standard.

Workflow summaries

Here's command summaries of a few workflows. Note that the commands contain example values for many of the parameters that you will need to change to match your scenario.

Elaborate dual-target workflow

Summary of the making of a dual-illuminant profile based on two targets (CC24 and a semi-glossy custom), that is the same workflow as presented in the tutorial making a general-purpose dual-illuminant DNG profile.

    # 1. Make a custom target to top of the CC24 with some super-saturated colors
  dcamprof make-testchart -l 15 -d 14.46,12.26 -O -p 210 custom-target.ti1
  printtarg -v -S -iCM -r -h -T300 -p A4 custom-target
    # 2. Print custom target to a semi-glossy OBA-free paper
    # 3. Scan the target with a spectrometer
  chartread -v -H -T0.4 custom-target
    # 4. Create reference file
  spec2cie -v -i D50 custom-target.ti3 glossy.cie
    # 5. Setup light and measure spectrum, save to light.sp for later use
  spotread -a -H -x
    # 6. Shoot CC24 target, glossy target, and white card.
    # 7. Crop export and convert to cc24.tif, glossy.tif and ff.tif
    # 8. Apply flatfield
  dcamprof testchart-ff cc24.tif ff.tif cc24-ff.tif
  dcamprof testchart-ff glossy.tif ff.tif glossy-ff.tif
    # 9. Scan values
  scanin -v -p -dipn cc24-ff.tif ColorChecker.cht cc24.cie
  scanin -v -p -dipn glossy-ff.tif custom-target.cht glossy.cie
    # 10. Merge targets into one, letting CC24 have priority
  dcamprof make-target -p cc24-ff.ti3 -a cc24 -p glossy-ff.ti3 -a glossy -d 0.03 combo.ti3
    # 11. Make a preliminary profile, dumping plots.
    #     Add -C (no CAT) to all make-profile below if your light is
    #     close to D50.
  dcamprof make-profile -r dump1 -l 0 -i light.sp combo.ti3 preliminary.json
    # 12. Start gnuplot (cd dump1; gnuplot -background gray) and plot
    #     target, matrix and LUT, plus LUT stretch vectors and DE vectors.
    #     Use 'set view equal xyz' and 'set view equal xy' to turn
    #     on/off scaling of lightness axis, must be turned off if
    #     error vectors are viewed in 3D.
  gnuplot> splot 'nve-lut.dat' w l lc "beige", \
    'gmt-locus.dat' w l lw 4 lc rgb var, \
    'gmt-prophoto.dat' w l lc "brown", \
    'gmt-adobergb.dat' w l lc "red", \
    'gmt-pointer.dat' w l lw 2 lc rgb var, \
    'gmt-fm.dat' w l lc "blue", \
    'gmt-prof.dat' w l lc "purple", \
    'target-nve-lutve2.dat' w vec lc "black", \
    'target-nve-lutvm.dat' w vec lw 2 lc "olive", \
    'targetd50-xyz.dat' pt 4 lc rgb var, \
    'targetd50-xyz.dat' using 1:2:3:5 w labels offset 3
    # 13. Look in the plot for patches that pull in opposite directions and cause a
    #     bad bend in the LUT. Add those (typically one or two) to an
    #     exclude.txt and render
  dcamprof make-profile -r dump1 -x exclude.txt -l 0 \
    -i light.sp combo.ti3 preliminary.json
    # 14. Decide which Y limit you want in the matrix (affects deep
    #     blue). For a robust profile you should make sure the forward
    #     matrix leftmost middle value (Y-blue) is less negative than
    #     -0.20.
  dcamprof make-profile -d "unlim" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -1000 -L combo.ti3 test-unlimited.dcp
  dcamprof make-profile -d "default" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -L combo.ti3 test-unlimited.dcp
  dcamprof make-profile -d "25" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.25 -L combo.ti3 test-limit-25.dcp
  dcamprof make-profile -d "20" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.20 -L combo.ti3 test-limit-20.dcp
  dcamprof make-profile -d "15" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.15 -L combo.ti3 test-limit-15.dcp
  dcamprof make-profile -d "10" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.10 -L combo.ti3 test-limit-10.dcp
  dcamprof make-profile -d "05" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.05 -L combo.ti3 test-limit-05.dcp
  dcamprof make-profile -d "00" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y  0.00 -L combo.ti3 test-limit-00.dcp
    #     Visually evaluate blue colors (looking at a test shot of a
    #     CC24 will do) and decide how light you want the blue colors.
    #     The "unlim" is the unlimited case should be the most
    #     correct, but if that results in a stronger negative Y-blue
    #     in the forward matrix than -0.20, you should consider a lighter.
    #     You may prefer lighter blues for subjective reasons too.
    #     Strong negative blue factor in the matrix happen only for
    #     some cameras and typically only in daylight (not tungsten).
    #     In this description we assume that "default" (no -y
    #     parameter) was the result (common).
    # 15. Advanced/rare: possibly adjust blue hue with target adjustment
    #     see separate documentation how.
    # 16. Choose matrix weights between glossy and cc24 profiles.
    #     Prioritize cc24 but avoid the matrix cutting too close outer
    #     patches. Use this plot to view:
  gnuplot> splot 'nve-ref.dat' w l lc "beige", \
    'gmt-locus.dat' w l lw 4 lc rgb var, \
    'gmt-prophoto.dat' w l lc "brown", \
    'gmt-adobergb.dat' w l lc "red", \
    'gmt-pointer.dat' w l lw 2 lc rgb var, \
    'gmt-fm.dat' w l lc "blue", \
    'target-mtxve2.dat' w vec lc "brown", \
    'targetd50-xyz.dat' pt 4 lc rgb var
    #     The matrix coverage is drawn in blue. Also look at
    #     make-profile stats to see how matching result changes
    #     when you change weights. Typical weighting will
    #     be 1 on cc24 and 0.2 on glossy:
  dcamprof make-profile -r dump1 -i light.sp -l 0 -x exclude.txt -L \
    -w cc24 1 -w glossy 0.2 combo.ti3 preliminary.json
    # 17. Make matrix-only and full correction profiles for sanity
    #     check comparisons later
  dcamprof make-dcp -d "no relax" -n "Canon EOS 5D Mark II" \
    preliminary.json no-relax.dcp
  dcamprof make-dcp -d "matrix-only" -n "Canon EOS 5D Mark II" \
    -L preliminary.json matrix.dcp
    # 18. Copy preliminary.json to matrix.json to store the matrices separately.
    # 19. Relax the LUT (primarily for the glossy class) to improve
    #     smoothness. Re-render and replot for each change.
    #   - Consider skipping lightness correction
    #   - Too light is better than too dark
    #   - Too low saturation is better than too high
    #   - Hue errors are worst, lightness errors the least
    #   - Don't have smaller error ranges than 0.5
    # Example result after iterating:
  dcamprof make-profile -r dump1 -x exclude.txt -m matrix.json \
    -l cc24 -100,100,-1,0.5,0.5 -l glossy -100,100,-5,2,2 \
    -i light.sp combo.ti3 final-1.json
    # 20. Make final DCP, sanity check it by comparing it with
    #     no-relax.dcp and matrix.dcp. It should have better high
    #     saturation correction than matrix.dcp, and not lose too much
    #     accuracy compared to no-relax.dcp
  dcamprof make-dcp -d "Final 1" -n "Canon EOS 5D Mark II" final-1.json final-1.dcp
    # 21. Repeat steps 5 - 20 for the second illuminant
    # 22. Decide which tone curve to use, which baseline exposure
    #     offset if any, and if black subtraction should be
    #     automatically applied or not. Often the default "acr" curve
    #     with no baseline exposure offset provides what you want,
    #     unless you more closely want to match camera's JPEGs. If you
    #     prefer to make visual accuracy comparisons with tone curve
    #     applied, you can apply the curve earlier in the process.
    # 23. Merge to a dual-illuminant profile and apply your curve with
    #     DCamProf's neutral tone reproduction operator (enabled per
    #     default). Note that the lower temperature profile must be
    #     listed first (StdA in this example). Here we also apply
    #     AdobeRGB gamut compression (recommended).
  dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile" -i StdA -I D50 \
    -b 0.1 -t curve.rtc -g adobergb-strong final-2.json final-1.json final-dual.dcp

Elaborate single-target workflow

Here's a somewhat simplified workflow to make a dual-illuminant DNG profile used when you only have a CC24 target:

    # 1. Shoot CC24 target, and white card.
    # 2. Crop export and convert to cc24.tif and ff.tif
    # 3. Apply flatfield
  dcamprof testchart-ff cc24.tif ff.tif cc24-ff.tif
    # 4. Scan values
  scanin -v -p -dipn cc24-ff.tif ColorChecker.cht cc24_ref.cie
    # 5. Make a preliminary profile, dumping plots.
    #    You may add -C (no CAT) to all make-profile below
    #    if your light is close to D50. If you haven't measured
    #    the light spectrum to light.sp estimate an illuminant
    #    close to the actual light, say "-i D50".
  dcamprof make-profile -r dump1 -i light.sp cc24-ff.ti3 preliminary.json
    # 6. Start gnuplot (cd dump1; gnuplot -background gray) and plot
    #    target and LUT, plus LUT stretch vectors and DE vectors.
    #    Use 'set view equal xyz' and 'set view equal xy' to turn
    #    on/off scaling of lightness axis, must be turned off if
    #    error vectors are viewed in 3D.
  gnuplot> splot 'nve-ref.dat' w l lc "beige", \
    'gmt-locus.dat' w l lw 4 lc rgb var, \
    'gmt-prophoto.dat' w l lc "brown", \
    'gmt-adobergb.dat' w l lc "red", \
    'gmt-pointer.dat' w l lw 2 lc rgb var, \
    'gmt-fm.dat' w l lc "blue", \
    'target-mtxve2.dat' w vec lc "brown", \
    'targetd50-xyz.dat' pt 4 lc rgb var
    # 7. Look in the plot for patches that pull in opposite directions and cause a
    #    bad bend in the LUT. Add those (typically one or two, but
    #    sometimes none) to an exclude.txt and render
    # 8. Decide which Y limit you want in the matrix (affects deep
    #    blue). For a robust profile you should make sure the forward
    #    matrix leftmost middle value (Y-blue) is less negative than
    #    -0.20. You can skip this step and let the auto value be used,
    #    which favors accuracy when the camera is robust with that,
    #    otherwise it makes blues lighter.
  dcamprof make-profile -d "unlim" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -1000 -L cc24-ff.ti3 test-unlimited.dcp
  dcamprof make-profile -d "default" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -L cc24-ff.ti3 test-unlimited.dcp
  dcamprof make-profile -d "25" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.25 -L cc24-ff.ti3 test-limit-25.dcp
  dcamprof make-profile -d "20" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.20 -L cc24-ff.ti3 test-limit-20.dcp
  dcamprof make-profile -d "15" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.15 -L cc24-ff.ti3 test-limit-15.dcp
  dcamprof make-profile -d "10" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.10 -L cc24-ff.ti3 test-limit-10.dcp
  dcamprof make-profile -d "05" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y -0.05 -L cc24-ff.ti3 test-limit-05.dcp
  dcamprof make-profile -d "00" -n "Canon EOS 5D Mark II" -x exclude.txt \
    -i light.sp -l 0 -t acr -y  0.00 -L cc24-ff.ti3 test-limit-00.dcp
    #     Visually evaluate blue colors (looking at a test shot of a
    #     CC24 will do) and decide how light you want the blue colors.
    #     The "unlim" is the unlimited case should be the most
    #     correct, but if that results in a stronger negative Y-blue
    #     in the forward matrix than -0.20, you should consider a lighter.
    #     You may prefer lighter blues for subjective reasons too.
    #     Strong negative blue factor in the matrix happen only for
    #     some cameras and typically only in daylight (not tungsten).
    #     In this description we assume that "default" (no -y
    #     parameter) was the result (common).
    # 9. Advanced/rare: possibly adjust blue hue with target adjustment
    #    see separate documentation how.
    # 10. Make matrix-only and full correction profiles for sanity
    #     check comparisons later
  dcamprof make-dcp -d "no relax" -n "Canon EOS 5D Mark II" \
    preliminary.json no-relax.dcp
  dcamprof make-dcp -d "matrix-only" -n "Canon EOS 5D Mark II" \
    -L preliminary.json matrix.dcp
    # 11. Relax the LUT to improve smoothness. Re-render and replot
    #     for each change. You can skip this and just remove the -l
    #     parameter for the auto mode if you wish.
    #   - Consider skipping lightness correction
    #   - Too light is better than too dark
    #   - Too low saturation is better than too high
    #   - Hue errors are worst, lightness errors the least
    #   - Don't have smaller error ranges than 0.5
    # Example result after iterating:
  dcamprof make-profile -r dump1 -x exclude.txt -m matrix.json \
    -l -100,100,-1,0.5,0.5 -i light.sp cc24-ff.ti3 final-1.json
  dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "Final 1" final-1.json final-1.dcp
    # 12. Repeat steps 1 - 11 for the second illuminant (if you want a
    #     dual illuminant profile)
    # 13. Decide which tone curve to use, which baseline exposure
    #     offset if any, and if black subtraction should be
    #     automatically applied or not. Often the default "acr" curve
    #     with no baseline exposure offset provides what you want,
    #     unless you more closely want to match camera's JPEGs. If you
    #     prefer to make visual accuracy comparisons with tone curve
    #     applied, you can apply the curve earlier in the process.
    # 14. Merge to a dual-illuminant profile and apply your curve with
    #     DCamProf's neutral tone reproduction operator (enabled per
    #     default). Note that the lower temperature profile must be
    #     listed first (StdA in this example).
  dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile" -i StdA -I D50 \
    -b 0.1 -t curve.rtc -g adobergb-strong final-2.json final-1.json final-dual.dcp
    # Single-illuminant alternative:
  dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile" -i D50 \
    -b 0.1 -t curve.rtc -g adobergb-strong final-1.json final.dcp

Simplest possible workflow

Here's a even simpler workflow used in situations where you've just shot a CC24 target at the scene, without any specific precautions to maximize measurement precision (mainly minimize glare). In this case we can just as well make a profile in the blind, without manual adjustment:

    # 1. We have a CC24 shot, possibly with a little glare and
    #    possibly a little uneven light with no white card shot to
    #    correct it.
    # 2. Rotate/perspective correct/crop export and convert to cc24.tif
    # 3. Scan values
  scanin -v -p -dipn cc24.tif ColorChecker.cht cc24_ref.cie
    # 4. Make the final profile directly, with default smoothing.
    #    Estimate the light source (either by memory/eye or from
    #    the white patch) and provide that with -i, in the example
    #    D50. If close to D50 you can also provide -C to disable CAT.
  dcamprof make-profile -i D50 -C cc24.ti3 final.json
    # 5. Convert the native colorimetric profile to a DCP and apply
    #    the desired curve (here assumed to be the default Adobe
    #    Camera Raw curve)
  dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile" \
    -t acr -g adobergb-strong final.json final.dcp

Embedding a subjective look

As discussed in the introduction, raw converters of today are designed to simulate analog photography workflows and thus expects the camera profile to be like a "film roll" that applies contrast and some sort of subjective look. It's indeed old-school and regardless if we like it or not we have to live with it, and that can mean that applying a subjective look to your custom profile may be desirable.

This section is not formed as a step-by-step tutorial, but more as a discussion about subjective looks and then a guide to using the look operator functionality in DCamProf. While the base neutral profile can be designed just by following the tutorial word by word and not really understanding much of what happens, you're more on your own when designing a look. It's a lot of taste involved, if you take two very skilled profile makers they would still end up with different results.

I don't think there is a shortcut here, to make a "high-end" look for yourself, you need to spend some time with this functionality, experiment, build skill and confidence. Well, there is one shortcut, and that is not making any subjective look at all. DCamProf's neutral tone reproduction operator already does the fine-adjustments that are necessary to work well with a tone curve, and it's certainly not unlikely that it provides a result that pleases in full. You can also try out my ready-made generic "Neutral+" look which you can read about in the easy way section.

From left to right: Adobe Camera Raw, DCamProf without subjective look design, and finally DCamProf with a subjective look. The look contains a number of subtle elements. The most clearly visible in this image is that the brighter greens and yellows have been warmed up (added more yellow) which makes the sunlit areas stand out more (we can see that the Adobe Camera Raw also have some of this, but in a more global sense). A slight saturation increase has also been added (skin tones excluded though).

The difference in the rendering of the sky is also quite clearly visible. Here the roll-off to the whitepoint has been adjusted to be shorter in the blue/magenta range which keeps the natural color of the sky better. In that regard also the neutral DCamProf profile does a better job than Adobe Camera Raw.

From left to right: Hasselblad Phocus, DCamProf without subjective look design, and finally DCamProf with subjective look. Before looking at the subtle look differences, note how very similar rendering and contrast can be despite entirely different raw converters and profile technologies. Hasselblad Phocus has its own native proprietary profile format, and the others have been rendered using a DNG Profile in RawTherapee. The contrast curve has been designed to match Hasselblad's native result, using the curve matching method described separately.

The same look has been used as in the first example picture, but we show the skin tone range here. It's also a different camera (this is a Hasselblad H4D-50, the first is a Canon 5D mark II). Thanks to the neutral starting point provided by DCamProf, the subjective look can often be reused on a different camera without changes.

The skin color is quite different in the Phocus rendering, with much more magenta in it. I can guarantee that DCamProf's result is more realistic as I could see myself in the mirror directly after the shot. In the subjective look version many small adjustments have been made. They are so subtle though that it's hard to see without a layered A/B comparison, so if you don't see any differences you can download the file, split it and layer on top. The adjustments are: a minor gamut compression to even out skin, an RGB curves adjustment for a minor hue adjustment, slight brightening of skin highlights, and a slight saturation increase of skin shadow areas.

Personally I prefer these very small adjustments and I think this is the type of adjustments a profile should do if any; the type that is difficult or impossible to do using the raw converter's own tools. It's however no problem to make larger adjustments say if you would prefer the more magenta-ish rendering of skin that Phocus provides in this example.

It should also be said that it depends on the light in the scene and exact skin properties how large effect the adjustments have, so when adjusting skin do use a number of pictures with varying light and skin.

Ways to manage looks

There are a number of ways to manage the look of your photos:

Which way to manage your looks will depend on how you want to work, and also on the feature set of your raw converter. If the raw converter doesn't have a good way to manage processing presets it may be easier to incorporate a finished look into the profile than layering a processing preset on top of a neutral profile.

My personal favorite is to have a few profiles, one "reproduction" which is the colorimetric without a curve, one "neutral" with curve (contrast usually matching in-camera JPEGs), one "landscape" with very subtle subjective adjustments, and one "portrait" or actually "all-around" which has the same as landscape but adds also some adjustments to render faces without makeup a bit more flattering.

I prefer to have the adjustments so subtle that you often need to make an A/B swap to notice the differences. Any further look I apply with the raw converter's adjustment tools. Why then make any look adjustments to the profiles at all? They do add an improvement of the look and most of these subtle adjustments are very difficult to apply in the raw converter. If the raw converter had tools better suited for these type of adjustments I would probably just have the colorimetric "reproduction" profile and do the rest with raw converter presets.

The line is floating between what is a "subjective look" adjustment, and what is just compensation for psycho-visual phenomena. The "neutral" tone reproduction operator in DCamProf already makes things overall like an saturation increase, more in the shadows, less of already saturated colors etc — not to produce a look but to compensate for the appearance changes caused by the contrast curve. And the curve is there to compensate for the psycho-visual phenomena that cause a linear rendering of a real scene look flat and dull. A subtle high quality commercial profile is more about these compensatory adjustments than making a look, but as there's no standard or "right" way to compensate the looks will still differ a bit.

One example of this floating border is that for golden hour landscape shots you may find it difficult to set a white balance that gives the right yellowness of the sunlit foliage but still keeps the the clear blueness of the sky. This is about local chromatic adaptation that works in at the scene but not when looking at the picture. By adjusting the profile so greens and yellows become warmer (more yellow) the look for these scenes can become more realistic.

We can also watch a scene in different two different ways, a more "color critical" way, and a more relaxed casual layman way. If we watch a scene critically we see that the colors really aren't that saturated, and the red bark of that pine tree actually has quite some green in it. The more casual color memory expects to see a bit more vivid and pure colors in the photo. The subjective adjustments I like to do is in this zone where it's not entirely clear if we're just improving the neutrality and realism or we add some pop to satisfy the more casual color memory.

Broader brush strokes, that is applying a look to "not show what you saw, but what you felt" to use a cliche, I certainly think is more suitably done using the raw converter adjustment tools, or in post-processing after the raw conversion. The idea of canned strong looks in the profile is legacy from the film days and when used today it's more about making the photographer dependent on a manufacturer look (a way of lock-in) than making any sense considering what digital technology allows. Of course if you yourself design the look there's no risk of lock-in, so if yo still like that approach, please go ahead.

Designing your own look

If you prefer a workflow where the camera profile applies certain subjective adjustments, like most commercial profiles do, you can design your own look in DCamProf and apply to the profile. As DCamProf has no GUI this is a demanding process, but as it's only done once it can still be worth it.

The most difficult part of designing a look is to know what adjustments to do. Most people can say which alternative they prefer if they do an A/B comparison, but it's a lot harder to say which adjustments that made you prefer a particular alternative. Seeing which you prefer is a good start though, and if you just give it a try and add some patience you should soon be able to design your own look. I'll provide some tips here to get you started.

If you are new to subjective profile design I suggest to try gather as many currently existing looks as possible. Gather a bunch of representative test raw images from your camera, and make default conversions in a few differing raw converters with good reputation concerning color. Also include the neutral rendering from DCamProf as one alternative, and of course in-camera JPEGs. By having a few renderings to compare with we can get a feeling of what we like and not. In blind tests I've made I've discovered that many actually prefer DCamProf's neutral look, and if you are one of those you can of course skip over the subjective look design all-together.

If the image contrast differs a lot (that is the tone curve and baseline exposure) it will be hard to compare. If you have a favorite among the ones you compare with it can be wise to at least temporarily match the tone curve with that look so it becomes easier to compare.

Copying a look

I do understand that a common scenario for using DCamProf will be like this: your favorite raw converter may support your camera but you like the color of the in-camera JPEGs or camera manufacturer's raw converter better. You just don't like their raw converter and would rather use your favorite.

So if you could you would copy the camera manufacturer's look. While it indeed would be possible to make software that could help copying a look, I have no intention to make one.

I do recommend using the manufacturer's look as one reference to be inspired by though. The manufacturer is almost certainly the one that has spent most time perfecting the color, and they usually do subtle adjustments, at least when it comes to higher end cameras (lower end compact cameras on the other hand often gets assigned garish looks as I guess the typical customer likes that).

However, there's no such thing as the one and only perfect look. A profile can only make global adjustments (meaning the same adjustments regardless of picture, and regardless of where in the picture), and when designing a look the designer makes all sorts of taste-related trade-offs. When you are new to profile design you may not have the best confidence regarding your abilities to design a successful look, but if you can recognize a look you like, you can design one. You just need to add some patience.

I see many photographers romanticize over some manufacturer's camera color, like it's given by gods. I don't like that, and I haven't seen any indications that good color is something that is impossible to achieve by mere mortals. So I say: just go ahead and try. You may find yourself getting in control over the color in your own images, and that has always been the key goal of camera profiling from my point of view. Demystifying camera color and get less dependent on both specific raw converters and cameras to achieve my own personal look.

When writing this article I designed a look for my Hasselblad that I personally think is on par with Hasselblad's own color. It's a bit different, but I like my trade-offs better than theirs. It should be said that for some images, the manufacturer's look produces a more pleasing result, and in others it's the other way around. This is normal. As a profile doesn't do any image-specific adjustments they will work better in some images than in others.

So if you have a reference you like and you want to achieve something similar or better, don't try to exceed it in all images, it won't be possible. If you like your result in the majority of images then your profile is better. If you like your result in all images you have either chosen a too small set of test images, or the reference profile wasn't that good.

Limitations

With DCamProf the idea is to start with a neutral profile with a curve applied using the neutral tone reproduction operator, and then add relatively subtle adjustments on top. This means that if you don't like DCamProf's default rendering at all, it will be tough to tune the profile to your liking.

Likewise, if you like the concept of films with very strong looks that deviate a lot from neutral (for example Fuji Velvia 50) and would like to simulate that with your camera profile DCamProf is not the right tool for the job. In theory it is possible, but it will be very difficult.

In other words, although DCamProf allows you to adjust the neutral profile, the intention is still that the camera profile should be fairly neutral and any strong creative look should be applied using the tools found in the raw converter or a photo editor.

There is also one main limitation bound to the DNG profile standard, namely that you cannot alter neutral colors, that is gray-scale will stay gray-scale. You can't change their chromaticity and you can't change their lightness. This means that if you make a hue change it will not affect the neutral axis.

DCamProf's look operators

A subjective look in DCamProf is applied when you convert the native profile format (which is always colorimetric, ie no look and no tone curve) to a DCP (or ICC). The look is defined in a JSON configuration file as an array of "look operators". It's provided with the -o parameter to make-dcp or make-icc, for example like this:

 dcamprof make-dcp -n "Canon EOS 5D Mark II" -d "My Profile" -i D50 \
   -t custom.rtc -o look.json profile.json output.dcp

A look operator is simply an adjustment similar to what you can do in Capture One's color editor for example, that is you select a gamut area (a range of hue, chroma and lightness) and then modify it in some way, such as scaling chroma. That is in the look.json in the example above you define a list of adjustments which is carried through in order, for example something like this:

  1. Compress reds and oranges to even out skin tones
  2. Apply RGB curves to slightly adjust the central tone of skin
  3. Warm-up midtones and highlights in yellows and greens to improve look of golden hour landscape scenes
  4. A mild overall saturation increase, except for skin tones

The look.json must also contain adjustment parameters for the neutral tone reproduction operator which is run before the look operators is applied. For this you typically just copy the default parameters, but you might want to adjust say the overall chroma scaling or highlight roll-off.

Here follows a few sections that explains various elements in the look operators.

Curves

A spline plotted using the built-in spline smoothing in gnuplot. It's the same spline as the example in the text.

A rounded step curve, very useful for blending. Can't be easily plotted in gnuplot, but we don't need to either as it's just a step curve with rounded transitions so we can easily design "in the blind". This curves has the following handles: [ [ 0,0 ], [ 0.3,1 ], [ 0.6, 1 ], [ 0.9, 0 ], [ 1, 0 ] ].

The fading in/out of a selected area (a "Blend") in the look operator is controlled by a curve. Curves come in three types, "Linear", "Spline" and "RoundedStep". The "RoundedStep" is as it sounds a step curve with rounded edges. For blending it's very useful and may be the only curve type you will use for that.

The "Linear" curve is just straight lines between the curve handles and is typically not used in production profiles, but can be used during development to see exactly where a selection starts and ends for example.

With the "Spline" curve you can get almost any (smooth) shape you want, but unlike the linear and rounded step curves it's a bit difficult to design "in the blind" as it easily produces overshoots. I use either gnuplot or RawTherapee to design the spline shapes. You may not need splines for blending (I use them myself from time to time though), but when you use the RGB curves or stretch operator you will almost certainly want to use splines.

In gnuplot you make a text file where you put the handles one X,Y coordinate per row, and then you plot it like this:

Example content in curve.txt

 0 0
 0.5 0.3
 0.8 0.85
 1 1

How to plot it in gnuplot (first line is just to specify a grid):

 gnuplot>
   unset key; set xtics 0.1; set ytics 0.1; set grid
   plot 'curve.txt' smooth csplines, \
     'curve.txt' w points

You can skip the 'curve.txt' w points if you don't need to see the handles.

How to reformat it to a look operator spline curve:

 "Curve": {
   "CurveType": "Spline",
   "CurveHandles": [
     [0,0], [0.5, 0.3], [0.8, 0.85], [1,1]
   ]
 }

Or, instead of using gnuplot you could just open a dummy image in RawTherapee and design a curve in one of the tone curve tools (select "custom" type, which is a spline) and then save to disk which creates a .rtc text file which you can manually reformat to a look operator spline curve.

Selections (blends)

Here follows an example look operator that will make everything except the selected area monochrome. The "BlendInvert" flag is what makes everything else monochrome rather than the selected area. This operator is useful when working out which gamut area to select.

  {
     "Operator": "ScaleChroma",
     "Value": 0,
     "BlendInvert": true,
     //"BlendRGB": true,
     "Blend": [
        {
           "X": "Hue",
           "XRange": [ 70, 300 ],
           "Curve": {
              "CurveType": "RoundedStep",
              "CurveHandles": [ [ 0, 0 ], [ 0.1, 1 ], [ 0.9, 1 ], [ 1, 0 ] ]
           }
        },
        {
           "X": "Chroma",
           "XRange": [ 40, 70 ],
           "Curve": {
              "CurveType": "RoundedStep",
              "CurveHandles": [ [ 0, 1 ], [ 1, 0 ] ]
           }
        }
     ]
  }

Without a "Blend" array the look operator will affect the whole gamut, 100% (1.0) of the operator is blended in. In the blend array we can multiply those 100% depending on the input hue, chroma and lightness. In the above example the blend looks at hue and chroma.

The first entry will check if the hue is within 70 to 300 degrees (that is yellow-green-blue, excluding purple-red-orange). If it is within this range it will fetch a value from the curve. As often with blends a rounded step curve is used, and here we fade in from 0 to 0.1, and fade out from 0.9 to 1. The curve's range is mapped to the "XRange", so 0 means 70, 0.1 will mean 93 and 0.9 will mean 277. If the input value is outside the XRange, the first value will be used if lower, the last if higher. This does not make sense for hue as it's circular so make sure all hue curves start and end with 0 output.

The second entry will check if chroma is within 40 to 70. The curve here is just a simple fade out, and this means that for everything below 40 output value is 100% and everything about 70 output value is 0% and in-between it's a fade-out defined by the curve.

All blend entries are multiplied, so if one entry has produced 0% output, then there will be 0% regardless if the following has 100%.

Per default the blend is made in CIECAM02 JCh space which usually works well. However in some cases where you push the gamut limits a plain (ProPhoto) RGB blend may work better, this is controlled by setting the "BlendRGB" flag to true (commented out in the example).

All this may be hard to follow in text, but experimenting with this type of operator you will soon get the hang of it.

There are several variants of the blend selection axes:

In most cases you work with Hue, Lightness and Chroma in the perceptually uniform CIECAM02 space. However, in some cases it may be easier to achieve what you want using the axes in the Linear ProPhoto RGB space. The DNG Profile LUT works in the RGB-HSV space, and when you're working close to limit of the LUT (maximum or minimum saturation etc) it can be easier to select using those axes, that is for the same reason "BlendRGB" sometimes work better.

This is an illustration of temporarily using the "ScaleChroma" operator with value 0 and "BlendInvert" to visualize which area that is selected. Once the area has been figured out we can then apply the actual operator.

The left image is the original, then followed by the example look operator, but only with the hue selection 70 - 300 (not chroma). This shows how we select yellow to blue quite clearly. The right image shows when also the chroma selection is enabled, the range 40 - 70 is faded out, which leaves only the less saturated colors.

Note the blend effect, high saturation patches get blended with the monochrome, and thus get lower saturation.

When rendering these type of temporary profiles with these extreme adjustments it's likely that the DCP hue discontinuity problem is triggered, therefor we provide the -H parameter to make-dcp to override.

Dealing with DCP hue shift discontinuity

Due to an issue in the DNG pipeline it cannot handle profiles correctly that has hue shift discontinuity. Although it looks very much like a bug, I'd say it's a designed choice to make the processing faster. It does make it a bit messier to design DNG profiles though.

In a production profile you should not have any discontinuity, but for example when testing a monochrome blend it's likely that this problem is introduced. Per default DCamProf make-dcp will then abort, but you can force it to render a profile by adding the -H flag. I often do that during development of a look.

The annotated look operator example coming with the DCamProf distribution has a few examples of how to avoid hue shift discontinuity in production, usually by adding a HSV-Saturation limiter in the blend. The problem occurs if the LUT makes a too large change of the hue. Usually one does not make any large hue changes, but due to the non-uniformity of the HSV hue used in the LUT even small changes can cause large HSV hue changes in the low saturation ranges.

For example this type of limiter can be added in the blend array:

  { // limiter to avoid DCP LUT hue discontinuity issues
     "X": "HSV-Saturation",
     "XRange": [ 5, 10 ],
     "Curve": {
        "CurveType": "RoundedStep",
        "CurveHandles": [ [0,0], [1,1] ]
     }
  }

It causes the the operator to fade out from 10% down to 5% HSV saturation. That is we fade out the operator when HSV saturation is low (close to neutral) and this way avoids the range where HSV hue becomes unstable. As a DNG profile can't change the color along the neutral axis it's a good idea anyway.

See the DCamProf reference documentation if you need more information.

Adjusting hue

DCamProf provides three ways to adjust hue. Hue rotation with "AddHue", color temperature modification with "SetTemperature", and RGB curves with "Curves". The "AddHue" operator is difficult to make anything meaningful with so you can ignore that. RGB curves is the easiest to work with and is a familiar tool from standard color correction techniques used in Photoshop and other software.

The "SetTemperature" operator is also quite easy to use and is simply used to warm up or cool down your selected gamut.

Let's start with curves. The RGB curves are operating on ProPhoto primaries, and you can specify which gamma you want. You can precisely mirror the curves operator in RawTherapee and that way gain a GUI for the hue adjustment. Do like this:

  1. Open a raw file which contains the hues you want to adjust.
  2. Select "(Neutral)" processing profile to get a linear curve and no adjustments.
  3. Go to the color tab, then "Color Management" / "Input profile" / "Custom" and open and apply your latest profile.
  4. Make sure "Working Profile" is "ProPhoto" (it's the default), and change "Output Profile" to "RT_Large_gsRGB" to minimize clipping of very saturated colors.
  5. Edit the curves in "RGB Curves", use "Custom" mode (splines).
    • It will affect all colors of course, but concentrate on the look of the hues you will include in your selection.
    • Typically you will do extremely small adjustments, which may be a bit difficult to do in the curve GUI, you maybe want to move a handle just 2 – 3 pixels. To make it easier to navigate you can enlarge the panel which will enlarge the curve GUI as well.
    • There are some useful tricks built into the curve GUI, make sure to read the tool tips for all buttons surrounding it.
  6. When happy, save the curves to disk (.rtc files) which you can open in a text editor and convert to DCamProf's look operator curve format.
  7. When using the curve in a DCamProf look operator, make sure to specify gamma "sRGB" which is the one RawTherapee is using for the RGB curves.

When it comes to the "SetTemperature" operator, RawTherapee does not have any tool to mirror it so you have to resort to the usual trial-and-error loop. You should quite quickly narrow down to the temperature adjustment you want though.

Adjusting chroma and lightness

For chroma and lightness you will mostly use "ScaleChroma" and "ScaleLightness". There's also the "AddChrome", and "AddLightness" operators but it's generally easier to work with multiplication.

Be careful so you don't tune lightness with a look operator when you actually should adjust the tone curve. If you want to make the profile render globally lighter or darker it means that you should adjust the tone curve. Very careful adjustments of the S-shape of the curve can be used to fine-tune highlight and shadow detail.

Likewise if you need to do a global chroma adjustment you should probably adjust the "ChromaScaling" of the neutral tone reproduction operator, described below.

Adjusting the neutral tone reproduction operator

Before the look operators are applied the neutral tone reproduction operator is run. You can adjust it's settings if you want to. What I would suggest looking into is possibly adjust the global "ChromaScaling" if you are not pleased with that. If left at -1 which is the default it's automatically calculated from the shape of the tone curve, which should make a good value but it might miss. That is test first without look operators and see if your images look over-saturated or under-saturated, then adjust "ChromaScaling" until it looks right to you.

The "Saturated" and "Shadows" scaling adjustments can generally be left as is. With the "Rolloff" adjustment you can make some important subjective adjustments. It controls how fast midtones and highlights blend into white when approaching the whitepoint. If you keep color as long as possible a bright blue sky will retain its more saturated color rather than becoming strongly desaturated (which is common in many bundled profiles), but on the other hand if you do the same with skin you may lose some of the brilliance in the highlights and the look is affected negatively. Therefor you may want to have different roll-offs depending on hue.

It's safer for all-around subjects to roll off quite quickly into white than the other way around. Although a blue sky typically looks better with a short roll off, a saturated blue flower may look flatter unless you let the highlights blend into more desaturated shades. This illustrates the limitations of a profile, you can't make adjustments that suits every subject.

Here's an example where the roll-off has been adjusted to whiten skin highlights more and keep color longer for skies:

    // Configuration parameters for the neutral tone reproduction operator, most left at defaults
    "ChromaScaling": -1,
    "Saturated": { "AdjustFactor": 0.95, "LowChroma": 35, "HighChroma": 60 },
    "Shadows": {   "AdjustFactor": 1.20, "LowLightness": 0.15, "HighLightness": 0.50 },
    // Rolloff has been reconfigured from default. We whiten skintone highlight range further,
    // and we make roll-off shorter for cyan-blue-magenta to keep color higher up in skies
    "Rolloff": {
        "KeepFactorHueCurve": {
            "CurveType": "RoundedStep",
            "CurveHandles": [
              [0, 0.0], [40, 0.0],
              [55, 0.2], [150, 0.2],
              [180, 0.4], [270, 0.4],
              [300, 0.2], [330, 0.2],
              [345, 0.0], [360, 0.0]
            ]
        },
        "LowSatScaleHueCurve": {
            "CurveType": "Linear",
            "CurveHandles": [ [ 0,1.0 ], [ 360,1.0 ] ]
        },
        "HighSatScaleHueCurve": {
            "CurveType": "RoundedStep",
            "CurveHandles": [
              [0, 1.0], [40, 1.0], [55, 1.2], [330, 1.2], [345, 1.0], [360, 1.0]
            ]
        }
    }

Design workflow tips

Overview of the design workflow:

  1. Find the tone curve you want to use
  2. Make adjustments to the parameters of the neutral tone reproduction operator, if you find it desirable.
  3. Add adjustments via look operators.
    1. Find out which part of the gamut you want to select by making a temporary "make monochrome" operator and adjust it's selection (trial-and-error) until you have covered the desired range.
    2. Apply the desired operator, and adjust the strength of it with trial-and-error.

When adding adjustments the first thing to do is to make a selection of which colors you are going to adjust. This is a bit messy without a GUI, but it can be done. What you do is that you guess a range, make a look operator on that range which sets chroma to 0 (=make it monochrome) and render a temporary profile with that, which you apply to your test images and then your monochrome areas are those that you have selected. If you like the other way around there's an invert flag leaving the unselected areas monochrome instead (I prefer that).

With a few trial-and-error runs you will eventually have suitable range, and then you apply the actual adjustment(s) you want and make a number of trial-and-error runs to find out a suitable strength of the adjustment.

To make this feasible you need to use a raw converter when you quickly can load new profiles. If you need to install the profile and then restart the converter to make it available it will be very tedious. With RawTherapee this is not required, so I warmly recommend using that during the design even if you're not going to use it in production. Note that RawTherapee cache profiles so you can't overwrite an old profile and make it change on the fly, so what you do is that you add a serial number like test-1.dcp, test-2.dcp and so on and always load a new one.

I prefer to make several copies of my test raws, and then set RawTherapee to tabbed mode so I can have several files open simultaneously, apply different profiles to them and swap between them for quick A/B comparison. That way I can quickly narrow down the range I want, like "a little bit more than A, but less than B". And I always keep a version with the original profile without look operators applied, so I can always see how much I diverge from the original.

If I have some other renderings of the test raws from other raw converters, I keep JPEGs or TIFFs of the finished renders in the same directory so I can open and do A/B comparison with those too.

Have some representative test images. I think it's easier to have just a few, say just 3-4 images, when designing and then testing the finished result on more images, and if you find a problem image you make an adjustment for that.

When modifying a look with look operators there's a risk that you disturb the smoothness of the profile. Using the test-profile command you can render a gradient test image which is passed through the profile. I strongly recommend using that as a complement to looking at real images.

If you do this for the first time, don't expect to finish in an hour. Work an hour, come back the next day. This type of work requires high concentration and is fatiguing. Then use your profile for a while with various pictures, let it mature, possibly make further adjustments. Getting to a final result can take weeks.

When you have got a final result once, you probably have learned a lot about your personal taste concerning the "ultimate look", and what type of adjustments that works well and not. This makes it much easier to make additional profiles as you can re-use your previous look. In theory you could re-use it on any camera without doing any changes to it. This may work in many cases, however, as the base colorimetric profile will due to limitations of the camera not produce the exact same color, the look might not apply as well on all cameras, and you may need to fine-tune individually.

Using generated gradients to test smoothness

The whole test gradient image is 3000x5000 pixels and contains many repeats of spectra with increasing saturation from up to down, and decreasing lightness from left to right. The purpose of this large gradient is to cover "all" input values to the profile. For actual evaluation of smoothness when you make a subjective look, you typically only need to look at one of the low saturation spectra (green circle). From row five and down you will likely have clipping issues in the display profile which may make things look less smooth than it is.

The "black hole" in the red circle is an example of an area of the LUT where the XYZ values get clipped to black. This is in the extreme range which you normally don't get any output so you should not need to look here. The image was generated with an older version of DCamProf, newer versions don't have that black hole.

The image was generated by a colorimetric profile without a curve and is therefore a bit dark. If the profile has a brightening curve the image will be lighter.

With the test-profile command you can get a generated test image useful to evaluate smoothness. Run the command on your profile:

 dcamprof test-profile -r dump profile.dcp

In the directory dump you will then find gradient.tif which is a generated image that has been run through the profile. The image contains many gradients that cycles through all colors at different lightness and saturation levels. This way a 3D LUT is tested extensively.

The original image before being put through the profile is also stored, as gradient-ref.tif. This can be seen as simulated raw camera data. This file cycles through all possible combinations between R, G and B and thus also contains unrealistic or impossible combinations. No real camera shot of a real scene will for example have colors where red and blue are zero while green is at max. This corresponds to "out of gamut" space and most profiles, including those generated by DCamProf will most likely produce some artifacts in this "undefined" space. This is important to understand as these artifacts doesn't mean any problem and should thus not be worried about.

The brightest and most desaturated gradient (the top left one) is usually the best to start your analysis with. However if you for example make an adjustment which only should affect dark colors, it may not be visible there and you may need to look at some of the darker renderings.

Making A/B test before and after an operator is applied is often useful. To do that you need to manually manage the files (make a profile without the operator, run test-profile, rename/save the gradient.tif, make a profile with the operator and run test-profile again and then flip between the images in an image viewer).

To get a baseline image with only matrix correction (no LUT) you can do like this:

 dcamprof test-profile -r dump -L profile.dcp

The color space of the test image is ProPhotoRGB, which means that even for wide gamut monitors the most saturated colors will clip. If you want to evaluate those gradients you need to disable the color management temporarily. If you can't do that you can use a tool to strip the ICC profile from the file (imagemagick for example) so you get it displayed in sRGB instead.

Also note that the color management of the screen can negatively affect gradient rendering. If your display ICC profile has issues with gradients it may seem like the profile is producing a bad gradient, when in actually the display's color management is the culprit. A useful sanity check is then to look at the unprocessed reference file, gradient-ref.tif which should only contain smooth gradients. It's not a 100% conclusive test though as the reference gradient is much less saturated. Disabling display color management and running the display in it's native color mode is the safest way.

Usually the screen's color management should not be a problem, but I mention it as it does happen, and it has happened to me a few times. One time it was not the ICC profile's fault at all, but a bad sRGB simulation mode in the display itself(!).

You should be aware that when you see unevenness in the generated gradients it's still quite unlikely that it becomes visible in real images, and that a matrix-only correction always look much smoother than a LUT profile. You can try to run a bundled profile through the test and see how it renders the gradients. Most likely you will see some rough edges in the more saturated ranges.

The same gradient section (left-most second row) rendered with matrix-only (left), with LUT (center), and with subjective look (right). It's very difficult to compare when they are like this side-by-side rather than layered on top.

Note that the gradient section shows more than 360 degrees, it starts over a little too to make it easier to see any effects that otherwise could be located exactly at the wrap-around.

What you may see though is that the matrix result is a bit less saturated, which generally is the result with a well-designed matrix-only profile (to make high precision of important colors, the high saturation colors suffer a bit). All three look smooth, with a little bit of disturbance in the subjective look alternative, but not as much to be a problem.

With the subjective look we've warmed up yellows and greens, which indeed looks a bit more yellow. The skintone range has been compressed in terms of hue, and the skin range closer to magenta has got its highlights a bit brightened. There's an overall saturation increase as well, with the skintone range excluded.

When developing a new look what you typically do is to save the original LUT-only result, add one operator, generate a new gradient and then make a A/B comparison so you clearly see where the operator has effect and if it introduces any artifacts.

Suggested adjustments

So which adjustments to do? This is a matter of taste, but I'll give you some suggestions. Here's a list of adjustments common to find in commercial profiles:

Gamut compression

The saturation decrease of high saturation colors typically found in bundled profiles might be targeted per color, but more likely it's implemented as an overall gamut compression. The idea is that instead of clipping super-saturated colors (which you can find in flowers for example) the saturation is smoothly rolled off to fit within a typical RGB gamut such as AdobeRGB.

In theory this could be done automatically by the raw converter based on need, that is if there are some very saturated red tulips in the image just compress that range and leave the rest untouched. Unfortunately few raw converters (if any) has this type of "dynamic gamut compression", so either you need to adjust manually per image (using HSL sliders or similar adjustment tool), or have a static global gamut compression in the profile.

If you intend doing manual edits per image and you are satisfied with the raw converter's adjustment tools to control saturation you should probably not apply gamut compression to the profile. However if you want an all-around profile which provides good results for high saturation colors without manual adjustments it's generally wise to add gamut compression.

This can be controlled in detail with DCamProf's gamut compression function, see the annotated example for further information. There's also the possibility to provide gamut compression presets to make-dcp or make-icc directly, such as -g adobergb or -g adobergb-strong for a compression towards AdoberRGB. The stronger variant is similar in strength to what is found in many commercial profiles.

An annotated example

The DCamProf distribution comes with an example configuration file for a look. That may be more up to date than this article, so do look at that as well. It's called ntro_lookop_conf.json

Instead of doing the look entirely from scratch, you can simply play around with the example and borrow adjustments from that and tune them to your liking.

Appendix

How a digital camera registers colors

A digital camera has (usually) three color channels, red, green and blue, usually arranged as pixels in a Bayer filter array. There's a tiny color filter in front of each pixel to let through only the light of the targeted color.

Also the human eye can be seen as a device that registers light in three channels, it's in reality more complex than that but fact is that a quite precise model can be created with this assumption, and this has been done with the LMS color space, where the "filter response" for the eye's three "channels" (cones) are defined. The LMS color space is not that practical to work with mathematically so an alternative (but equivalent in terms of result) reference model has been devised, the CIE XYZ color space. With this space comes "color matching functions" which corresponds to three channel filter responses, or "spectral sensitivity functions" (SSFs). Any light spectrum can filtered through those color matching functions and then you get an XYZ triplet, a tristimulus value. The CIE XYZ was originally standardized in 1931 and still holds up. There has been some slight refinements of the color matching functions, but most color rendering pipelines still use the originals.

An XYZ coordinate thus represents a response in the eye, without taking brain interpretation into account. That is there's no chromatic adaptation (the brain's "white balance") or other perceptual elements factored in. Once the XYZ colors has been registered conversion to other color spaces with perceptual modeling can be made.

So a camera's spectral sensitivity is designed to match the LMS cone responses, or at least the XYZ color matching functions or any linear combination of them? No, not really. First, limitations in manufacturing means that the tiny camera sensor filters cannot be assigned any desired spectral sensitivity, and even if it was possible lower noise and better low light performance can be had if deviating from a "perfect" filter response. It can also be argued that it's unnecessary to capture all colors an eye can register as real scenes rarely contain any of the extreme colors, and screens and printers can't reproduce them anyway.

Instead digital camera sensor color filter response depends on limits in manufacturing and the intended use of the sensor. They differ substantially between different manufacturers and even different models from the same manufacturer, so there is no standard and no "best" response out there.

The challenge for a raw converter is then to convert the raw RGB channels from the camera sensor to standardized defined color that can be displayed and printed. This is where camera profiling comes in.

The matrix camera profile

The most basic camera profile converts from the camera's raw RGB channels to CIE XYZ with a matrix, and once in that space standard color management algorithms can translate further into RGB values suitable for our screens (and finally printers).

"Converting with a matrix" means simple multiplication, like this:

  X = R * a1 + G * a2 + B * a3
  Y = R * b1 + G * b2 + B * b3
  Z = R * c1 + G * c2 + B * c3

That is we have a 3x3 matrix of constants. If cameras had color filters which matched the XYZ color matching functions exactly the matrix would be an "identity matrix":

  1 0 0
  0 1 0
  0 0 1

such that X = R, Y = G and Z = B. A perfect match would also be had if the spectral sensitivity functions was any linear combination of the color matching functions (that is if there was a matrix that is different from the identity matrix but still always resulted with the same XYZ values as the XYZ color matching functions). This is called the Luther-Ives condition but it's never fulfilled by a real camera.

Instead a matrix with the smallest error possible is derived. This error can be substantially smaller if we decide for which light this matrix should be optimized. That is the matrix that works best for daylight will be different than the one for tungsten. This can seem somewhat strange as the XYZ space just represents cone responses and has no white point, and indeed a Luther-Ives camera could have the same matrix for all types of light. However, when there is no solution the best approximation will need to take the light (illuminant) into account.

Compared to daylight the spectrum from tungsten will skew the spectra of the reflective colors such that the camera's mismatch with XYZ will be different, and it's thus better to make a specific translation matrix for each light condition.

In practice two profiles is enough for most needs: one for tungsten and one for daylight. Flash is similar enough to daylight. If only one matrix is made it's generally optimized for some sort of daylight, usually "D50", which is one of the standard illuminants.

An advantage of a matrix profile is that it's linear so there will be no issues with banding in gradients or other nasty non-linear behavior which sometimes is found in LUT (lookup table) profiles.

The obvious disadvantage is that a matrix profile cannot be as precise. With a modern camera it's generally possible to get more than acceptable accuracy for typical test chart colors (such as the Macbeth 24 patch color-checker), but then high saturation colors are often off. Natural scenes don't have that saturated colors though so in practice it can work quite well and some prefer this type of profile thanks to the linearity.

There are few other less obvious disadvantages too. For example, as soon as you apply a curve to increase contrast, color appearance change and a matrix cannot compensate well for that, so LUT profiles are better suited if the profile applies a curve. A matrix will also not yield valid XYZ values for any type of camera RGB combination. This can be a problem for artificial emissive light sources such as disco lights, diodes, various cityscape nighttime lights the camera may produce quite odd RGB combinations that could push the matrix output to clipping, even on the negative side (clipping to black). A LUT profile can handle this and can thus be more robust.

Both the ICC and DNG profile formats support pure matrix profiles. If you bring up an ICC matrix profile in a profile viewer you will see the matrix represented as "RGB primaries" (just as for a screen profile). This has lead some to believe that the triangle between the primaries represents the colors the camera can capture (its gamut) just like with an ICC profile for a screen. This is however not the case, and I think it's unfortunate that the ICC profile presents the approximation matrix as "RGB primaries".

It's true that the coordinates the ICC profile will produce will be within this triangle, but color is only reasonably correct for a smaller subset of lower saturation colors, towards the sides of the triangle the profile will produce grossly incorrect colors so it loses meaning. In addition, real spectra will never cause the camera to reach to the edges, camera filters overlap so the camera never makes a zero signal on green for example, unless you feed it with artificially filtered light. In other words, the "RGB primaries" in the ICC profile say nothing about which colors the camera is capable of capturing accurately.

Chromatic adaptation and white balance

Color is not a physical property of the objects we see but rather created in our brain based on the signals delivered from the eye. Even if a camera would register the exact same signals as the eye it would not reproduce the same colors, as color is a product of the eye and brain.

The most basic concept of the brain's influence on color vision is chromatic adaptation. This means that the brain adapts to the spectrum of the light and adjusts colors accordingly so an object reflecting the complete spectrum with equal power looks white.

The corresponding concept for us photographers is white balance. A digital camera registers colors in three channels (red, green and blue) but makes no difference based on light source. By using a white balance color picker in our raw converter we can pick an object we know appeared white when we made the shot and the raw converter will multiply the R, G, B with individual factors so that the selected object will appear white (ie R=G=B). All other colors are affected by the multipliers and thus arranged relative to the selected white.

This is similar to how the brain's chromatic adaptation works, so selecting white balance is the photographer's way to make proper chromatic adaptation of the image. However, while similar it's not the same. For extreme color temperatures such as a golden sunset or a blue winter dusk the brain will not make a complete chromatic adaptation, we will still understand which object that is white but we'll see it colored golden or blue. If we as photographers want to produce a realistic result in those conditions we have no other option than to adjust color balance to taste until it looks right according to our color memory. It's by no means an exact method but is the only method available, and as color accuracy is not that important in landscape photography it's easy to live with.

If the raw converter allows it, it's from the profile's perspective best to set white balance on a white object, and if we want to adjust look to more yellow or blue we use other color mixing tools rather than white balance. This is because the camera profile by definition expects perfectly neutral whites and all corrections it makes is relative to that white, and that white comes from the white balance setting. So if we skew the position of white using the white balance settings the profile will get an incorrect starting point. For well-behaving profiles with smooth gradual corrections this doesn't matter that much but I would still recommend using other tools than white balance to apply a look, if the raw converter allows it.

Another aspect of white balance vs chromatic adaptation is when there are multiple light sources. In landscape photography we can have direct light from a golden sunset and blue light in the shadows from the sky. The brain will then adapt partially and the sunlit areas will look a bit yellow and the shadowy parts a bit blue. If we shoot a picture of the scene and then adjust color balance to taste we'll often see that either the sunlit areas look too yellow or the shadowy parts too blue, that is the brain's chromatic adaptation evens out multiple light sources more than what we can do with a single white balance setting.

Most often a single white balance will do to create a pleasing look of our image, but in some cases when we need more realism one may need to work with more than one white balance and merge.

Chromatic adaptation will work best (ie produce pure whites and same appearance of colors) in a range between say 4000K and 8000K. Within this range colors will appear approximately the same and white will look as pure white as long as we have only one light source. Overcast midday daylight is a very good condition for this. In the raw converter color engines the reference color space is generally defined with this type of light, such as D50 or D65 (daylight about 5000 or 6500K), and this is also what is used for standard print viewing (D50) and screen calibration (D65).

If you want accurate color, that is color in your images that look the same as the eye/brain experienced at the scene, you need this type of well-defined light. Otherwise you will have to resort to manual color balance to taste.

Worth mentioning is that color science has given us more advanced models for chromatic adaptation than just white balance. It's called chromatic adaptation transforms (CAT) and also models the slight color appearance differences in different light. They're based on color matching experiments made in mostly 2850K and 6500K light. These models can be used by raw converters when adapting profiles for various light, or by the profile maker itself (DCamProf uses CAT when needed unless you disable it). CATs are not used by the white balance setting though, the idea is that the profile should already model the color appearance close enough and white balance is used for fine-tuning.

For more on this subject I recommend reading DCamProf's reference documentation on the subject of white balance and chromatic adaptation transforms.

DNG profiles (DCP)

In the early days all raw converters used ICC or some proprietary profile format. Then Adobe introduced a new camera profile format with their open "Digital Negative" DNG raw format as they where not pleased with the functionality provided with ICC profiles. The new profile format is documented in the DNG specification, and is called "DCP", DNG camera profiles, but as it's tightly associated to the DNG format it's also called DNG profiles.

The color conversion pipeline with a DNG profile is as follows:

  1. Demosaic the raw file.
    • This is done before white-balancing, that is on the camera's native channel sensitivity (generally strong green cast). Some demosaicing algorithms may work better if the image is white balanced, if so it will use a temporary white balance during demosaicing which then is removed, to restore original channel scaling.
  2. Calculate which color temperature and tint (whitepoint xy coordinate) the chosen white balance corresponds to.
    • This is done with the help of the profile's "color matrices" (ColorMatrix1 and ColorMatrix2), which is either one (single-illuminant) or two (dual-illuminant).
    • Dual-illuminant means that the profile contains two profiles in one, almost always one for tungsten ("StdA" illuminant) and one for cool daylight ("D65" illuminant), so it can be used in a wider range of lights. This is an ease-of-use advantage over ICC where you need separate profiles per light temperature.
  3. Derive a color conversion matrix based on the calculated whitepoint.
    • As said dual-illuminant profiles typically have one matrix for StdA and one for D65. If the temperature is in-between those the matrices are mixed accordingly, if higher than D65 only the D65 matrix is used, and if lower than StdA only the StdA matrix is used.
    • All illuminants of higher temperature than D65 is assumed to have similar enough properties as D65 so good color can be achieved with just a white balance adjustment. The same counts for temperatures lower than StdA.
    • If there is only one matrix (single-illuminant) that one is picked.
    • The color conversion matrix is based on the color matrices (ColorMatrix1 and ColorMatrix2) unless there's also the "Forward matrices" a new type of matrix which was added in DNG specification 1.2, then these are used instead. All reasonably modern profiles have forward matrices.
    • When there are forward matrices the color matrices are thus only used for identifying whitepoint xy coordinate (which in turn decides how to mix the two forward matrices in a dual-illuminant profile).
    • The traditionally claimed advantage of forward matrices is that the profile designer has control over chromatic adaptation. This is the same type of matrix used in ICC matrix profiles.
    • In some cases the profile designer does not make the forward matrix to match color well, but rather to just be a good starting point for the follow on LUT. A problem with matching colors with the forward matrix is that extreme values will then likely be clipped and cannot be recovered by the LUT. This is solved by making sure that the forward matrix fits within ProPhotoRGB, and will then not be able to produce appropriate color on its own. Today it's probably more common with this type of forward matrices than those that actually produce sane color, which arguably breaks the original intention of the forward matrix. This use was pioneered by Adobe and is not documented in the DNG specification.
  4. Convert from the camera's native RGB to CIE XYZ(D50) using the derived matrix.
    • D50 (daylight) is the whitepoint, XYZ can hold any whitepoint but to make a conversion to other color spaces like RGB and Lab there must be a reference white.
    • CIE XYZ is a standardized "device independent" color space, which covers the full human vision gamut.
    • CIE XYZ(D50) is a common reference color space for ICC profiles too.
  5. Convert XYZ(D50) to RGB with ProPhotoRGB primaries.
    • ProPhotoRGB is a regular RGB space and thus has boundaries but is so large that it covers more than any screen or print and most of the human vision and camera gamut.
    • Some extreme colors might be clipped as ProPhoto does not cover the full human vision gamut. This is not a problem for any practical use but might be a problem in some scientific applications.
    • Floating point linear RGB with ProPhoto primaries is the internal color space of Adobe Camera Raw.
  6. Apply color adjustments via the "HueSatMap" lookup table, if it's available. If dual-illuminant there are two tables (one for each illuminant) and those are mixed according to the calculated whitepoint.
    • The table can adjust RGB hue, saturation and value, that is a full 3D LUT.
    • The table divides the HSV space in equisized sections and make adjustments by scaling input values. RGB-HSV is not a fully perceptually uniform space though, so in terms of perception some colors get denser sampling than others.
    • Since it's a 3D LUT it can make a different adjustment based on value for example (ie a dark color gets a different adjustment than a light color of the same hue and saturation), but Adobe recommends against that for the HueSatMap, meaning that regardless of input value the same type of scaling will take place. Output value can be scaled though, that is two inputs (HS) and three outputs (HSV adjustments) so Adobe calls this a 2.5D table.
    • The intention of this table is to fine-tune colorimetric color accuracy (hence the recommendation is to stay with 2.5D corrections, full 3D generally only makes sense for producing a subjective "look", except possibly for non-linear extreme value handling to minimize clipping).
    • Saturation and value is scaled (multiplication), hue angle is changed by addition. This means that coordinates with zero saturation or value cannot be adjusted (which is possible with an ICC LUT).
    • By definition the neutral axis (monochrome) is not allowed to be scaled, that is not even value which the LUT itself could do, but Adobe's processing pipeline will ignore that. This means that all LUT entries for the neutral axis are a waste as they by definition must contain [1,1,0], but they are still included.
  7. Apply positive exposure adjustment (if any), and automatic black subraction (if enabled).
    • DNG files can contain an exposure adjustment tag called "baseline exposure", and the DNG profile can add to that with a "baseline exposure offset". The result of these two is usually zero or a small positive value, say 0.25 stops or so.
    • The exposure adjustment also adds in the user's exposure slider setting.
    • If the total exposure adjustment sum is negative, it's postponed to the tone curve step, to avoid feeding the "LookTable" with an overly dark image.
    • If the profile has not set "DefaultBlackRender" to "None" the pipeline should do automatic black level subtraction to compensate for glare and similar. The amount subtracted is dependent on the image content. Unfortunately automatic black subtraction is not standardized, so it's not known how to mimic Adobe's own behavior. The DNG SDK just uses a default value in place of a content-dependent algorithm.
    • This adjustment is made individually per RGB channel (subtract black, multiply exposure correction), and thus black subtraction can cause a minor color shift.
  8. Apply any other converter adjustments that change the lightness of the image (such as fill light and vignetting effects).
  9. Apply color adjustments via the "LookTable" lookup table, if it's available.
    • The table has the same format as the HueSatMap table.
    • The intention of this table is to apply a subjective look, pleasing color, and may contain lightness-dependent adjustments for example makes shadows more saturated and cooler (bluer) and highlights warmer (redder), that is be a full 3D LUT.
    • As it's intended for subjective adjustments there is only one instance of this table even if the profile is dual-illuminant.
    • There's still the limitation to not alter the neutral axis, so a DNG profile can't be used to make say a Sepia-toned monochrome image.
  10. Apply the tone curve, if available, and if there was negative exposure adjustment add it here.
    • The tone curve is generally an S-curve to make a subjectively pleasing contrast increase, to mimic film behavior (without a curve images look flat). All raw converters do this, but the ones using ICC profiles often handle the curve separately (it can be built-in into the ICC profile though, or even both, some of the curve in the profile and some on the side).
    • Reproduction profiles don't have film curves obviously, as a contrast change affect color appearance.
    • The tone curve is similar to a RGB curve, that is increased contrast leads to increased saturation, but keeps the RGB-HSV hue constant to reduce the color shift issues that exists with a pure RGB curve.
    • If there's negative exposure adjustment, an exposure tone curve is generated which is linear scaling up to the last two stops, and then it smoothly increases the slope to end at the max value 1.0. This curve is then mixed with the tone curve (if any). The reason for doing this is to make sure that clipped highlights still reaches clipping in RGB space, or else they would look flat and dull.
    • The exposure curve is combined with the tone curve and forms a new tone curve.
    • If the DNG profile lacks tone curve, Adobe Camera Raw will apply its default tone curve. This is not described in the specification, but the curve is available in the DNG SDK for anyone that wants to copy that behavior.

The color conversion pipeline invites the profile designer to provide close to the final result already after the first matrix conversion and then use the lookup tables only for fine-tuning. This is indeed how many profiles are designed and is how DCamProf originally made DNG profiles (ie you can strip away the LUTs and still have decent color), but Adobe's own profiles are often not like that. The reason is that you will get issues with clipping of extreme values if you have a sane matrix. This is no problem for normal colors, but for artificial colors it can be (typically extreme blue ones). To avoid clipping the matrix must be fitted within the ProPhoto gamut which generally means strongly desaturated colors.

It's the the end result that counts, so it really doesn't matter how the matrixed color look like if the LUT stretches the color into position. Why then not skip the (forward) matrix and do the LUT directly like the Lab LUT in ICC profiles? Well the matrix must be there for matrix-only profiles, and the designers probably saw no reason to remove it for LUTs.

In some cases Adobe's DNG profiles are made to mimic the look of the in-camera JPEGs. In that case the HueSatMap tables are often skipped and they finalize the look in the LookTable. This is similar to how ICC profiles are applied, which has only one LUT and it's typically applied after exposure adjustments, just as the DNG LookTable.

The most "logical" way for a DNG profile is to make as accurate color as possible using the matrices, and then fine-tune further with the HueSatMap tables, and finally do any subjective adjustments in the Look table. A layman doesn't see the internals of the profile though and if you view it as a black box the same end result can be had with very different internal tables and matrices.

However if you disassemble any other DNG profiles, such as Adobe's own, it's good to be aware of that there are many ways to design the profile and the "logical" way to do it is actually one of the less common ways. DCamProf can be configured to do it that way, but per default it uses a special "LUT matrix" to avoid the clipping problem.

Another thing worth noting about profile design is that a tone curve changes color appearance, mainly increases saturation, but also shifts colors. Most commercial profiles compensate some for that by desaturating colors in the lookup table, DCamProf adds such compensation in the LookTable. Some (most?) consumer profile design software does not have any curve compensation features though which means that accurate color is only had with a linear curve, and if a tone curve is added on top you get that specific saturated RGB curve look whether you like it or not.

What is the purpose of dual illuminants?

Unlike ICC profiles DCP supports dual illuminants and this has been "marketed" as one of the advantages of DCP. DCP is not alone with multiple illuminants though, the internal profiles in Hasselblad's Phocus (own proprietary format) actually uses up to four illuminants in the tungsten to daylight range.

The purpose of multiple illuminants is to make the software easier to use for the layman, you just need to adjust the white balance and then the appropriate profile will be auto-selected internally. With single illuminant profiles you need to manually select if you want to use the "tungsten" or "daylight" profile. Raw converters that use ICC profiles generally let you manually select profile made for certain types of light (usually tungsten, flash and daylight).

There is indeed also matrix/table mixing of the intermediate temperatures (which you can't get if you manually select one of two single-illuminant profiles), but it's only a basic linear combination and as far as I can see it's not really about making accurate approximations of intermediate profiles, but only to provide a smooth transition between the two embedded profiles. Since dual illuminants are used for general-purpose profiles with subjective color, accuracy is not a top priority anyway.

That is the value lies in making it easier to use a general purpose profile, it has little to do with accuracy. It makes no sense to make a reproduction profile dual illuminant as it can only produce really accurate colors under the same illuminant that was used when making the profile.

DNG profiles vs ICC

The DNG profile format has a few advantages over ICC:

However as DCP was introduced by Adobe and when other manufacturers have had their ICC-based color models for years it didn't really catch on and become that new standard like Adobe hoped, at least not yet.

There are some technical limitations too, one is that DNG Profiles with LUTs will truncate the camera's colors to the ProPhoto triangle which does mean that some of the human gamut is truncated. For practical applications this is not a problem (DCamProf has this limitation too for practical reasons), but may be a problem for certain scientific applications. Another issue is that the LUTs cannot make adjustments to the neutral axis as adjustments are based on multiplying input values (an ICC profile LUT can instead map any input triplet to any output triplet). This is generally not a problem as a camera doesn't drift along the neutral axis, but if you would copy say printed black and white photographs those prints would need neutral adjustments an ICC profile would work better. For the same reason you cannot use a DNG profile to make "sepia toning" as that requires changing the neutral color, while ICC can be used for such tasks.

As the DNG specification also forbids value scaling of the neutral axis the LUTs cannot be used to linearize or apply curves either, which limits the design options a little, which is not the case in ICC. You can embed a tone-curve though.

A "political" problem is that Adobe's Lightroom (arguably) doesn't have very good reputation concerning color reproduction, many think that Phase One's Capture One renders better color for example. This is not really the DCP format's fault, but how the profile designers have designed the look. I think it has kept back the format a bit though.

It should also be said that ICC profiles are not that bad if the conversion pipeline takes into account its limitations. For example apply a gamma and handle highlights separately (as Capture One does). The worst drawback with ICCs is that the conversion pipeline for camera raws is in practice not standardized so it's not certain that an ICC profile designed for one raw converter can be used in another. ICC version 2 is also integer based which makes it a delicate process to make a color conversion pipeline that doesn't lose relevant precision. ICC version 4 supports floating point but hasn't really catched on.

DNG profiles have a white balance model built-in, while ICC profiles don't touch that property. This can make DNG profiles harder to integrate into raw converters that have a history prior to DNG, as their white balance model may be way different and incompatible with how DNG profiles expects it to be. It's not a show-stopper though as the white balance model can be ignored, but then DNG profiles risk to end up the same as with ICC profiles, that is no interoperability between raw converters.

For third party profile makers like DCamProf it's a sad fact that Adobe's products causes white balance shifts unless the color matrices are copied from Adobe's own profiles. This is not a problem of the format, but a problem with Adobe's raw conversion implementation.

As a raw software developer I prefer to work with DNG profiles as they're more well-defined and the conversion pipeline is more intuitive. However, I wouldn't say that ICC profiles really were so lacking that Adobe had to create their own format so in a way it's an unnecessary format and perhaps it would have been better to put more energy into updating the ICC standard for camera profiles instead.

The dual-illuminant feature is neat for all-around profiles, as you can support more light conditions with one profile. If you're into accuracy you'll need one profile for the specific light condition you're in anyway though of course. Two illuminants, tungsten and D65, does cover a wide range, but it would have been nice if ever more illuminants could have been included. Hasselblad for example has four illuminants in their proprietary profile format in their raw converter Phocus (they separate daylight and flash for example). Selecting the appropriate ICC profile for your shooting condition is not too hard either though.

You have probably heard/read that "DNG profiles are scene-referred and ICC profiles are output-referred", and in the next sentence it's said that scene-referred is better. This is only partially true. In practice almost all DNG profiles are output-referred too (through the curve and/or LookTable), and ICC profiles can be designed to scene-referred. While "scene-referred" could be said to be "better", or at least more modern (as discussed in the introduction), no raw converter today is designed to use scene-referred profiles for general-purpose photography, including Adobe's products.

Artificial light sources for profiling

Spectrum of a High-CRI blue pumped LED, with CCT 5800K.

Spectrum of a High-CRI violet pumped LED, with CCT 5000K. The re-emitting phosphors are quite weak here making the violet peak really stand out, but instead the spectrum from 440 and up is very smooth. The sensitivity of the eye and cameras is low at 400 nm, so the peak may/might be okay for camera profiling.

Spectrum of a High-CRI violet pumped LED, with CCT 5600K. Here the phosphors emit more, so the violet peak is not as pronounced, but then the overall spectrum is more wavy.

Spectrum of a 8 channel programmable LED, here simulating D65.

D65 fluorescent daylight tubes (pink), 22 channel programmable LED (blue), and as reference D65 standard illuminant (green). The fluorescent spectrum is very worried and peaky. The programmable LED can match the D65 extremely well, except for that it lacks ultra-violet output (not required for camera profiling anyway).

Xenon-based camera flash. The spectrum has some "noise" but too small to be a problem for camera profiling. Xenon lamps have lots of spiky infra-red output (not seen in this diagram), but as it's outside the camera's sensitivity that is no problem.

Standard halogen simulating StdA, and a blue-filter reflector halogen simulating D50. Both with tuned voltages. Very good simulators at a relatively low cost.

Halogen spotlight with high-end daylight filter to match D65. The diagram range is 300 to 830 which shows the halogen's inability to output ultra-violet and infra-red to match. For camera profiling this does not matter though as the camera is not sensitive in that range.

The standard observer (smooth curves) and a camera's sensitivity. As we can see the sensitivity is very low below 400nm and above 680nm. Many artificial lights have issues with output around that range, but as the sensitivity is low there for both cameras and humans the resulting effect of disturbances in this range (a peak or a dip or no output at all) is small.

Light temperature is the "color of the light", the higher temperature the bluer light, the lower the redder. As the eye reacts to tristimulus values a specific light temperature can be simulated with a peaky spectrum. This happens with many of the simpler "daylight" lamps, they can be spot on in terms of temperature but the peaky spectrum doesn't make up for a good profiling source (unless you want to profile for that particular peaky light).

In camera profiling we want full-spectrum light sources, and we want to avoid any spikes or dips in the spectrum if we can. Camera profiling is in a way more sensitive than print viewing applications, as cameras register colors differently from humans. A light source with a spiky irregular spectrum can exaggerate the differences between human vision and camera.

If you want to make a profile that should be used under a particular light source you should of course use that. The listing here is about light sources for making all-around profiles. When doing that you are typically most interested in three standard illuminants:

A DNG dual-illuminant profile is most often made with StdA and D65. A single-illuminant all-around profile is most often made for D50. It can be harder to get a good D65 light source than D50. A dual-illuminant profile with StdA and D50 still makes sense, as there's still a big difference in light chromaticity. Higher temperatures are more tightly spaced. Look at the color temperatures plotted in a chromaticity diagram to get and idea of how much they differ.

If we want to simulate standard illuminants in the StdA to D65 range there are the following technologies to choose from:

Halogen lamps

If we disregard from the super-expensive 20+ multi-channel LEDs, the filtered halogens are still number one when it comes to producing a smooth spectrum highly similar to D50 or D65. As StdA is modeled after a 2850K blackbody a cheap unfiltered halogen is perfect for that, just tune the voltage to get 2850K and you have StdA.

The drawback is that halogens are not very practical. They are very energy inefficient, get very hot, have considerable sample-to-sample variation (say +/-300K), change temperature with age and burns out relatively quickly. They're on the way out and will eventually be replaced by LED solutions. For optimal precision you need to power your halogens with a variable power supply and tune the temperature by tuning the voltage. You can run them on a fair bit of overdrive, say 15 volts instead of 12 to get a considerably higher color temperature, but the lamp will then burn out very quickly.

The lamps can be run on both AC and DC. They're typically run on AC, but if you want to fine-tune the voltage you're more likely to find a suitable variable DC power supply than AC. Note that you need a quite high-power power supply, the ampere is often the limiting factor rather than volts. Ideally you should have a power supply that can deliver 5 ampere at 15 volts, that is 75 watts. If you have a 35 watt lamp instead of 50 watt you can get away with less, but you need more than 3 amperes still, meaning that a 15 volt 45 watt power supply won't do as it can only deliver 3 amperes. Another aspect to consider is that some lab cables sold in the same stores as the power sources are only designed for measurement applications and will not handle 3-5 amperes and thus power is lost in the cables leaving the lamp under-powered.

In other words, if you do get a variable power supply, make sure you get capable gear. Unfortunately it can be a bit expensive (say €100). In theory a variable AC source would be cheaper as it can be a really simple construction, but unless you build your own you probably won't find any except those designed for advanced testing purposes with a price tag of several hundreds of euros. So in practice a variable DC power supply is the most feasible.

Note that fixed power sources for halogen lamps are often 11.5 volts, that is a little under-powered which may leave lamps at a lower color temperature than advertised.

The MR-16 form factor with the old GX5.3 socket is common for specialty high temperature halogen lamps, and it's today hard to find desk lamps for that. You can try finding one second hand or get a rail-mount spotlight that supports MR-16/GX5.3 (a little bit easier to find than desk lamps). I got a rail-mount spot light and strapped it to a leftover tripod. Indeed an ugly hack, but used only for profiling so I do not need a good-looking permanent installation.

If you want to drive it with a variable power supply you can usually just unscrew cables from the lamp and directly attach it to the power supply with crocodile clips.

An MR-16 halogen lamp will spread some light backwards and to the sides too, that stray light you should preferably shield off. So if you mount your lamp "naked" you should do some homemade shielding around it. Spotlights also spread a bit more than they should, there can be an inner disc with homogeneous primary light (that is where the whole target should fit), and then an outer disc with warmer weaker light. Making an extra lamp shade to take away most of that outer disc can be worthwhile, we want to minimize any extra light bouncing around in the room. Shading off the back if the lamp is open can also be worthwhile, but watch out to not seal it off completely so you get heat problems.

I recommend using 35W lamps rather than 50W, just make your exposures longer. The brighter lamps make the surrounding equipment more difficult to find and more expensive, and the lamps produce even more heat.

Halogen is a spot light source which makes it a bit difficult to get a broad even viewing light. When it comes to camera profiling this is no drawback though but rather the other way around. You can concentrate the light on the target and minimize any stray light bouncing around the room. Any unevenness in the light can be compensated in software with flatfield correction.

The lamp may drift a bit during the first minutes. It may be worthwhile to leave it on for a while before you start shooting.

LEDs

LED is the future. However, today you still need the super-expensive multi-channel programmable LEDs to compete with the filtered halogens when it comes to D50 or D65 simulation. If you can't afford that you can look at the high CRI LEDs.

As far as I know there are no high CRI LEDs specifically designed for D50 or D65 simulation, but a 5000K-6500K high CRI LED may still be a decent light source. I'm a bit worried about the bumpy spectrum though, so I'm not prepared to recommend this light source for high quality profiling. At the time of writing I would not use them myself, even the best from Yuji.

Recommendations

I haven't used all the listed products so I cannot make any absolute recommendations, but based on my experience, data sheets and other information I can say at least something of what the currently best artificial light sources are:

I wouldn't use fluorescents. I think they're just fine for print viewing, but the spiky spectra makes me worried when it comes to camera profiling. It will work though, and exactly how much the spikes hurt will depend on camera, target, etc, so it's not easy to predict. The same can be said about the high CRI LEDs. If I'm forced to guess I think that currently the best fluorescents are less bad than the best high CRI LEDs.

D65 is difficult. You can easily reach the temperature with a basic filtered halogen, but the spectrum will not look that good. Maybe even fluorescents are better than that. You're probably better off skipping D65 and doing D50 with a Solux instead.

The Solux is worth a special mention, if you surf the internet you'll find very mixed reviews, and many that do not succeed in getting remotely close to the advertised 4700K and even less so 5000K on overdrive. I had problems myself. Knowing about the mixed reviews I suspected the lamps first, but after some measurements it was shown to be due to bad lab cables and an under-powered DC power supply. Like all halogens the Solux lamps do vary a bit (+/-300K or so it seems), but with proper power source capable of some overdrive it should be able to deliver 5000K. Still it will have an outer disc of warmer light, and that cannot be mixed with the central cooler light, that is diffusers cannot be used, and you must place the target inside the cooler disc of light.

In other words it can be a bit messy to get the Solux deliver 5000K, but it really can and when it does it does it better and cheaper than the alternatives. The most costly part with a Solux lamp is getting a variable power supply with enough power, which can be 100 euro or so. You can run it on a fixed power source of course, but then you will not get more than the advertised 4700K or more likely a little bit less.

What is the value of matching StdA, D50 and D65 exactly?

If you make a camera profile for copy work it's easy to realize why it's good to make the profile under the exact same studio light as you are going to do the copy work.

However, if we're making a profile for general use, is there then still a value to match say D65? Outdoor daylight is infinitely variable, and never exactly matches D65 or D50, so why care? A good question, which needs a bit of discussion to be answered thoroughly.

If we make a dual-illuminant DNG profile we have a reason (far from critical though): the DNG color pipeline needs to know which temperature each color matrix corresponds to, and those temperatures are associated to EXIF light-sources, that is there is a pre-defined set of temperatures to choose from, D65/6500K is one, StdA/2850K is another. To make a perfect match we thus need a light source with a temperature that matches one of those pre-defined values. If the profile is single-illuminant that temperature tag will not be used.

How are those temperature tags used? A DNG profile can from white balance estimate the light temperature by running the values through the color matrix. When it's a dual illuminant profile it mixes the color matrices to get a more accurate result. For example, if it has a StdA/2850K and a D65/6500K matrix and the light temperature is exactly in-between (4700K) it mixes half/half. It may seem like an impossible problem as it must know the answer before it can know how it should mix the matrices, and to know the answer it must have a readily mixed matrix. However, this is resolved with an iterative loop (it starts with D50 an loops until stable), a standard method used to solve these types of hen and egg problems.

The important aspect to note here is that the temperature tags are only used for deciding the mixing of matrices. That is the temperature is still in full calculated from the matrix. So what happens if we have tagged the matrix to D65/6500K but the profile was made under 5800K light? This means that we will start using the D65 matrix alone a bit earlier than otherwise, but light temperature estimations is probably not affected in any significant way (as 5800K is similar in look to 6500K), and neither color correction.

So the answer to the question is that there is almost no value to match standard illuminants exactly. If you do several profiles for many cameras and mix test target profiles with profiles designed from SSFs it may be a value in having a fixed known reference. If performance is compared to other profiles it may be useful to have a fixed known reference that others can replicate. But when it comes to making profiles for your own use, you don't really need to match the standard illuminants. It's still preferable to know which temperature your calibration light source has, or even better the spectrum. This is used when making DNG profiles so it becomes good at estimating light temperatures from white balance.

So while matching a standard illuminant is not that valuable, there's still a few things to consider:

So this question is not about choosing an artificial lamp with bad spectral qualities rather than a good standard illuminant simulator, but mainly if we can use variable outdoor light instead of an expensive D65 simulator, and yes we can. Outdoor light is for free, which is great, but has a few disadvantages too:

Measuring a light source temperature

The best way to measure light source temperature is to do a full spectral measurement using a spectrometer. If you have Argyll installed you can do this with:

  spotread -a -H -x

Read the CCT temperature, tune the voltage (if you have a tunable light source like a halogen), read again, repeat until you get as close as possible to the targeted temperature. Example output:

 Result is XYZ: 2976.277908 2745.506152 849.883672, Yxy: 2745.506152 0.452895 0.417779
 Ambient = 2745.5 Lux, CCT = 2856K (Delta E 9.368483)
 Suggested EV @ ISO100 for 2745.5 Lux incident light = 10.1
 Closest Planckian temperature = 2749K (Delta E 5.815527)
 Closest Daylight temperature  = 4000K (Delta E 42.884670)
 Color Rendering Index (Ra) = 95.5

Here we see that we get CCT 2856K which is very close to the 2850K for StdA (don't mix it up with the closest planckian temperature, 2749K here). This is for about 10 volts of an MR-16 halogen lamp specified to 3000K. You cannot expect to get exactly at the xy coordinate for the standard illuminant, which for Std A is 0.44757, 0.40745 (we got 0.45299, 0.41778), and the CCT will vary a bit from measurement to measurement. Don't worry about that, profiling will not suffer from minor calibration illuminant offsets.

Before quitting save the spectrum ('s' key in spotread), it can later be used by DCamProf when making the profile.

If you run spotread with -S you also get a spectral plot for each measurement which can be interesting. It's a bit user-unfriendly though, the program may seem to lock up. You need to activate the plot window and press space to get back to the program to take the next measurement.

If you don't have a spectrometer to measure the temperature another way is to use a DNG profile coming with Adobe DNG Converter or bundled in Lightroom, set white balance on the white patch of your target and see what temperature it reports. As Adobe's DNG profiles are dual illuminant for StdA and D65 they're hopefully decent to identify those temperatures. I haven't tested this method myself, but seen okay results from others. Adobe's profiles are not accurate in terms of color (they apply a look), but the color temperature estimation should be as accurate as it can be with a camera. However, as accurate as it can be is actually not very accurate at all. It can easily be a few hundreds degrees off, so just estimating without help of the camera can be just as good (or bad).

Just estimating and hoping for the best is not too bad, being a few hundred degrees off doesn't matter as any reasonable camera should produce similar matrices for similar light. Also, having as good as possible is more about making the informational temperature shown as correct as possible rather than making the color as correct as possible, as a little difference in light temperature doesn't significantly alter color correction.

If you're making a DNG profile and will be using it in Adobe's products, you still may end up copying the color matrices from Adobe's bundled profiles to avoid white balance shift, and then your own temperature estimations will not be used at all.

Visually evaluating profiles using RawTherapee

RawTherapee is a free and open-source raw converter which can use both DNG and ICC profiles. Even if you don't intend to use it for your regular raw conversion it can be very useful during profile development as it's easier to switch between profiles than it is in for example Adobe Lightroom, and there's no hidden conversions being made so you can more easily isolate the effect of the profile than in most commercial raw converters.

RawTherapee also has a raw histogram (click on the raw histogram symbol beside the histogram to toggle on and off) which is useful to check if you have succeeded with ETTR of your test shots.

It's not specifically designed for profile testing though so there are a few quirks which will be covered in this guide.

Basic profile testing is done as follows:

  1. Open a raw file.
  2. Select "(Neutral)" processing profile to get a linear curve and no adjustments.
  3. Possibly adjust "Exposure compensation" slider to make the image brighter with pure linear scaling.
    • With "Highlight reconstruction" and "Highlight compression" disabled, the exposure slider is truly linear and highlights are clipped straight off, looking quite ugly but good in testing as light unclipped colors stay true.
  4. Go to the color tab, use white balance picker ("Spot WB") and select appropriate white.
    • If you have opened the actual test chart photo you can click the whitest patch.
    • In some cases it's not the lightest, see the documentation of the white balance flags for DCamProf make-profile command for more details.
  5. Scroll down to "Color Management" / "Input profile" / "Custom" and open the profile to test.
    • Important: RawTherapee has a memory cache of past loaded profiles so if you generate a new profile with the same name and open it again, the old will be used as it's already cached. Thus you need to restart RawTherapee or generate new names during iterative testing (I use to add a serial number to the name, test1.dcp, test2.dcp etc).
    • Quirk: it may not switch to "Custom" just because you opened a file, make sure the radio button selects the custom profile.
  6. Make sure "Working Profile" is "ProPhoto" (should be as it's default), and change "Output Profile" to "RT_Large_gsRGB" to minimize clipping of very saturated colors.

You should of course have a calibrated screen and if you are evaluating highly saturated colors it's preferable that you have a wide gamut screen. Depending on which platform you run the software you may need to configure RawTherapee to use the ICC profile of your screen. See RawTherapee's documentation.

Quick A/B swapping

If you want to do A/B testing between two different profiles you can open and change profile, but it's quite slow and you get the file dialog obstructing the view. A better method is to change GUI layout to tabbed mode so you can have several images open in different tabs. Then you copy your test image to a different name (if on Linux you can create a soft link instead) and open it in a separate tab and apply the other profile. Then you do instant A/B testing by clicking back and forth between tabs.

Note that A/B swapping is often a far superior comparison method than side-by-side comparison. This is due to that side by side comparisons suffer from the slight color shifts due to viewing angle differences. If you compare color appearance between one image with a curve applied and the other without a curve so that contrast is much different, A/B (with a few seconds to let the eye adapt) is certainly the only reasonable way to compare, side-by-side the eye/brain will be confused by seeing the same image with different contrast levels.

As an alternative to copy your image and switching between tabs is to use the "Snapshots" feature. First select one profile, add a snapshot, then the next, add another snapshot. You can then click back and forth between the snapshots for quick A/B testing.

Adjusting for off-white whitepoints

If you're making a profile for tungsten light and have the real test chart and light visible from the workstation and want to compare, the real tungsten light will probably appear as rather yellow as the eye does not make a full chromatic adaptation. This won't match the screen where white is represented as screen white. You may be able to "think away" this difference and still make comparative evaluations but you may also want to change the screen appearance to the same yellow. This should not be done by changing white balance as that will affect the profile's LUT starting point and cause the corrections to not work as intended.

Either you change the screen white using screen controls, or simpler use RawTherapee's "Color Channel Mixer" and adjust R, G and B to taste so it matches the real light as well as possible. The channel mixer is applied after the profile so it won't affect the LUT starting point as changing the white balance does.

Testing the profile with a film curve

If you want to test how the profile will look with a typical film curve there are several ways. You can with DCamProf make a DNG profile which includes a curve, and then you can turn that on and off in the profile selection box.

You can also design your own curve with the curve tool in the exposure tab. There you can choose different curve types, "film curve" is the slight modification of RGB curve that DNG software uses (Lightroom etc), while RGB curve is what ICC software generally use. The "perceptual" curve is close to the result of DCamProf's neutral tone reproduction operator.

Instead of designing your own curve you can use the contrast and lightness sliders and adjust to taste, this will create an RGB curve under the hood.

Smoothness sanity check

Making test shots that thoroughly tests gradient transitions between various colors (to test profile's LUT smoothness) is time-consuming, but there is a trick to test the same property without having specific test shots.

Bring up the shot of a target, preferably with many patches covering a large gamut. Then select the white balance slider and slide it smoothly either using the mouse or the arrow keys (the latter is easier). The patches should take on the cast of the white balance in a smooth way. If you see a sudden broken up transition the profile has some smoothness issues. Note that with extreme white balance changes you may see artifacts also for good profiles.

DCamProf can also generate a test image with the specific purpose to test gradients, so use this method only as a complement to that.

A brief evaluation of commercial test targets

Using DCamProf I've through spectral simulations virtually evaluated a number of real camera profiling targets. It works like this: by having measured spectral reflectance of the targets and the spectral sensitivity functions of the camera, as well as the light source the whole profiling process can be completed without a single shot taken. The generated profiles can then be evaluated against real spectra to see how well they match.

The following targets have been evaluated:

The following real spectral data has been used for evaluating matching performance:

Cameras used: Canon 5Dmk2 and Nikon D3x. Reference light: D50 (ie 5000K daylight).

Cameras have limited color matching ability so for reference I've generated a profile using lippman2000 + munsell colors to fill out, and same for nordic nature. These serve as a baseline reference to show a limit of how good it can get. For both cameras I get below 1.0 DE at p90 with a max below 2 DE for nature and below 1 max for humans, ie very good match for an ideally designed profile. The human color set is somewhat simpler to match as it does not contain any high saturation colors, while the nature set has some saturated flower colors in it.

Comments about the target spectra:

CC24/CCSG patches has smooth spectra without any obvious colorant limitations. It8 while a photographic target has quite smooth and varied spectra, covers a large gamut, spectral variation is better than I thought a photographic target would have. QPC202 spectra is smooth but more similar to an inkjet print. The Pixma print has largest gamut but also have some limitations in spectral variation due to the limited number of colorants, but most likely considerably better than an ordinary CMYK print as there are more inks.

On to matching performance:

Both cameras show very similar results after profiling (which is expected), so to shorten the presentation I've only used numbers from the 5D mark II. The matching is with 2.5D LUT. The numbers are average, median, 90th percentile and max (ie worst), DE values are CIEDE2000, and the LCH is the error split in Lightness, Chroma (=saturation) and Hue. Generally speaking hue error is worst, lightness error the least disturbing.

nordic-nature matching:

  cc24
  avg DE 0.75, DE LCh 0.36 0.39 0.41
  mdn DE 0.68, DE LCh 0.34 0.35 0.27
  p90 DE 1.27, DE LCh 0.69 0.74 0.92
  max DE 3.59, DE LCh 1.58 1.85 3.28

  ccsg
  avg DE 0.64, DE LCh 0.25 0.32 0.40
  mdn DE 0.51, DE LCh 0.19 0.28 0.27
  p90 DE 1.26, DE LCh 0.51 0.63 1.03
  max DE 2.95, DE LCh 1.99 1.68 2.21

  it8
  avg DE 0.91, DE LCh 0.35 0.51 0.54
  mdn DE 0.86, DE LCh 0.31 0.47 0.33
  p90 DE 1.59, DE LCh 0.75 1.00 1.20
  max DE 4.32, DE LCh 1.85 2.44 3.43

  qpc202
  avg DE 0.71, DE LCh 0.29 0.32 0.46
  mdn DE 0.62, DE LCh 0.23 0.25 0.35
  p90 DE 1.23, DE LCh 0.63 0.70 1.00
  max DE 3.72, DE LCh 1.72 1.49 3.35

  pixma
  avg DE 1.22, DE LCh 0.54 0.79 0.53
  mdn DE 1.16, DE LCh 0.53 0.72 0.36
  p90 DE 2.10, DE LCh 1.05 1.43 1.24
  max DE 5.51, DE LCh 1.87 3.63 3.95

Here we see that the Pixma and IT8 target has some problems compared to the others, but not much and looking deeper into the stats we see that it's highly saturated colors, both has problem with a specific light vivid orange patch.

All the others, including the seemingly simplistic CC24 perform at an equal level.

Lippmann2000 (skin/hair/lips) matching:

  cc24
  avg DE 0.52, DE LCh 0.10 0.22 0.41
  mdn DE 0.53, DE LCh 0.07 0.19 0.41
  p90 DE 0.77, DE LCh 0.21 0.44 0.73
  max DE 1.25, DE LCh 0.60 0.76 1.09

  ccsg
  avg DE 0.71, DE LCh 0.28 0.24 0.58
  mdn DE 0.77, DE LCh 0.28 0.20 0.63
  p90 DE 0.97, DE LCh 0.49 0.43 0.83
  max DE 1.26, DE LCh 0.84 0.74 1.11

  it8
  avg DE 0.58, DE LCh 0.18 0.19 0.48
  mdn DE 0.61, DE LCh 0.16 0.16 0.52
  p90 DE 0.83, DE LCh 0.37 0.40 0.72
  max DE 1.19, DE LCh 0.76 0.61 1.09

  qpc202
  avg DE 1.11, DE LCh 0.40 0.18 1.00
  mdn DE 1.27, DE LCh 0.43 0.17 1.18
  p90 DE 1.66, DE LCh 0.70 0.34 1.48
  max DE 2.01, DE LCh 1.02 0.52 1.75

  pixma
  avg DE 0.97, DE LCh 0.17 0.55 0.74
  mdn DE 1.10, DE LCh 0.12 0.55 0.82
  p90 DE 1.22, DE LCh 0.40 0.84 1.04
  max DE 1.50, DE LCh 0.91 1.03 1.35

Matching the human set, all targets do well. The ColorChecker SG has many "skintone" patches (foundation-tone patches I suppose) but it doesn't perform better than the CC24 still, and really when it's already below 1.0 you can make any real improvement. As long as the target is able to orient the camera into the skintone zone the the relative color differences within is handled well.

From this it looks like a CC24 is all you need, but isn't the super-saturated colors of the pixma target good at something? I haven't yet investigated thoroughly due to lack of spectral data but, I do suspect that it add some stability when dealing with subjects with super-saturated colors, for example what I see in running apparel when I shoot local running competitions for the my runner's club.

To just give some indication I generated artificial spectra along the pointer gamut border, that is a set with very saturated colors with smooth spectra:

Pointer border generated matching:

  cc24
  avg DE 2.30, DE LCh 1.53 0.84 1.25
  mdn DE 2.26, DE LCh 1.33 0.59 1.36
  p90 DE 4.20, DE LCh 3.51 1.97 2.16
  max DE 5.34, DE LCh 4.33 2.35 2.86

  ccsg
  avg DE 1.94, DE LCh 1.13 0.66 1.16
  mdn DE 1.84, DE LCh 0.88 0.44 1.17
  p90 DE 3.17, DE LCh 2.63 1.64 2.05
  max DE 4.30, DE LCh 4.25 2.24 2.65

  it8
  avg DE 1.87, DE LCh 0.82 0.64 1.32
  mdn DE 1.65, DE LCh 0.76 0.32 1.29
  p90 DE 3.17, DE LCh 1.63 1.72 2.53
  max DE 6.52, DE LCh 3.00 2.68 5.79

  qpc202
  avg DE 2.01, DE LCh 1.46 0.58 1.05
  mdn DE 1.59, DE LCh 0.99 0.38 0.86
  p90 DE 4.34, DE LCh 3.80 1.39 1.91
  max DE 5.57, DE LCh 4.60 2.17 2.74

  pixma
  avg DE 1.70, DE LCh 0.90 0.78 0.88
  mdn DE 1.20, DE LCh 0.87 0.22 0.54
  p90 DE 4.25, DE LCh 1.50 2.72 2.63
  max DE 7.12, DE LCh 1.97 5.75 4.20

  combo cc24 + pixma
  avg DE 1.26, DE LCh 0.75 0.39 0.70
  mdn DE 1.12, DE LCh 0.77 0.18 0.46
  p90 DE 2.22, DE LCh 1.52 1.25 1.90
  max DE 4.60, DE LCh 1.68 2.56 3.75

Here we see that while having a quite bad max (which is not surprising due to colorant limitations), the pixma target has the best median. The last one "combo" is a special one, where the CC24 is the primary target and then saturated colors are filled out with the pixma target. A profile generated this way performs as the CC24 with some added accuracy on saturated colors.

If you employ such a combination, getting a glossy target like the Colorchecker Digital SG seems to be a waste of money, but it assumes you have a multi-colorant inkjet printer and a spectrometer. And if you just have a CC24 and makes profiles with that, I think these simulations show that you should not really need to worry about the quality of those profiles, except possibly for super-saturated colors, CC24 is weakest in deep violet.

Note that in this evaluation I haven't looked at the performance of the bundled software that comes with some of the targets. All profiles have been generated by DCamProf.


Revision history


Copyright © 2015 – 2017 — Anders Torger.

top