如何为sRGB中的一对色度坐标x,y计算Y的最大可能值

时间:2019-03-28 18:56:29

标签: image colors srgb

我认为应该有一定的距离,从距离到原色,或者是连接点和白点的线与色域的界限相交。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用数值方法很好地逼近Y,但是很难确定公式。

Y的最大值为100,因此,为了避免难以找到sRGB内的起点,我可能会对一个稍有不同的问题进行数值近似。

我知道(100,x,y)的Yxy可能超出范围,因此我将减小Y直到达到sRGB色域。大约0.5-0.2的间隔就足够了。

答案 1 :(得分:0)

最简单,最准确的方法是转换为sRGB,将亮度设置为最大,然后转换回XYZ。转换为sRGB时,必须确保选择一个Y值,该值将在色域内对任何点x,y给出结果(该值必须低于最小相对亮度系数,对于sRGB,该值是≃0.072(对于蓝色)。请注意,这不会检查点x,y是否在色域内:

#include <Math.au3>

;XYZtosRGB

Global $RsRGB[3] = [3.2409699, -1.5373832, -0.4986108]
Global $GsRGB[3] = [-0.9692436, 1.8759675, 0.0415551]
Global $BsRGB[3] = [0.0556301, -0.203977, 1.0569715]

;sRGBtoXYZ

Global $XsRGB[3] = [0.4123908, 0.3575843, 0.1804808]
Global $YsRGB[3] = [0.212639, 0.7151687, 0.0721923]
Global $ZsRGB[3] = [0.0193308, 0.1191948, 0.9505322]

Global $Wx = 0.3127, $Wy = 0.3290

Func DP($T, $S)
    return $T[0] * $S[0] + $T[1] * $S[1] + $T[2] * $S[2]
EndFunc

Func xyYtoXYZ($xyY)
    Local $XYZ = $xyY
    If $xyY[2] <> 0 Then
        $XYZ[0] = $xyY[0] * $xyY[2] / $xyY[1]
        $XYZ[2] = $xyY[2] * (1 - $xyY[0] - $xyY[1]) / $xyY[1]
    Else
        $XYZ[0] = 0
        $XYZ[2] = 0
    EndIf
    $XYZ[1] = $xyY[2]
    Return $XYZ
EndFunc

Func FindY($x, $y)
    Local $xyY = [$x, $y, 0.07]
    Local $XYZ = xyYtoXYZ($xyY)
    Local $sRGBin = [DP($RsRGB, $XYZ), DP($GsRGB, $XYZ), DP($BsRGB, $XYZ)]
    Local $inc = _Min(_Min(1 / $RGBin[0], 1 / $RGBin[1]), 1 / $RGBin[2])
    Local $sRGBout = [$sRGBin[0] * $inc, $sRGBin[1] * $inc, $sRGBin[2] * $inc]
    Return DP($YsRGB, $sRGBout)
EndFunc