Frage

Kennt jemand die richtige Formel, um den Sättigungsgrad einer RGB-Farbe zu ermitteln?

Ich habe bereits eine Funktion, die das erledigt.Ich habe jede Menge davon im Internet ausprobiert, aber nur dieses schien (beim ersten Mal) für mich zu funktionieren, abgesehen davon, dass der Sättigungsgrad gelegentlich etwas daneben lag.

rgb(204,153,51) sollte gleich sein hsl(40,60,50), stattdessen habe ich hsl(40,75,50).Wie Sie sehen können, stimmen mein Farbton und meine Helligkeit. Tatsächlich stimmt auch die Sättigung größtenteils, aber manchmal stimmt das nicht, und ich muss das korrigieren, wenn ich kann.

Dies habe ich bisher erstellt, damit ich überprüfen kann, ob alle Farbwerte für meine Bilder korrekt sind, bevor ich sie in einer Datenbank für meine Suchmaschine speichere.

enter image description here

Und das ist die fragliche Funktion, bei der meiner Meinung nach die Sättigung falsch berechnet wird:

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

Ein Hinweis, den ich habe, warum das nicht zu 100 % funktioniert, ist, dass ich zuerst eine HEX-Farbe in RGB und dann RGB in HSL umwandle.Wäre dies aufgrund websicherer Farben ein Problem oder können Sie in der Funktion etwas anderes erkennen, das dies verursachen könnte?Oder ist es einfach so?

UPDATE 1

Beim Ausprobieren anderer Bilder scheint es sich überwiegend um „beige“ (ungefähr) Farben zu handeln, deren Sättigung leicht abweicht.Wenn ich mit einem Farbwähler den Sättigungsbalken an die Stelle verschiebe, an der er sein sollte, gibt es keinen großen Unterschied. Daher erkennt meine Suchfunktion dies möglicherweise nicht allzu sehr.Es wäre aber schön, das Problem zu lösen, Vor Ich lasse es auf 500.000 Fotos laufen.

DIE REPARATUR

Dank an Allmächtige Entität, Unten bemerkte er, dass mir ein Teil meiner Funktion fehlte.Ich habe mich verändert:

$S = $delta / $max;

Zu:

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

und liefert nun 100 % korrekte Ergebnisse.

FREUNDLICHER HINWEIS

Wenn jemand möchte, dass der Code diese Farbtabelle erstellt, fragen Sie einfach nach.

War es hilfreich?

Lösung

Es sieht so aus, als würde Ihnen ein Teil der Sättigungsberechnung fehlen, wenn Ihr Luma > 0,5 ist wie hier in diesem JavaScript-HSL-Code gezeigt.

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top