KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるcvtcolorとは?cvtcolorの活用例を徹底紹介

OpenCVで使われるcvtcolorとは?cvtcolorの活用例を徹底紹介

今回はOpenCVで使われるcvtcolorに関して、活用例をいくつかご紹介いたします。cvtcolorってなに?、最近OpenCVを使い始めた方へおすすめです。ぜひ最後までご一読ください。

目次
  1. OpenCVで使われるcvtcolorとは?
    1. なぜ多次元配列(numpy.ndarray)から画像の色空間(色)を変更するの?
  2. OpenCVで使われるcvtcolor関数の定義
  3. その他の色空間(色)に変更してみる
    1. BGR(Blue, Green, Red)形式 ⏩ YCrCb形式
    2. BGR(Blue, Green, Red)形式 ⏩ HSV形式
    3. BGR(Blue, Green, Red)形式 ⏩ XYZ形式
  4. まとめ
  5. 参考文献
目次を開く⬇︎

OpenCVで使われるcvtcolorとは?

OpenCVで使われるcvtcolorとは、多次元配列(numpy.ndarray)情報を元に、画像の色空間(色)を変更するものを意味します。

例えばRGB(Red, Green, Blue)形式で構成される画像の色空間(色)を、BGR(Blue, Green, Red)形式やYCrCb形式などに変更するものと考えると良いでしょう。

利用する画像によって、色空間(色)の形式が違うため、色空間(色)を変更するための関数 = cvtcolorが用意されます。

なぜ多次元配列(numpy.ndarray)から画像の色空間(色)を変更するの?

それでは、なぜ多次元配列(numpy.ndarray)から画像の色空間(色)を変更するのでしょう?

多次元配列(numpy.ndarray)から画像の色空間(色)を変更する理由としては、

  • カラー画像など、精度が求められる画像に対して、極め細かく画像変更するため。
  • OpenCV内に含まれる、関数の処理を容易にするため。
  • 画像の色空間(色)の変更などの演算処理を、高速化するため。

が挙げられます。

確かに画像の色空間(色)の変更などの結果が遅いと、実運用を考える場合に、悩みの種になりそうなので、高速化は必要ですね。

OpenCVで使われるcvtcolor関数の定義

cvtcolor関数は、

1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# 第一引数 : 多次元配列(numpy.ndarray)
5# 第二引数 : 変更前の画像の色空間(色)と、変更後の画像の色空間(色)を示す定数を設定。
6# 第二引数で設定できる定数に関しては、公式ドキュメントを参照 : https://docs.opencv.org/3.4.0/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0
7# 戻り値 : 多次元配列(numpy.ndarray)
8cv2.cvtcolor(img, 定数)

で定義されます。

例えば以下のようなコードを作成すると、

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# cvtColor : 画像の色空間(色)の変更を行う関数。
15# 第一引数 : 多次元配列(numpy.ndarray)
16# 第二引数 : 変更前の画像の色空間(色)と、変更後の画像の色空間(色)を示す定数を設定。
17# 第二引数で設定できる定数に関しては、公式ドキュメントを参照 : https://docs.opencv.org/3.4.0/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0
18# ※ imread関数から返される色空間(色)の形式は、BGR(Blue, Green, Red)形式であることに注意する。
19# cv2.COLOR_BGR2GRAY : BGR(Blue, Green, Red)形式の色空間(色)を持つ画像をグレースケールする。
20# グレースケールとは? : https://www.shinkohsha.co.jp/blog/monochrome-shirokuro-grayscale/
21# 戻り値 : 多次元配列(numpy.ndarray)
22img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
23
24# imwrite : 画像の保存を行う関数
25# 第一引数 : 保存先の画像ファイル名
26# 第二引数 : 多次元配列(numpy.ndarray)
27# <第二引数の例>
28# [
29# [
30# [234 237 228]
31# ...
32# [202 209 194]
33# ]
34# [
35# [10 27 16]
36# ...
37# [36 67 46]
38# ]
39# [
40# [34 51 40]
41# ...
42# [50 81 60]
43# ]
44# ]
45# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
46cv2.imwrite('output.jpg', img)

以下の画像のように画像を描画します。

色空間(色)を変更する前の元画像

cvtcolor関数を利用して、色空間(色)を変更した場合の画像

多次元配列情報からどのように画像が作られているのか、イメージ画像

imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

その他の色空間(色)に変更してみる

最後に様々な色空間(色)へ変更してみました。

コードとともに実行結果を記載していますので、好みの色空間(色)を探してみてください。

BGR(Blue, Green, Red)形式 ⏩ YCrCb形式

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# cvtColor : 画像の色空間(色)の変更を行う関数。
15# 第一引数 : 多次元配列(numpy.ndarray)
16# 第二引数 : 変更前の画像の色空間(色)と、変更後の画像の色空間(色)を示す定数を設定。
17# 第二引数で設定できる定数に関しては、公式ドキュメントを参照 : https://docs.opencv.org/3.4.0/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0
18# ※ imread関数から返される色空間(色)の形式は、BGR(Blue, Green, Red)形式であることに注意する。
19# cv2.COLOR_BGR2YCrCb : BGR(Blue, Green, Red)形式の色空間(色)を持つ画像をYCrCb形式に変更する。
20# YCrCb形式とは? : https://www.wdic.org/w/WDIC/YCbCr
21# 戻り値 : 多次元配列(numpy.ndarray)
22img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
23
24# imwrite : 画像の保存を行う関数
25# 第一引数 : 保存先の画像ファイル名
26# 第二引数 : 多次元配列(numpy.ndarray)
27# <第二引数の例>
28# [
29# [
30# [234 237 228]
31# ...
32# [202 209 194]
33# ]
34# [
35# [10 27 16]
36# ...
37# [36 67 46]
38# ]
39# [
40# [34 51 40]
41# ...
42# [50 81 60]
43# ]
44# ]
45# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
46cv2.imwrite('output.jpg', img)

色空間(色)を変更する前の元画像

cvtcolor関数を利用して、色空間(色)を変更した場合の画像

BGR(Blue, Green, Red)形式 ⏩ HSV形式

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# cvtColor : 画像の色空間(色)の変更を行う関数。
15# 第一引数 : 多次元配列(numpy.ndarray)
16# 第二引数 : 変更前の画像の色空間(色)と、変更後の画像の色空間(色)を示す定数を設定。
17# 第二引数で設定できる定数に関しては、公式ドキュメントを参照 : https://docs.opencv.org/3.4.0/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0
18# ※ imread関数から返される色空間(色)の形式は、BGR(Blue, Green, Red)形式であることに注意する。
19# cv2.COLOR_BGR2HSV : BGR(Blue, Green, Red)形式の色空間(色)を持つ画像をHSV形式に変更する。
20# HSV形式とは? : https://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
21# 戻り値 : 多次元配列(numpy.ndarray)
22img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
23
24# imwrite : 画像の保存を行う関数
25# 第一引数 : 保存先の画像ファイル名
26# 第二引数 : 多次元配列(numpy.ndarray)
27# <第二引数の例>
28# [
29# [
30# [234 237 228]
31# ...
32# [202 209 194]
33# ]
34# [
35# [10 27 16]
36# ...
37# [36 67 46]
38# ]
39# [
40# [34 51 40]
41# ...
42# [50 81 60]
43# ]
44# ]
45# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
46cv2.imwrite('output.jpg', img)

色空間(色)を変更する前の元画像

cvtcolor関数を利用して、色空間(色)を変更した場合の画像

BGR(Blue, Green, Red)形式 ⏩ XYZ形式

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# cvtColor : 画像の色空間(色)の変更を行う関数。
15# 第一引数 : 多次元配列(numpy.ndarray)
16# 第二引数 : 変更前の画像の色空間(色)と、変更後の画像の色空間(色)を示す定数を設定。
17# 第二引数で設定できる定数に関しては、公式ドキュメントを参照 : https://docs.opencv.org/3.4.0/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0
18# ※ imread関数から返される色空間(色)の形式は、BGR(Blue, Green, Red)形式であることに注意する。
19# cv2.COLOR_BGR2XYZ : BGR(Blue, Green, Red)形式の色空間(色)を持つ画像をXYZ形式へ変更する。
20# XYZ形式とは? : https://www.dic-color.com/knowledge/xyz.html
21# 戻り値 : 多次元配列(numpy.ndarray)
22img = cv2.cvtColor(img, cv2.COLOR_BGR2XYZ)
23
24# imwrite : 画像の保存を行う関数
25# 第一引数 : 保存先の画像ファイル名
26# 第二引数 : 多次元配列(numpy.ndarray)
27# <第二引数の例>
28# [
29# [
30# [234 237 228]
31# ...
32# [202 209 194]
33# ]
34# [
35# [10 27 16]
36# ...
37# [36 67 46]
38# ]
39# [
40# [34 51 40]
41# ...
42# [50 81 60]
43# ]
44# ]
45# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
46cv2.imwrite('output.jpg', img)

色空間(色)を変更する前の元画像

cvtcolor関数を利用して、色空間(色)を変更した場合の画像

まとめ

  • OpenCVで使われるcvtcolorとは、多次元配列(numpy.ndarray)情報を元に、画像の色空間(色)を変更するものを意味する。
  • 画像の色空間(色)の変更などの演算処理を、高速化するために、多次元配列を利用する。

参考文献