
ゆうき( @BASEBALLY15 )です^^
画像内の『RGB』と『HSV』の値を知る方法ってないですかね?・・・
Pythonを使うと,簡単にそれらの値を知ることが出来ますよ^^
そうなんですか!?
その方法を教えて欲しいです・・・
任せてください!

目次
そもそも『RGB』と『HSV』って何?
RGBとは?
RGBとは,赤(Red),緑(Green),青(Blue)の3色を混ぜて,様々な色を表現することを言います.
RGBは,0から255までの階層で表現され,
- (R,G,B)=(255,0,0)→赤
- (R,G,B)=(0,255,0)→緑
- (R,G,B)=(0,0,255)→青
といったように,色を数値として表現することができます.
HSVとは?
HSVとは,色相(Hue),彩度(Saturation・Chroma),明度(Value・Brightness)の3つの成分から成る色空間のことを言います.
- 色相(H)→具体的な色を定義する要素.0°~360°で表現される.
- 彩度(S)→色の鮮やかさ・濃さを表す要素.0%~100%で表現される.
- 明度(V)→色の明るさ・暗さを表す要素.0%~100%で表現される.
といったように,色を定義するだけでなく,
どのような特徴を持った色なのか
ということまで,表現することができます.
それでは,『RGB』と『HSV』の値を取得する方法を見ていきましょう⤵
Pythonを使って『RGB』と『HSV』の値を知る方法とは!?
今回ご紹介する方法を使うと・・・
画像内の指定した範囲の『RGB』と『HSV』の値を取得すると同時に,その範囲を画像に表示してくれます.
以下がその結果です⤵
1枚目は値を入力する画面と出力結果で,
2枚目は指定した範囲を枠で囲った画像です.


それでは,コードを見ていきましょう⤵
ライブラリ
今回は,画像を扱うために,『OpenCV』と『matplotlib』を使います.
import cv2
import matplotlib.pyplot as plt
コード
画像の読み込みとサイズ変更をしてみよう!
まずは,『OpenCV』を使って,画像の読み込みとサイズの変更を行います.
また,OpenCVで読み込んだ画像は,BGRの順になっているので,RGBの順に変えます.
#画像の読み込み
img = cv2.imread("mov_hts-samp005_Moment.jpg")
#BGRからRGBに変換
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#画像のサイズを変更
img = cv2.resize(img, (640, 480))
入力画面を作ろう!
次に,値を入力する画面を作ります.
X_start = int(input("開始位置のX座標の値を入力してください>>"))
Y_start = int(input("開始位置のY座標の値を入力してください>>"))
X_end = int(input("終了位置のX座標の値を入力してください>>"))
Y_end = int(input("終了位置のY座標の値を入力してください>>"))
#指定した範囲(yの始まり:yの終わり,xの始まり:xの終わり)
img_box = img[Y_start:Y_end, X_start:X_end]
『input()』で実行画面から入力することが出来て,
『int()』と書くことで,数字を読み込むことが出来ます.
RGB値を取得してみよう!
それでは『RGB』の値を取得していきます.
#RGB値を取得
#flattenで値を一列に並べ,minで最小値を取得し,maxで最大値を取得する
r_min = img_box.T[0].flatten().min()
r_max = img_box.T[0].flatten().max()
g_min = img_box.T[1].flatten().min()
g_max = img_box.T[1].flatten().max()
b_min = img_box.T[2].flatten().min()
b_max = img_box.T[2].flatten().max()
#表示
print("R_min {:.2f} R_max {:.2f}".format(r_min, r_max))
print("G_min {:.2f} G_max {:.2f}".format(g_min, g_max))
print("B_min {:.2f} B_max {:.2f}".format(b_min, b_max))
『T』は『転置』を意味ていて,行と列を入れ替えます.
HSV値を取得してみよう!
次に,HSV値を取得する方法をご紹介します.
HSV値を取得するためには,まずRGBからHSVへ変更する必要があります.
変更するためには,以下のコードを1行書くだけで大丈夫です^^
#RGBからHSVに変換
img_box_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
そして,画像内の指定した範囲のHSV値を取得します.
#flattenで値を一列に並べ,minで最小値を取得し,maxで最大値を取得する
h_min = img_box_hsv.T[0].flatten().min()
h_max = img_box_hsv.T[0].flatten().max()
s_min = img_box_hsv.T[1].flatten().min()
s_max = img_box_hsv.T[1].flatten().max()
v_min = img_box_hsv.T[2].flatten().min()
v_max = img_box_hsv.T[2].flatten().max()
#表示
print("H_min {:.2f} H_max {:.2f}".format(h_min, h_max))
print("S_min {:.2f} S_max {:.2f}".format(s_min, s_max))
print("V_min {:.2f} V_max {:.2f}".format(v_min, v_max))
指定した範囲を枠で囲ってみよう!
指定した範囲を枠で囲む方法をご紹介します.
たった1行で完成します^^
#指定した範囲を枠で囲む
cv2.rectangle(img, (X_start,Y_start), (X_end,Y_end), (255,0,0), 2)
ちなみに,引数はこのようになっています⤵
- 第1引数:囲いたい画像
- 第2引数:枠の始まりの位置
- 第3引数:枠の終わりの位置
- 第4引数:枠の色(R,G,B)
- 第5引数:枠の太さ
最後に,画像を表示するためのコードを書いて完成です!
#描写
plt.imshow(img)
plt.show()
終わりに
今回は,Pythonを使って,『RGB』と『HSV』の値を取得する方法をご紹介しました.
今回の方法は,『マスク処理』などを行いたい時に使うので,ぜひ参考にしてみてください^^
それでは・・・