gamut.7z (1.2 KB)

I just want to share my gamut limiter algo

The idea is originated from the following observation:

Saturation in HSV color model

*Cmax* = max(*R*’, *G*’, *B*’)

*Cmin* = min(*R*’, *G*’, *B*’)

S= (Cmax - Cmin ) / Cmax

Saturation in HSI color model

They both can be rewritten as follow:

saturation = 1 - (minvalue/luminance)

minvalue=min(r,g,b)

Luminance is HSV color space is max(r,g,b)

This is convenient because using this formula values greater than 1 are out-of-gamut colors

I calculate luminance in this way

lum = r* 0.25 +g* 0.50 + b * 0.25;

This is close to the real luminance but it doesn’t becomes negative with real images with strong blue neon colors.

The saturation correction is done in this way:

rgb=(rgb-lum)*saturation_correction+lum;

The default gamut limiter value is 89% of the max possible saturation because it gives a good path to white if used before a rgb tonemapping (like sigmoid)