Domanda

Qualcuno sa la formula corretta per ottenere il livello di saturazione da un colore RGB?

Ho già una funzione che lo fa.Ho provato un sacco di loro pubblicato su internet, ma solo questo sembrava funzionare (la prima volta) per me, a prescindere dal livello di saturazione occasionalmente leggermente in fuori.

rgb(204,153,51) dovrebbe essere uguale hsl(40,60,50), invece ho hsl(40,75,50).Come potete vedere la mia tonalità e la luminosità sono corrette, infatti, la saturazione è per lo più corretto, ma a volte non e ho bisogno di correggere, se posso.

Questo è quello che ho costruito finora, in modo da poter controllare tutti i valori di colore corretto per le mie immagini, prima di riporli in un database per il mio motore di ricerca.

enter image description here

E questa è la funzione in questione, dove credo che la saturazione viene calcolato in modo non corretto:

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 indizio che ho, perché questo non funziona al 100%, è che io prima la conversione ESADECIMALE colore in RGB, quindi RGB per un HSL.Questo sarebbe un problema dovuto a colori sicuri per il web o si può localizzare qualsiasi altra cosa che potrebbe causare questo in funzione?O è proprio così?

UPDATE 1

Cercando altre immagini, sembra essere per lo più 'beige' (ca.) colori che sono leggermente la saturazione.Utilizzando un selettore di colore, se sposto la saturazione bar a dove dovrebbe essere, non c'è una differenza enorme, quindi forse la mia funzione di ricerca non prendere su questo troppo.Sarebbe bello risolvere, però, la prima Ho eseguito su di 500.000 foto.

LA CORREZIONE

Grazie a OmnipotentEntity, qui di seguito, ha notato che mi manca un pezzo per la mia funzione.Ho cambiato:

$S = $delta / $max;

a:

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

e ora produce il 100% dei risultati corretti.

AMICHEVOLE NOTA

Se c'è qualcuno che vorrebbe il codice per produrre questa tabella di colore, basta chiedere.

È stato utile?

Soluzione

Sembra che ti manca un pezzo di calcolo per la saturazione se la luminanza è > .5 come mostrato qui, in questo JavaScript HSL codice.

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top