OpenCV で色空間を変換するとき cvtColor
メソッドを使用する。OpenCV では、RBG 色空間、HSV 色空間や L*a*b* 色空間などを多様な色空間をサポートしている。cvtColor
メソッドを使うことで、これらの色空間の交互変換を行うことができる。cvtColor
の 1 つ目の引数には変換前の画像オブジェクト、2 つ目の引数には変換するための変数を与える。例えば、BGR 色空間から HSV 色空間へ変換する場合は COLOR_BGR2HSV
変数を利用する。
ただし、OpenCV では imread
メソッドを読み取るとき、RGB 色空間ではなく、デフォルトで BGR 色空間で読み込まれる。そのため、COLOR_BGR2HSV
などの BGR 色空間から他の色空間に変換する変数を使って、色変換を行う。
import cv2
img_BGR = cv2.imread("./data/chirsuta.jpg")
# gray scale
img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
# HSV
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
img_HSV_H, img_HSV_S, img_HSV_V = cv2.split(img_HSV)
cv2.imwrite('opencv.output.chirsuta.HSV_H.jpg', img_HSV_H)
cv2.imwrite('opencv.output.chirsuta.HSV_S.jpg', img_HSV_S)
cv2.imwrite('opencv.output.chirsuta.HSV_V.jpg', img_HSV_V)
# HLS
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
img_HLS_H, img_HLS_L, img_HLS_S = cv2.split(img_HLS)
cv2.imwrite('opencv.output.chirsuta.HLS_H.jpg', img_HLS_H)
cv2.imwrite('opencv.output.chirsuta.HLS_L.jpg', img_HLS_L)
cv2.imwrite('opencv.output.chirsuta.HLS_S.jpg', img_HLS_S)
# L*a*b*
img_Lab = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2Lab)
img_Lab_L, img_Lab_a, img_Lab_b = cv2.split(img_Lab)
cv2.imwrite('opencv.output.chirsuta.Lab_L.jpg', img_Lab_L)
cv2.imwrite('opencv.output.chirsuta.Lab_a.jpg', img_Lab_a)
cv2.imwrite('opencv.output.chirsuta.Lab_b.jpg', img_Lab_b)
HSV 色空間
RGB 色空間の画像を、HSV 色空間へ変換したあとに、H、S、V それぞれのチャンネルを書き出すと、次のようになる。H チャンネルを見ると、赤色の植物領域が確認しやすく、緑色の植物領域がやや確認しづらい。ただ、両方とも赤色領域と緑色領域の色が均一であるので、H に閾値を設けると、コンピューターで赤色と緑色の植物を検出できる可能性がある。また、V のチャンネルでは、植物領域や石などのオブジェクトの輪郭がはっきりして、ヒトの目ではオブジェクトを区別できるが、コンピュータで V の値に閾値を設けて、オブジェクトの識別するのはやや困難と考えらる。
オリジナル画像 | |
H | |
S | |
V |
L*a*b* 色空間
RGB 色空間の画像を、L*a*b* 色空間へ変換したあとに、L*、a*、b* それぞれのチャンネルを書き出すと、次のようになる。L* チャンネルは、写真の明るさをそのまま表している。L* の値に閾値を設けて、コンピューターに植物領域を識別させることは困難であるが、ヒトが目で見て、植物個体や石などのオブジェクトをはっきり区別できる。a* の値を見ると、緑色の植物領域が濃く見えて、赤色の植物領域が薄く見える。このように L*a*b* 色空間における a* の値は、緑色と赤色を識別するのに非常に有効である。また、b* のチャンネルとでは、植物や石などを区別することができない。これは b* は、黄色と青色を調整しているため、この写真上ではそのような要素が少ないから、はっきりした特徴が見られていないからである。
オリジナル画像 | |
L* | |
a* | |
b* |