有人知道正确的公式可以从RGB颜色获得饱和度吗?

我已经有一个功能可以做到这一点。我已经尝试了将它们的负载发布到Internet上,但是除了饱和度偶尔会稍微消失之外,似乎只有这对我来说是第一次(第一次)。
rgb(204,153,51)应该等于hsl(40,60,50),而不是hsl(40,75,50)。正如您所看到的,实际上,我的色相和亮度是正确的,饱和度在大多数情况下也是正确的,但有时不是正确的,如果可以的话,我需要对其进行校正。

这是我到目前为止构建的内容,因此,在将它们存储在搜索引擎的数据库中之前,我可以检查所有颜色值对于我的图像是否正确。

这是有问题的函数,我认为饱和度计算不正确:

function RGBtoHSL($red, $green, $blue)
{
    $r = $red / 255.0;
    $g = $green / 255.0;
    $b = $blue / 255.0;
    $H = 0;
    $S = 0;
    $V = 0;

    $min = min($r,$g,$b);
    $max = max($r,$g,$b);
    $delta = ($max - $min);

    $L = ($max + $min) / 2.0;

    if($delta == 0) {
        $H = 0;
        $S = 0;
    } else {
        $S = $delta / $max;

        $dR = ((($max - $r) / 6) + ($delta / 2)) / $delta;
        $dG = ((($max - $g) / 6) + ($delta / 2)) / $delta;
        $dB = ((($max - $b) / 6) + ($delta / 2)) / $delta;

        if ($r == $max)
            $H = $dB - $dG;
        else if($g == $max)
            $H = (1/3) + $dR - $dB;
        else
            $H = (2/3) + $dG - $dR;

        if ($H < 0)
            $H += 1;
        if ($H > 1)
            $H -= 1;
    }
    $HSL = ($H*360).', '.($S*100).', '.round(($L*100),0);
    return $HSL;
}

关于为什么不能100%正常运行的一个线索是,我先将HEX颜色转换为RGB,然后将RGB转换为HSL。由于网络安全的颜色是否会造成问题,或者您能在功能中发现可能导致此问题的任何其他因素吗?还是这就是原来的样子?

更新1

尝试其他图像时,似乎大多数是“米色”(近似)颜色,饱和时略微超出。使用颜色选择器,如果我将饱和度栏移动到应该的位置,则不会有太大的区别,因此也许我的搜索功能不会对此有太多帮助。不过,在我用500,000张照片运行它之前,解决它会很不错。

修复

多亏了下面的 OmnipotentEntity ,他发现我的函数缺少了一块。我变了:
$S = $delta / $max;

至:
$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);

现在会产生100%正确的结果。

友情提示

如果有人希望代码生成此颜色表,只需询问。

最佳答案

如果您的亮度> .5 as shown here in this JavaScript HSL code,则似乎缺少一部分饱和度计算。

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;

关于php - 从RGB到HSL功能的饱和度计算不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11659947/

10-10 23:39