title |
emoji |
type |
topics |
published |
RGBとHSVの相互変換を手計算でする必要があったときのメモ |
👻 |
tech |
|
true |
この記事は、過去に友人から「試験対策のために RGB と HSV の計算方法を教えて」と言われて作成した資料がもとになっています。当初は適当な Web サイトの URL を送り付けてやり過ごそうかと思っていたのですが、スケールが授業と違っていたり、計算方法がわかりにくかったりなど、あまりピンと来るサイトを見つけられなかったので自分で書きました。しかし、試験ではこの問題が出なかったのでショックでした(ToT)
こんなありきたりな内容の記事を公開するかどうか悩みましたが、過去の自分や友人と同じように、どこかの高専・大学生の役に立ったらいいなという思いで公開することにしました。
資料によって範囲が異なるが、今回はこの範囲を使用する^[範囲が違う場合はどちらかにスケーリングすれば同じ]。
-
$H$ が 0-100
-
$S,V$ が 0-100 や 0-255
$MAX = \text{RGB 中の最大値}$
$MIN = \text{RGB 中の最小値}$
計算結果がマイナス値だったら、360 を加算する。
-
$R$ が $MAX$ のとき
$$
H = \frac{G - B}{MAX - MIN} \times 60
$$
-
$G$ が $MAX$ のとき
$$
H = \frac{B - R}{MAX - MIN} \times 60 + 120
$$
-
$B$ が $MAX$ のとき
$$
H = \frac{R - G}{MAX - MIN} \times 60 + 240
$$
-
$R=G=B$ のとき
$$
H = 0
$$
$$
S = \frac{MAX - MIN}{MAX}
$$
$$
V = \frac{MAX}{255}
$$
$$
\begin{align*}
MAX &= V \times 255\\
MIN &= MAX \times (1 - S)
\end{align*}
$$
$$
\begin{align*}
R &= MAX\\
G &= (H \div 60) \times (MAX - MIN) + MIN\\
B &= MIN
\end{align*}
$$
$$
\begin{align*}
R &= ((120 - H) \div 60) \times (MAX - MIN) + MIN\\
G &= MAX\\
B &= MIN
\end{align*}
$$
$$
\begin{align*}
R &= MIN\\
G &= MAX\\
B &= ((H - 120) \div 60) \times (MAX - MIN) + MIN
\end{align*}
$$
$$
\begin{align*}
R &= MIN\\
G &= ((240 - H) \div 60) \times (MAX - MIN) + MIN\\
B &= MAX
\end{align*}
$$
$$
\begin{align*}
R &= ((H - 240) \div 60) \times (MAX - MIN) + MIN\\
G &= MIN\\
B &= MAX
\end{align*}
$$
$$
\begin{align*}
R &= MAX\\
G &= MIN\\
B &= ((360 - H) \div 60) \times (MAX - MIN) + MIN
\end{align*}
$$
$$
\begin{align*}
H &= \frac{50 - 100}{200 - 50} \times 60 + 120 = 100\\
S &= \frac{200 - 50}{200} = 0.75\\
V &= \frac{200}{255} = 0.7843137254901961... \simeq 0.78
\end{align*}
$$
$$
\begin{align*}
MAX &= 0.9 \times 255 = 229.5 \simeq 230\\
MIN &= 230 \times (1 - 0.5) = 115\\
\end{align*}
$$
$$
\begin{align*}
R &= MAX = 230\\
G &= (50 \div 60) \times (MAX - MIN) + MIN = 210.8333... \simeq 211\\
B &= MIN = 115
\end{align*}
$$