Pregunta

¿Alguien sabe la fórmula correcta para obtener el nivel de saturación de un color RGB?

Ya tengo una función que lo hace. He intentado cargas de ellos publicados en Internet, pero solo este parecía funcionar (por primera vez) para mí, aparte del nivel de saturación ocasionalmente fuera.

rgb(204,153,51) debe igualar hsl(40,60,50), en lugar de que tengo hsl(40,75,50). Como puede ver, mi tono y la ligereza son correctos, de hecho, la saturación también es correcta, pero a veces no es y necesito corregir que si puedo.

Esto es lo que he construido hasta ahora, por lo que puedo verificar que todos los valores de color son correctos para mis imágenes, antes de almacenarlas en una base de datos para mi motor de búsqueda.

ingrese la descripción de la imagen aquí

y esta es la función en cuestión donde creo que la saturación se calcula incorrectamente:

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

Una pista que tengo, en cuanto a por qué esto no funciona al 100%, es que primero estoy convirtiendo un color hexagonal a un RGB, luego el RGB a un HSL. ¿Sería este problema debido a los colores seguros web o puede ver cualquier otra cosa que pueda causar esto en la función? ¿O es así como es?

actualización 1

Probando otras imágenes, parece ser en su mayoría 'colores beige' (aprox.) Los colores que están ligeramente fuera de la saturación. Usando un selector de color, si muevo la barra de saturación a donde debería estar allí, no hay una gran diferencia, así que tal vez mi función de búsqueda no se recupere demasiado. Sin embargo, sería bueno resolverlo, antes de lo ejecuto en 500,000 fotos.

la solución

Gracias a omnipotententity , a continuación, notó que faltaba pieza a mi función. Cambié:

$S = $delta / $max;

a:

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

y ahora produce resultados 100% correctos.

nota amigable

Si a cualquiera le gustaría que el código produzca esta tabla de colores, solo pregunte.

¿Fue útil?

Solución

Parece que le falta una pieza del cálculo de la saturación si su luma es> .5 como se muestra aquí en este código HSL de JavaScript .

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top