Photography Asked by Florin Andrei on June 23, 2021
Say I’ve calibrated a monitor to the standard 6500k 2.2 gamma, and the color space is sRGB.
On this monitor, I would like to have a reasonably accurate representation of a monochromatic radiation (like a laser) of known wavelength.
The RGB pixel values should be deduced unambiguously from this data. How do I do it?
(I understand there is no way to truly show monochromatic stuff on a monitor – I’m just asking for the best approximation of the hue)
Maximally saturated monochromatic colors in sRGB
This is a list of sRGB values that preserve hue but are at the maximum color saturation achievable with sRGB in wavelength steps of 1nm from 390nm to 700nm.
These represent colors achievable by mixing D65 (White) with the XYZ colors along a monochromatic range such that the resulting color intersects with the sRGB gamut.
NM ----------------------------------- RGB -----------------------------------
390 146 0 255 145 0 255 145 0 255 145 0 255 145 0 255
395 145 0 255 145 0 255 145 0 255 145 0 255 145 0 255
400 145 0 255 145 0 255 145 0 255 145 0 255 145 0 255
405 145 0 255 145 0 255 145 0 255 144 0 255 144 0 255
410 144 0 255 144 0 255 144 0 255 144 0 255 144 0 255
415 144 0 255 144 0 255 143 0 255 143 0 255 143 0 255
420 143 0 255 142 0 255 142 0 255 142 0 255 142 0 255
425 141 0 255 141 0 255 140 0 255 140 0 255 139 0 255
430 139 0 255 138 0 255 138 0 255 137 0 255 136 0 255
435 136 0 255 135 0 255 134 0 255 133 0 255 132 0 255
440 131 0 255 130 0 255 129 0 255 128 0 255 126 0 255
445 125 0 255 123 0 255 122 0 255 120 0 255 118 0 255
450 116 0 255 113 0 255 111 0 255 108 0 255 105 0 255
455 102 0 255 98 0 255 94 0 255 89 0 255 84 0 255
460 77 0 255 70 0 255 61 0 255 48 0 255 25 0 255
465 0 37 255 0 56 255 0 71 255 0 82 255 0 93 255
470 0 102 255 0 111 255 0 120 255 0 128 255 0 136 255
475 0 143 255 0 151 255 0 158 255 0 165 255 0 172 255
480 0 179 255 0 186 255 0 193 255 0 200 255 0 207 255
485 0 214 255 0 220 255 0 227 255 0 233 255 0 240 255
490 0 246 255 0 252 255 0 255 252 0 255 246 0 255 241
495 0 255 236 0 255 231 0 255 227 0 255 223 0 255 219
500 0 255 216 0 255 212 0 255 209 0 255 206 0 255 203
505 0 255 201 0 255 198 0 255 195 0 255 193 0 255 191
510 0 255 188 0 255 186 0 255 184 0 255 182 0 255 180
515 0 255 178 0 255 176 0 255 174 0 255 173 0 255 171
520 0 255 169 0 255 167 0 255 166 0 255 164 0 255 162
525 0 255 160 0 255 158 0 255 157 0 255 155 0 255 152
530 0 255 150 0 255 148 0 255 146 0 255 143 0 255 141
535 0 255 138 0 255 135 0 255 132 0 255 128 0 255 124
540 0 255 120 0 255 115 0 255 110 0 255 104 0 255 98
545 0 255 90 0 255 80 0 255 68 0 255 50 0 255 14
550 45 255 0 68 255 0 84 255 0 97 255 0 109 255 0
555 120 255 0 131 255 0 140 255 0 150 255 0 158 255 0
560 167 255 0 176 255 0 184 255 0 192 255 0 201 255 0
565 209 255 0 217 255 0 226 255 0 234 255 0 242 255 0
570 251 255 0 255 250 0 255 242 0 255 234 0 255 227 0
575 255 220 0 255 213 0 255 206 0 255 200 0 255 193 0
580 255 187 0 255 182 0 255 176 0 255 170 0 255 165 0
585 255 160 0 255 154 0 255 149 0 255 144 0 255 139 0
590 255 134 0 255 129 0 255 125 0 255 120 0 255 115 0
595 255 110 0 255 106 0 255 101 0 255 97 0 255 92 0
600 255 87 0 255 83 0 255 78 0 255 73 0 255 68 0
605 255 62 0 255 56 0 255 50 0 255 44 0 255 36 0
610 255 26 0 255 10 0 255 0 19 255 0 30 255 0 37
615 255 0 42 255 0 47 255 0 50 255 0 53 255 0 56
620 255 0 59 255 0 61 255 0 63 255 0 65 255 0 66
625 255 0 68 255 0 69 255 0 70 255 0 72 255 0 73
630 255 0 74 255 0 75 255 0 76 255 0 76 255 0 77
635 255 0 78 255 0 79 255 0 79 255 0 80 255 0 81
640 255 0 81 255 0 82 255 0 82 255 0 83 255 0 83
645 255 0 84 255 0 84 255 0 84 255 0 85 255 0 85
650 255 0 85 255 0 86 255 0 86 255 0 86 255 0 86
655 255 0 87 255 0 87 255 0 87 255 0 87 255 0 87
660 255 0 87 255 0 88 255 0 88 255 0 88 255 0 88
665 255 0 88 255 0 88 255 0 88 255 0 88 255 0 88
670 255 0 88 255 0 89 255 0 89 255 0 89 255 0 89
675 255 0 89 255 0 89 255 0 89 255 0 89 255 0 89
680 255 0 89 255 0 89 255 0 89 255 0 89 255 0 89
685 255 0 89 255 0 89 255 0 90 255 0 90 255 0 90
690 255 0 90 255 0 90 255 0 90 255 0 90 255 0 90
695 255 0 90 255 0 90 255 0 90 255 0 90 255 0 90
700 255 0 90
This is an image in sRGB over 390 to 700nm
This is the Matlab code that produced the table and image.
% max_saturated_monochromatics in sRGB
r_xyY=[0.6400 0.3300 0.212656]; % sRGB Red
g_xyY=[0.3000 0.6000 0.715158]; % sRGB Green
b_xyY=[0.1500 0.0600 0.072186]; % sRGB Blue
w_xyY=[0.312727 0.329023 1.000000]; % D65 Whitepoint
% Whitepoint verify: xyYtoXYZ(r_xyY)+xyYtoXYZ(g_xyY)+xyYtoXYZ(b_xyY)
xy=[];
for i = 390:700
xy(i-389,:)=get_intersection_points(i);
end
r=xyYtoXYZ([xy repmat(1,311,1)]);
r=xyz2rgb(r);
f=.9999;
for i = 1:length(r) % reduce magnitude until legal max RGB
while max(r(i,:)) > 1
r(i,:)=f*r(i,:);
end
end
r=round(255*r); % represent in 0-255 for 8 bit RGB
w_rgb=[(390:700)' r];
fprintf("NM ----------------------------------- RGB -----------------------------------")
for i=390:700
if mod(i,5)==0
fprintf("n%3d ", w_rgb(i-389, 1));
end
fprintf(" %4d%4d%4d", w_rgb(i-389, 2:4));
if i==700
fprintf("n");
end
end
imag=[];
index=1;
for i = 1:length(w_rgb)
for ii = 1:2
imag(index,:,:)=reshape(repmat(w_rgb(i,2:4),200,1),1,200,3);
index=index+1;
end
if mod(i,10)==1
imag(index,:,:)=reshape(repmat([0 0 0],200,1),1,200,3);
index=index+1;
end
for ii = 1:2
imag(index,:,:)=reshape(repmat(w_rgb(i,2:4),200,1),1,200,3);
index=index+1;
end
end
imwrite(imag/255, 'sRGB_WaveLength.tif', 'Resolution', 150)
function XYZ = xyYtoXYZ(xyY)
X = xyY(:,1).*xyY(:,3)./xyY(:,2);
Y = xyY(:,3);
Z = (1-xyY(:,1)-xyY(:,2)).*xyY(:,3)./xyY(:,2);
XYZ = [X Y Z];
end
% intersection of D65 whitepoint and gamut edge with sRGB boundary chromaticities
function s_xy=get_intersection_points(wlen)
r_xy=[0.6400 0.3300];
g_xy=[0.3000 0.6000];
b_xy=[0.1500 0.0600];
w_xy=[0.312727 0.329023];
e_xy=getxy(wlen);
gb_xy=intersect(g_xy(1),g_xy(2), b_xy(1),b_xy(2), w_xy(1),w_xy(2), e_xy(1), e_xy(2));
rg_xy=intersect(r_xy(1),r_xy(2), g_xy(1),g_xy(2), w_xy(1),w_xy(2), e_xy(1), e_xy(2));
rb_xy=intersect(r_xy(1),r_xy(2), b_xy(1),b_xy(2), w_xy(1),w_xy(2), e_xy(1), e_xy(2));
% select intersection that cooresponds to
if wlen < 465
s_xy=rb_xy;
elseif wlen < 550
s_xy=gb_xy;
elseif wlen < 612
s_xy=rg_xy;
else
s_xy=rb_xy;
end
end
%find intersection of two lines given endpoints
function s_xy=intersect(x1,y1, x2,y2, x3,y3, x4,y4)
s_xy(1)=((x1*y2-y1*x2)*(x3-x4) - (x1-x2)*(x3*y4-y3*x4)) / ...
((x1-x2)*(y3-y4) - (y1-y2)*(x3-x4));
s_xy(2)=((x1*y2-y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)) / ...
((x1-x2)*(y3-y4) - (y1-y2)*(x3-x4));
end
function e_xy=getxy(wlength)
persistent cie
if isempty(cie)
cie=load('ciexyz31_1.txt'); % CIE1931 2 degree wavelength and XYZ in 1nm from 360nm to 830nm
end
cie400=cie;% (41:end,:);
s=sum(cie400(wlength-359,2:4)); % convert to xy chromaticity coordinates
e_xy(1)=cie400(wlength-359,2)/s;
e_xy(2)=cie400(wlength-359,3)/s;
end
Correct answer by doug on June 23, 2021
You're not really trying to produce a reasonable representation of a single wavelength because, as you have noted, an RGB color reproduction system is not capable of doing that. (Unless that wavelength of light happens to coincide with one of the wavelengths used for either red, green or blue by the emissive RGB system and if the display used emits a very narrow band for each color it uses. Most displays do not emit narrow color bands for the three colors they use, and even fewer displays emit a pure spectral color as one of those three.)
What you're actually trying to do is produce a similar retinal response in humans that would occur if a human perceived a specific wavelength. You can reproduce many colors that humans can perceive by varying the intensity of the each of the three color channels used by RGB color reproduction systems.
Unfortunately, the short answer is that for many pure spectral colors, you can't reproduce the same retinal response using emissive RGB color reproduction systems. If why this is so were a "relationship status" (Single, Married, Taken, etc.), the explanation for this would be "It's Complicated." We'll try to break it down briefly below, but to do so we're going to have to leave pure spectral colors behind for a bit and talk about how our color reproduction systems can emulate many of the things we see in the world around us.
There are reams of material that discuss how this may be accomplished and most are far too involved to attempt to summarize here in one answer. One of my favorites that is reasonably brief and uses "layman's terms" is this basic course on color reproduction hosted on Memcode. I'll use a few illustrations from it below. Various aspects of color reproduction have been covered in a wide variety of existing questions here at Photography SE.
Here are a few of them:
Why are Red, Green, and Blue the primary colors of light?
What does an unprocessed RAW file look like?
RAW files store 3 colors per pixel, or only one?
Why don't mainstream sensors use CYM filters instead of RGB?
Why are camera sensors green?
Why do we use RGB instead of wavelengths to represent colours?
As they apply to this question, the basic answer is that human vision is trichromatic. The three types of cones in the human retina are most sensitive to light at approximately 420, 534, and 564 nanometers. But each type of cone is also sensitive to a much wider range of wavelengths on each side of those peaks. Please note that though the three types of cones may be identified as "red", "green", and "blue", their peak sensitivities do not correspond to the three wavelengths of light used by RGB color reproduction systems. This is particularly the case with L-cones that are most sensitive to 564nm yellow-green light, even though we have been calling them our "red" cones since long before we could accurately measure the actual peak sensitivities of each of the three types of retinal cones.
Our color cameras are usually covered by a Bayer Mask with filters that are what we call "red", "green", and "blue". Our Bayer Masked sensor use colors that mimic (though not exactly) the sensitivities of our retinal cones. They're usually most sensitive to around 460, 540, and 600 nanometers. 600nm is a yellowish-orange color. There are no true 'Red' filters in a Bayer mask, all of the cute little drawings on the internet notwithstanding.
On the other hand, RGB color reproduction systems usually emit light at about 460, 525, and 640 nanometers. The specific colors can vary widely from one display to the next. Some four-color emissive displays also have a yellow channel at about 580nm, which is actually closer to the the 564nm peak sensitivity of our "red" cones than the 590-600nm peak of the "red" filters on our Bayer Masks or the 640nm light emitted by the 'Red' channel of our RGB color reproduction systems.
Here's a graph that shows the sensitivity of a specific CMOS color sensor. I've drawn vertical lines that correspond to typical RGB and RYGB emissive displays.
It should be fairly obvious from the graph that one can't just take the raw illuminances measured by a Bayer masked sensor and take the monochrome luminance values from each "red", "green", and "blue" filtered photosite and feed them to an RGB emissive display and expect to produce anywhere near the same human retinal response that the original scene produced. The raw values from a digital camera's sensor must be processed to give an RGB value for each pixel in an image, as well as transform the linear response of a digital sensor to the logarithmic (with an S-curve at the upper and lower bounds) response of human vision to differences in brightness.
The following section draws upon material included in the color course hosted at Memcode linked above.
Most of the things we see in the world around us emit or reflect a distribution of various wavelengths of light. We call this the spectral distribution of an object.
Note that the HeNe laser has a single vertical line at about 633nm. The other things show a wide spectral distribution. Also notice that "LCD Blue" and "LED Red", two of the colors emitted by different types of RGB displays, have a moderately wide spectral distribution.
Now let's look at the spectral distribution of white light reflected off of a lemon versus the spectral distribution of a (color correct) picture of that lemon on an emissive RGB screen.
How do our eyes see the same color for these different spectral distributions?
Even though the shape of the area of the response is different for each of the cones, the total area of each response is the same! It's the total area that determines the strength of the signal from each cone that is sent to our brain for processing into our perception of what stimulates our retinal cones.
Now let's go back and look at all of the colors humans can perceive. This is often illustrated using a graph in CIE color space.
From Wikipedia:
The CIE 1931 color spaces are the first defined quantitative links between distributions of wavelengths in the electromagnetic visible spectrum, and physiologically perceived colors in human color vision.
The CIE 1931 color space chromaticity diagram. The outer curved boundary is the spectral (or monochromatic) locus, with wavelengths shown in nanometers. Note that the colors your screen displays in this image are specified using sRGB, so the colors outside the sRGB gamut are not displayed properly. Depending on the color space and calibration of your display device, the sRGB colors may not be displayed properly either.
Pure spectral colors fall along the dark black line on the outer edge of the curve.
Now let's superimpose the color gamut that shows what a three color emissive display can reproduce based on the three colors it emits (shown as the corners of a triangle):
Notice that the edge of the CIE color space where the pure spectral colors are located are outside of the triangle that can be reproduced by the three colors at the corners of the triangle!
Here's a slightly more sophisticated graph that shows a wide variety of commonly used color spaces for emissive color reproduction systems. It's from this page at Clarkvision.com, which is another excellent resource for learning about color reproduction.
As you can see, what is by far the most commonly used color space by emissive color displays worldwide, sRGB, does not include any pure spectral colors. Neither does the second most common one used by most more advanced emissive displays, AdobeRGB. Some fairly recent (and far less common) wide gamut devices use color spaces that are even wider than AdobeRGB. DCI-P3 and Rec2020 are two such very wide gamut color spaces that a few high end monitors can reproduce with a high degree of coverage. Rec2020 is spectrally defined with Red, Green, and Blue primaries at 467, 532, and 630 nanometers respectively. Because of the shape of the spectral locus, which is not triangular in shape when plotted on a CIE grid, the remaining pure spectral colors that humans can perceive cannot be created by any RGB emissive color system technologies.
To get to the left of the line between 467nm and 572nm in the Rec2020 color space and produce a retinal response equivalent to, say, a pure wavelength of 500nm, one would need to produce a negative value for Red at 630nm. That is, one would need for the retina's L-cones ("red" cones) most sensitive to about 564nm to somehow subtract from the signal going to the brain created by the display's Green channel emitting at 572nm while also allowing a significant response from the M-cones ("green" cones) most sensitive to about 534nm.
Answered by Michael C on June 23, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP