OpenCVで使われるcvtcolorとは?cvtcolorの活用例を徹底紹介
今回はOpenCVで使われるcvtcolorに関して、活用例をいくつかご紹介いたします。cvtcolorってなに?、最近OpenCVを使い始めた方へおすすめです。ぜひ最後までご一読ください。
執筆者 - おすすめの記事2選
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)情報を元に、画像の色空間(色)を変更するものを意味する。
- 画像の色空間(色)の変更などの演算処理を、高速化するために、多次元配列を利用する。