見出し画像

[Ruby] RGB値を色の三属性に変換するメソッド 明度編

個人アプリ作成していて、RGB値、つまり色の三原色を、色の三属性に変換するメソッドを作成しました。

今回は明度を導くメソッドを紹介します。

色の三原色とは

色の三属性とは色相、明度、彩度を表します。

色相とはその色の"色味"を表します。

明度はその色の明るさを表します。色の反射率に関係していて、白は明度が高く、黒は明度が低くなります。

彩度はその色の鮮やかさを表しています。オレンジなどの派手な色は彩度が高く、白や黒のようなくすんだ色は彩度が低くなります。

明度の計算式

今回も以下の記事参考にしています。

明度の計算式は

明度V = Imax

となります。最大値のため簡単ですね。原色に近いほど明るいのですね。

Rubyメソッドで明度を求める

メソッドは以下となります。

def wear_brightness(red, green, blue)
  bright = ([red, green, blue].max / 255.to_f).round(2)
end

0~1の範囲で示したかったため、255で割っています。

Rubyだと整数÷整数で小数になってしまうと結果が0になるため、割る数を小数変換しています。

roundメソッドで小数点以下第二位までの数値としています。

補正を入れてみる

現在私はこのメソッドを用いて服の提案機能を作成しているのですが、このままだと青系のデニムなどが明るい服と捉えられてしまいます。

実際の数値としてはそうなのかもしれないのですが、服となると意外と落ち着いた印象かと思います。

ここらへんの人間の感性(個人差ですが)を考え、補正値を入れてみました。

def wear_brightness(red, green, blue)
   revision_rate = {r: 0.9, g: 0.8, b: 0.4}

   r_after_rev = red   * revision_rate[:r]
   g_after_rev = green * revision_rate[:g]
   b_after_rev = blue  * revision_rate[:b]

   bright = ([r_after_rev, g_after_rev, b_after_rev].max / 255).round(2)
end

青系にがっつり補正かけました笑

意外とちょうどいいです。

まとめ

次回は色相に関して紹介します。

私もまだまだ理解できていない部分なので勉強します。


この記事が気に入ったらサポートをしてみませんか?