【Python】OpenCV色空間の変換

色空間というワードをご存知でしょうか。

色空間は、画像処理を扱う上で必要となる色の表現方法になります。

知ったかぶりで書いていますが私も知ったのは最近です笑

OpenCV での画像加工にこの色空間の知識が必要となるため、OpenCV での活用と合わせ色空間について紹介します。

目次

色空間とは

色空間とはそもそもなんでしょうか。

普通に生活していたら「色に空間がある?」ってなってしまいます 。

色空間とは、画像における色を表す方法のことをいいます。

有名なものでは、RGB(R:赤 G:緑 B:青)がありますね。

これは3色の色でバランスをとることで色を表現する方法になります。

ここで抑えておくべきは、RGB以外にも色を表現する方法はたくさんあるということです。

OpecnCVでは、BGR・HSV・GRAY等をよく利用します。

ちなみに、HSVとは「色相(Hue)」「彩度(Saturation)」「明度(Value)」の3つの組み合わせで色を表現する方法で、こちらも利用する機会が多いので理解しておくほうが望ましいです。

おそらくすべての色空間(表現方法)を把握することは不可能です。

そのため、必要最低限のもののみ把握し、あとはそんなのもあるんだ程度でとどめておくことをおすすめします。

あくまでも、OpenCVで行いたいのは色空間の変更、画像の加工ですからね。

OpenCVにおける色空間の変換

OpenCVで色空間の変更を行う方法は非常に簡単です。

「色空間はたくさん有るんだな」「変換とは表現方法を変えているんだな」という2点さえ知っていれば混乱することは無いと思います。

さて、OpenCVでの色空間ですが、cv2.cvtColor()と記述することで変換を行うことができます。

第一引数に対象の画像、第二引数に変換方法を指定してあげます。

例えば、下記のようなイメージです。

import cv2

# 画像を読み込み
# cv2.imread() を利用した場合、読み込みは BGR となる
img = cv2.imread("coffee.png")

# BGR から(to) HSV への変換
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

コード内にも記載しましたが、cv2.imread() を利用した場合、RGB ではなく読み込みは BGR でされるという点に注意してください。

また、第二引数に指定する変換方法の法則として、2 → トゥー → to と読み替えて上げることで、左側から右側の色空間へ変換を行っていると読むことができます。

ちなみにですが、OpenCVでは150種類以上の色空間の変換を用意してるそうです。

気になる方は、下記のコードを実行して確かめてみてください。

import cv2

flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)

試してみる

せっかくなので、変換を試して見ましょう。

画像は、こちらからお借りしたカラフルな画像で行おうと思います。

今回は、BGRで読み込んだ画像を ①HSV ②グレースケール化 ③YCrCb(遊び)に変換し表示してみたいと思います。

ではやってみましょう。

まず、①のコード。

import cv2

def imgShow(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像を読み込み
# cv2.imread() を利用した場合、読み込みは BGR となる
img = cv2.imread("color.png")

# BGR から(to) HSV への変換
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

imgShow("hsv", hsv)

つぎ、②のコード。

import cv2

def imgShow(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像を読み込み
# cv2.imread() を利用した場合、読み込みは BGR となる
img = cv2.imread("color.png")

# BGR から(to) GRAY への変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

imgShow("gray", gray)

さいご、③のコード。

import cv2

def imgShow(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像を読み込み
# cv2.imread() を利用した場合、読み込みは BGR となる
img = cv2.imread("color.png")

# BGR から(to) YCrCb への変換
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

imgShow("ycrcb", ycrcb)

なんかきれいですね。。

いくつか試してみましたが、どうでしょうか。

色が変わってしまうことに驚いた方もいるかも知れませんが、表現方法を変えると色もかわってしまうと覚えておいてください。

最後に

OpenCV で色空間を扱ってみました。色空間なかなか理解するの難しいですよね。OpenCVでのコードは簡易的に書けるため処理を行う際は参考にしてみてください。

最後までお読みいただきありがとうございました。

では。

目次