
In my goal to develop a deeper understanding of color manipulation in Adobe Photoshop—particularly for photographic images—I’ve been working to model Photoshop adjustments and blend modes at a mathematician’s level. Along the way I discovered Desmos, a free and powerful graphing calculator designed for education. Many of the articles I write will make extensive use of this tool, alongside supporting material from Photoshop.
Since my primary interest is color processing, I began by constructing a hue strip in RGB terms, paired with a visual output of the resulting colors. Even this first exercise turned out to be surprisingly instructive, particularly with regard to the differences between saturation and chroma, two measures of colorfulness. Moreover, it avails us of a nice opportunity to better understand the concept of luminosity, or perceived brightness of various colors.
I started by building a hue strip using the classical HSV model, generating RGB values across hues from 0 to 360 degrees. HSV is a sector-based system, meaning colors are constructed piecewise via linear interpolation between the primaries R, G, and B.

The result is a clean hue strip spanning all colors from left to right. If we compute the saturation (the “S” in HSV/HSB), we find it remains constant across the strip, at a value of 50%. That seems promising at first—but a closer look reveals issues.
There are visible peaks in both color intensity and perceived brightness at the secondary colors (yellow, cyan, and magenta), corresponding to hue values of 60°, 180°, and 300°. These are points where the RGB primaries combine evenly in the HSV formulation.
More importantly, when I began experimenting with RGB perturbations, the piecewise structure of HSV became a limitation. The discontinuities between sectors made it difficult to build intuition about how changes in RGB values would behave. Unlike HSV, which is defined in segments, a continuous model would allow smoother reasoning about how colors evolve under transformation.
Motivated by this, I turned to a cosine-based model for generating RGB values. This approach is simple: define three cosine curves, offset by 0° (R), 120° (G), and 240° (B).

The resulting hue strip is not only more visually pleasing, but also mathematically smooth. Unlike the HSV construction, which is piecewise and introduces discontinuities at sector boundaries, the cosine model is continuous and differentiable across all hues. This makes it a much better foundation for building intuition about color manipulation and understanding how transformations behave.
This comparison also highlights a deeper point: there are multiple ways to measure the “colorfulness” of a color.
HSV saturation is one such measure, but it is fairly crude—it depends only on the difference between the maximum and minimum RGB values, ignoring the contribution of the third channel.
A more robust alternative is called chroma, which can be thought of as the distance of a color from gray. In this work, I use an RMS (Euclidean) definition of chroma:
This equation is mathematically equivalent to the RMS deviation from gray:
Unlike HSV saturation, this measure incorporates all three RGB components, making it a more balanced representation of color intensity.
Interestingly—and importantly—in the cosine-based hue strip, this chroma remains constant across all hues. This is not accidental, but a direct consequence of the construction. Because the RGB channels are defined as cosine functions separated by 120°, the sum of their squared deviations from gray is constant, meaning the colors trace out a circle in RGB space.
This gives the cosine model a clean geometric interpretation: instead of traversing a hexagonal path (as in HSV), the hue strip follows a smooth circular path around the neutral axis. To my mind and eye, this makes chroma a more natural and stable “ground truth” for color intensity, at least for the kinds of transformations I’m interested in exploring.
Finally, luminosity is a perceptually tuned method for quantifying the perceived brightness of a color. As you look across the constant chroma hue strip, which region looks the brightest to you? And which region looks the darkest to you? If you’re a typical human, you’ll agree that the yellow-greens look the brightest, and the magenta-blues look the darkest (in spite of them all being of equal color intensity). Those differences are actual perceptual luminosity differences, and in general, when one talks about luminosity (instead of, say brightness) this is what is meant.
Luminosity is such an important quality it is deeply embedded within the Photoshop ecosystem. For example, if I change the blend mode of a layer to luminosity, Photoshop will weight the channel values to represent them according to this perceived luminosity. Alternatively, if I set the blend mode to color, my adjustment will only change color, leaving perceived luminosity intact (Which means Photoshop has to modify the other color properties like saturation to adapt – we can’t have our cake and eat it too). Moreover, luminosity is also embedded into Blendif gray sliders, and even Channel Calculations.
A bit of reverse engineering reveals that Photoshop is using luminosity weighting values close to 0.3 for Red, 0.59 for green, and 0.11 for blue. Those correspond (with some rounding error) to the Rec. 601 standard, which is a bit dated (rec. 709 is the modern standard), but in practice just fine.

Leave a Reply