RGBからHSL関数の彩度計算が正しくありません
-
11-12-2019 - |
質問
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つの手がかりは、最初に16進数の色をRGBに変換し、次にRGBをHSLに変換していることです。これはwebセーフな色のために問題になるのでしょうか、それとも関数でこれを引き起こす可能性のある他の何かを見つけることができますか?またはこれはちょうどそれがいかにあるかであるか。
更新1
他の画像を試してみると、ほとんどが「ベージュ」のようです(約100%)。)彩度にわずかに出ている色。カラーピッカーを使用して、彩度バーを本来あるべき場所に移動しても大きな違いはないので、検索機能がこれをあまり取り上げないかもしれません。しかし、それを解決するのはいいでしょう, 前に 私は500,000枚の写真でそれを実行します。
を修正しました。
おかげで 全能性, 、以下、彼は私が私の機能に欠けていることに気づきました。私は変わった:
$S = $delta / $max;
に:
$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);
そして今、100%正しい結果を生成します。
フレンドリーノート
誰かがこのカラーテーブルを生成するコードを希望する場合は、尋ねてください。
解決
輝度が>の場合、彩度の計算の一部が欠落しているようです。5 このJavaScript HSLコードに示されているように.
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;