Skip to content

OpenCV色空間の変換

Posted in Python

Last updated on 2020年11月3日

どんな色が好き♫ 黄色〜

・・・。

こんにちは、今回は画像を扱う上でコアとなる色空間について書いてみます。

画像を扱う上でこの理解が無いとおそらく「???」となりかなりの時間を無駄にしてしまう可能性があります。

少なくとも私はそうでした。

すべて理解したわけではありませんので、ご了承を。

むっ、難しい。。


色空間とは

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

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

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

有名なものでは、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-Python Tutorials)

今回扱った内容が記載されたOpenCV-Python Tutorialsのページです。

英語を機械的に日本語に翻訳した感じで多少読みづらいかもしれませんが情報はまとまっています

チュートリアルであり情報が不足している部分もあるため、他の有志の方々のサイトを参考にしてみてください。

とはいえ、最初に読む分には程よい分量であるためおすすめです。


Pythonで始めるOpenCV入門

Pythonでの実装をベースにまとめられた貴重なOpenCVの入門書です。

内容についても、環境のセットアップから画像処理の基本(変換、平滑化、抽出 等)過不足なく一通りの操作が解説されており個人的にすごく勉強になりました。

Kindle Unlimitedで読むことができるのですが購入し、今回も参考にさせていただいてます。

もし、PythonでOpenCVのまとまったドキュメントを探している方は手にとっても損にはならないかと思います。

Be First to Comment

コメントを残す