Human Visual Gamut Boundary

Introduction

In theory the gamut of human visual system (HVS) has no boundary, as one could arbitrarily increase the light power and the gamut extends to infinity. But we could sample the space to provide an intuitive visualization of the gamut. The right place to reason about this is the chromaticity diagram, in which the HVS gamut does have a boundary. In theory, all we have to do is to cover the entirety of the gamut in the chromaticity diagram — for each point there we it convert to a corresponding color in the absolute space (e.g., XYZ/RGB) and eventually we will have found all the colors in the HVS gamut there. But of course we can't cover the entire chromaticity gamut either since that's a continuous area (albeit bounded); we have to sample the gamut there.

So the first order of business is: how do we sample the chromaticity gamut? We could randomly sample the spectrum and come up with arbitrary stimuli, but because of metamerisms we might end up with a bunch of stimuli that correspond to the same point in the gamut. So we need an organized strategy to cover the chromaticity gamut.

The canonical way is to use equal-peak-energy stimuli, which are essentially waves with a continuous band with the same peak energy. For instance, assuming we sample the visible spectrum by 5, these stimulis would be $[1~0~0~0~0]$, $[0~1~0~0~0]$, ..., $[0~0~0~0~1]$ (for bandwidth of 1), $[1~1~0~0~0]$, $[0~1~1~0~0]$, ..., $[1~0~0~0~1]$ (for bandwidth of 2), ..., and $[1~1~1~1~1]$ (for bandwidth of 5). Note that there are at most two transitions (0→1 or 1→0) in an entire stimulus. Essentially we create square pulses with different width and rotate the pulses. See a more detailed example by Bruce Lindbloom here and how these stimuli can be generated in Colour.

This sampling strategy can guarantee that we never sample metamers. That is, no two stimuli will end up at the same point in the chromaticity gamut. While a formal proof is left for you to work on, intuitively, this is because we are iteratively creating linear combinations of a convex hull in a fixed pattern (the spectral locus in xy-chromaticity diagram is convex). As you will see in the visualization later, this method starts from the spectral locus and iteratively shrink the locus in the chromaticity diagram.

Non-canonical Territory. Now that we have a way to sample the chromaticity gamut, there are infinite many ways to generate a color from its chromaticities. Essentially we can scale up or down the SPDs of the equal-peak-energy stimuli used above. We could, for instance, use equal-total-energy, rather than equal-peak-energy, stimuli, where the total energy across the visible spectrum is the same across stimuli. So if we assume that the total energy is 3, then $[1~1~0~0~0]$ would be scaled to $[1.5~1.5~0~0~0]$, with also at most 2 transitions (for the same reason). Or we could try equal-distance stimuli, where the distances of all colors and the origin are the same. The boundary we generate will be part of a sphere. So if we assume that the distance is 1, then $[1~1~0~0~0]$ would be scaled to $[\frac{1}{\sqrt{2}}~\frac{1}{\sqrt{2}}~0~0~0]$.

From the visualization, can you tell what changes, and what does not change, when you switch from equal-peak-energy to these non-canonical stimuli? Can you see why equal-peak-energy is preferred?

Visualization

Pick a stimuli mode and click "Start". You will see that the HVS gamut is being built step by step, and the gamut in the chromacitity diagram is sampled accordingly. Once the gamut is generated, you can hover and click any point in the chromaticity diagram, which will highlight a curve. The SPD of the particular stimulus you click will show up on the bottom right.

Try clicking different points on the same highlighted curve and pay attention to their SPDs. You will see that all the points on the same curve have the same bandwidth but are shifted. Click a different curve, and you will see that points on different curves have different bandwidths.