Question

Quelqu'un connaît-il la formule correcte pour obtenir le niveau de saturation d'une couleur RVB ?

J'ai déjà une fonction qui le fait.J'en ai essayé des tas publiés sur Internet, mais seul celui-ci a semblé fonctionner (du premier coup) pour moi, mis à part le niveau de saturation qui était parfois légèrement dépassé.

rgb(204,153,51) devrait être égal hsl(40,60,50), à la place j'ai hsl(40,75,50).Comme vous pouvez le constater, ma teinte et ma luminosité sont correctes. En fait, la saturation est également généralement correcte, mais parfois ce n'est pas le cas et je dois corriger cela si je le peux.

C'est ce que j'ai construit jusqu'à présent, afin que je puisse vérifier que toutes les valeurs de couleur sont correctes pour mes images, avant de les stocker dans une base de données pour mon moteur de recherche.

enter image description here

Et c'est la fonction en question pour laquelle je pense que la saturation est mal calculée :

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;
}

Un indice que j'ai, expliquant pourquoi cela ne fonctionne pas à 100%, est que je convertis d'abord une couleur HEX en RVB, puis le RVB en HSL.S'agirait-il d'un problème dû aux couleurs sécurisées pour le Web ou pouvez-vous repérer autre chose qui pourrait provoquer cela dans la fonction ?Ou est-ce juste comme ça ?

MISE À JOUR 1

En essayant d'autres images, il semble qu'il s'agisse principalement de couleurs « beiges » (environ) qui sont légèrement saturées.En utilisant un sélecteur de couleurs, si je déplace la barre de saturation là où elle devrait être, il n'y a pas une énorme différence, alors peut-être que ma fonction de recherche ne détectera pas trop cela.Ce serait bien de le résoudre, avant Je l'exécute sur 500 000 photos.

LE CORRECTIF

Grâce à EntitéOmnipotente, ci-dessous, il a remarqué qu'il me manquait une pièce à ma fonction.J'ai changé:

$S = $delta / $max;

à:

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

et produit désormais des résultats 100 % corrects.

NOTE AMICALE

Si quelqu'un souhaite que le code produise cette table de couleurs, demandez-le simplement.

Était-ce utile?

La solution

Il semble qu'il vous manque une partie du calcul de saturation si votre luminance est > 0,5. comme indiqué ici dans ce code JavaScript HSL.

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top