Image processing 有没有办法检查XYZ三元组是否为有效颜色?

Image processing 有没有办法检查XYZ三元组是否为有效颜色?,image-processing,colors,computer-vision,Image Processing,Colors,Computer Vision,XYZ颜色空间包含所有可能的颜色,而不仅仅是那些可以由特定设备(如显示器)生成的颜色。并非所有XYZ三元组都表示物理上可能的颜色。给定一个XYZ三元组,有没有办法确定它是否代表一种真实的颜色 我想为自己制作一张CIE 1931色度图(见下文),但不知道该怎么做。例如,很容易将sRGB三元组的所有组合转换为色度图的xy坐标,然后绘制它们。但不能在XYZ颜色空间中使用相同的方法,因为并非所有组合都是有效的颜色。到目前为止,我想到的最好的方法是随机方法,我通过对随机高斯数求和,然后使用标准观测函数将其

XYZ颜色空间包含所有可能的颜色,而不仅仅是那些可以由特定设备(如显示器)生成的颜色。并非所有XYZ三元组都表示物理上可能的颜色。给定一个XYZ三元组,有没有办法确定它是否代表一种真实的颜色

我想为自己制作一张CIE 1931色度图(见下文),但不知道该怎么做。例如,很容易将sRGB三元组的所有组合转换为色度图的xy坐标,然后绘制它们。但不能在XYZ颜色空间中使用相同的方法,因为并非所有组合都是有效的颜色。到目前为止,我想到的最好的方法是随机方法,我通过对随机高斯数求和,然后使用标准观测函数将其转换为XYZ,生成随机光谱分布


仔细考虑后,我觉得最明显的解决方案是在光谱轨迹边缘周围生成一个xy点列表,对应于纯单色颜色。在我看来,这可以通过直接将可见频率(~380-780nm)输入CIE XYZ标准观察者颜色匹配函数来实现。将这些点视为凸多边形,可以使用一种算法或另一种算法确定点是否在光谱轨迹内。在我的例子中,因为我真正想做的是简单地生成色度图,我只需将这些点输入图形库的多边形绘制例程,然后对于多边形的每个像素,我可以将其转换为sRGB

我相信这个解决方案与Kel在评论中链接的库所使用的解决方案类似。我不完全确定,因为我不熟悉Python

函数RGBfromXYZ(X,Y,Z){ 常数R=3.2404542*X-1.5371385*Y-0.4985314*Z 常数G=-0.969266*X+1.8760108*Y+0.0415560*Z 常数B=0.0556434*X-0.2040259*Y+1.0572252*Z 返回[R,G,B] } 函数XYZfromYxy(Y,x,Y){ 常数X=Y/Y*X 常数Z=Y/Y*(1-x-Y) 返回[X,Y,Z] } 函数srgb_from_linear(x){ 如果(x ctx.lineTo(…点)) ctx.closePath() ctx.fill() const imageData=ctx.getImageData(0,0,canvas.width,canvas.height) for(设y=0;y0){ 常数[X,Y,Z]=XYZfromYxy(1,X/canvas.width,Y/canvas.height) 常数[R,G,B]=RGBfromXYZ(X,Y,Z) 常数r=Math.round(srgb\u来自线性(r/Math.sqrt(r**2+G**2+B**2))*255) 常数g=数学圆(srgb从线性(g/Math.sqrt(R**2+g**2+B**2))*255) 常量b=数学圆(srgb从线性(b/Math.sqrt(R**2+G**2+b**2))*255) imageData.data[(y*canvas.width+x)*4+0]=r imageData.data[(y*canvas.width+x)*4+1]=g imageData.data[(y*canvas.width+x)*4+2]=b } } }
ctx.putImageData(imageData,0,0)我不明白。如果将sRGB值转换为xy会得到一个有效的图表,为什么不将它们转换为XYZ会得到一个有效的图表?可观察的颜色比sRGB跨越更大的空间,所以你无法了解全部内容,但这在两种情况下都是正确的。这是一个重复的?注意,现在有了
颜色。在\u内可见吗_光谱
用于该确切目的的定义。@Cris sRGB颜色空间是XYZ空间的一个子集,因此只会填充图表的一部分。但是,如果显示xy图,这与实际情况有什么不同?@CrisLuengo该图表表示所有可能的色度(如人眼内可能的色度)颜色。XYZ颜色空间是这些颜色的超集,这就是为什么某些XYZ值不代表真实颜色的原因。sRGB颜色空间是一个子集。这意味着,如果将所有可能的sRGB颜色映射到上图中,它们将只占据光谱“lotus”中的一个小区域形状。sRGB颜色空间不包括所有可能的颜色。这张图像演示了这一点:看起来您在这里寻找两种不同的东西,生成色度图和检查某些给定的CIE XYZ三刺激值是否代表颜色值是完全不同的任务。对于前者,您确实需要将xy色度坐标网格插入sRGB,并使用光谱轨迹对其进行剪裁,该轨迹通过将CMF转换为xy色度坐标给出。对于后者,您需要按照我的评论和链接问题中所述进行操作。@KelSolaar我提到了如何使用此方法通过determini确定颜色是否真实如果它的坐标落在光谱轨迹的形状内,则为ng。如果你能做一个,则可以做另一个。对不起,我应该更清楚:你的测试只有在你能使用HDR颜色时才有效:你会在CIE xyY中找到点,例如xyY=[0.2,0.1,0.9],sRGB=[1.30842 0.20565 6.57576],这不符合“有界”可见光谱,如果你不能使用HDR颜色。请查看该页:仅保留可见光谱和光谱轨迹分量。值得补充的是,一些CMF一旦绘制在色度图中就不是凸的,因此2d方法在这里不起作用。