つれづれなる備忘録

日々の発見をあるがままに綴る

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

"元の画像(桃)"
元の画像(桃)

origcvtColor()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()cmapgrayにすればcvtColor()の出力をそのまま利用することができる。

from matplotlib import pyplot as plt
plt.imshow(gray,cmap = "gray")

"グレーへの変換"
グレーへの変換

次にBGRからHSVへ変換して、彩度を+10だけ"げた"をはかせた画像を表示するには、matplotでHSV画像をそのまま扱えないので一度HSVからRGBに戻して表示する。彩度を変更したhsvcvtColor(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)

"HSVへの変換"
HSVへの変換

4. まとめ

 今回はOpenCVを用いた色空間の変換と画像処理の方法について紹介した。