RGB 到 HSL 函数中的饱和度计算不正确

Posted

技术标签:

【中文标题】RGB 到 HSL 函数中的饱和度计算不正确【英文标题】:Incorrect saturation calculation in RGB to HSL function 【发布时间】:2012-07-24 11:42:18 【问题描述】:

有人知道从 RGB 颜色中获取饱和度的正确公式吗?

我已经有一个功能可以做到这一点。我已经尝试过将它们发布在互联网上的大量内容,但只有这一个似乎对我有用(第一次),除了饱和度偶尔会略微下降。

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% 正确的结果。

友情提示

如果有人想要生成此颜色表的代码,请询问。

【问题讨论】:

【参考方案1】:

如果您的 luma > .5 as shown here in this javascript HSL code,您似乎错过了饱和度计算。

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

【讨论】:

太棒了,非常非常感谢。我在 php 中添加了重要的一行,现在它可以完美运行了。 我从一个流行的博客中得到了这个功能,迫不及待地想回来发表评论! :)

以上是关于RGB 到 HSL 函数中的饱和度计算不正确的主要内容,如果未能解决你的问题,请参考以下文章

色彩空间中的HSL,HSV,HSB有啥区别

6th week blog2(颜色)

6 week work 2

问个问题啊,hsl和hsb啥关系?

RGB颜色函数-RGB()颜色函数

2-4 Sass的函数功能-颜色函数