6

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% うまくいかないのかについて私が持っている 1 つの手がかりは、最初に HEX カラーを RGB に変換し、次に RGB を HSL に変換していることです。これは Web セーフ カラーによる問題でしょうか、それとも関数でこれを引き起こす可能性のある他の何かを見つけることができますか? それとも、これはそのままですか?

更新 1

他の画像を試してみると、彩度がわずかに高い「ベージュ」(およそ)の色がほとんどのように見えます。カラーピッカーを使用して、彩度バーを本来あるべき場所に移動しても大きな違いはないため、検索機能がこれをあまり検出しない可能性があります. 500,000枚の写真で実行するに、それを解決できればいいのですが。

修正

以下のOmnipotentEntityのおかげで、彼は私が関数に欠落していることに気付きました。私が変更され:

$S = $delta / $max;

に:

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

100% 正しい結果が得られるようになりました。

フレンドリーノート

コードでこのカラー テーブルを作成したい場合は、お問い合わせください。

4

1 に答える 1

2

この JavaScript HSL コード に示されているように、輝度が > .5 の場合、彩度の計算の一部が欠けているようです。

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
于 2012-07-25T23:37:44.870 に答える