OpenCVの使い方4 ~ 色空間の変換
OpenCVの使用方法について、今回は色空間の変換について紹介したい。
1. 色空間
色空間は色を基本3色の座標で表示する座標空間で、最もよく用いられるのはRGB系で原色をR(赤、700nm)、G(緑、546.1nm)、B(青、435.8nm)とする。他にはXYZ系や色相(色)、明度、彩度を指標とするHSV系も知られている。OpenCVはRGBではなくBGR(RGBの順序が異なる)で処理されるが、cvtColor(src, flags)
のflags
を指定することによりBGRから様々な色空間へ変換することができる。
2. OpenCVで変換できる色空間
cvtColor(src, flags)
で色空間の変換を指定するflags
を調べるには
import cv2 import numpy as np flags = [i for i in dir(cv2) if i.startswith('COLOR_')] len(flags) >274
変換方法は274種類もあることがわかる。BGRから変換する以外もRGBから変換するなど変換の色空間の組み合わせが多数あるため274種類となっている。例えばBRGからどの色空間に変換できるかは以下のように調べる。 以下の方法は先頭BGRから始まる文字列を検索しているが、BGRAやBGR555を除外して先頭21列までがBGRからの色空間の変換名になっている。
flags = [i for i in dir(cv2) if i.startswith('COLOR_BGR')] flags[0:22] > ['COLOR_BGR2BGR555', 'COLOR_BGR2BGR565', 'COLOR_BGR2BGRA', 'COLOR_BGR2GRAY', 'COLOR_BGR2HLS', 'COLOR_BGR2HLS_FULL', 'COLOR_BGR2HSV', 'COLOR_BGR2HSV_FULL', 'COLOR_BGR2LAB', 'COLOR_BGR2LUV', 'COLOR_BGR2Lab', 'COLOR_BGR2Luv', 'COLOR_BGR2RGB', 'COLOR_BGR2RGBA', 'COLOR_BGR2XYZ', 'COLOR_BGR2YCR_CB', 'COLOR_BGR2YCrCb', 'COLOR_BGR2YUV', 'COLOR_BGR2YUV_I420', 'COLOR_BGR2YUV_IYUV', 'COLOR_BGR2YUV_YV12']
3. 色空間の変換例
OpenCVを用いた色空間の変換例について紹介する。画像は以下のコードを用いて読み込み、桃の画像を例に処理を実行する。OpenCVで読み込んだ画像の元データはorig
であり色空間はBGRになっている。
from google.colab import files uploaded_file = files.upload() orig = cv2.imread(uploaded_file_name) # BGR format
orig
をcvtColor()
でCOLOR_BGR2GRAY
により色空間をBGRからGRAYに変換する。
gray = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY) orig[250,300] >array([186, 175, 213], dtype=uint8) gray[250,300] >188
適当な画像の画素アドレスの画素情報を表示するとorig[250,300]
はGBRで(186, 175, 213)からgray[250,300]
は188というグレースケールの値に変換されていることがわかる。
同様にCOLOR_BGR2HSV
を用いるとBGRからHSVに変換することができ、(色相,明度,彩)=(171, 45, 213)へ変換されている。
hsv = cv2.cvtColor(orig, cv2.COLOR_BGR2HSV) hsv[250,300] >array([171, 45, 213], dtype=uint8)
3. 色空間の画像処理例
色空間の変換を利用した画像処理(表示)の例を以下に示す。GBRからGRAYへ変換した画像を表示するには、matplotを利用する場合はimshow()
のcmap
をgray
にすればcvtColor()
の出力をそのまま利用することができる。
from matplotlib import pyplot as plt plt.imshow(gray,cmap = "gray")
次にBGRからHSVへ変換して、彩度を+10だけ"げた"をはかせた画像を表示するには、matplotでHSV画像をそのまま扱えないので一度HSVからRGBに戻して表示する。彩度を変更したhsvをcvtColor(hsv, cv2.COLOR_HSV2RGB)
とすることでRGBに戻してmatplotのimshowで彩度を変更した画像を表示した。黒くなっているところは、単純に+10を加えたため、上限値を越えている部分になる。上限を設定して処理すれば、黒飛びの領域はなくせる。
hsv[:,:,2]=hsv[:,:,2]+10 hsv_rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB) plt.imshow(hsv_rgb)
4. まとめ
今回はOpenCVを用いた色空間の変換と画像処理の方法について紹介した。