OpenCVで使われるimshowとは?定義から実用例をわかりやすく解説!?
今回はOpenCVで使われるimshowに関して、定義から実用例をわかりやすく解説致します。なんとなくimshowを使っていた、OpenCV初学者の方はおすすめです。ぜひ最後までご覧ください。
執筆者 - おすすめの記事3選
OpenCVで使われるimshowとは?
OpenCVで使われるimshowとは、多次元配列(numpy.ndarray)情報を元に、ウィンドウへ画像を表示するものを意味します。
なぜ多次元配列(numpy.ndarray)からウィンドウへ画像を表示するの?
それでは、なぜ多次元配列(numpy.ndarray)からウィンドウへ画像を表示するのでしょう?
多次元配列からウィンドウへ画像を表示する理由としては、
- カラー画像など、精度が求められる画像に対して、極め細かな画像を表示するため。
- OpenCV内に含まれる、関数の処理を容易にするため。
- 画像の加工や表示などの演算処理を、高速化するため。
が挙げられます。
確かに画像の加工や表示などの結果が遅いと、実運用を考える場合に、悩みの種になりそうなので、高速化は必要ですね。
OpenCVで使われるimshow関数の定義
imshow関数は、
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# imshow : ウィンドウへ画像を表示する関数
5# 第一引数 : ウィンドウ名(自由に命名ください)
6# 第二引数 : 多次元配列(画像情報)
7cv2.imshow('xxx', 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# imshow : ウィンドウへ画像を表示する関数
15# 第一引数 : ウィンドウ名(自由に命名ください)
16# 第二引数 : 多次元配列(画像情報)
17# <第二引数の例>
18# [
19# [
20# [234 237 228]
21# ...
22# [202 209 194]
23# ]
24# [
25# [10 27 16]
26# ...
27# [36 67 46]
28# ]
29# [
30# [34 51 40]
31# ...
32# [50 81 60]
33# ]
34# ]
35# imshowに関する公式ドキュメント : https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563
36cv2.imshow('image', img)
37
38# waitkey : 画像を表示するウィンドウからの、キーボード入力を待ち受ける関数
39# waitkeyについて : https://kuroro.blog/python/8DIolh7Pwggq2pvabysn/
40
41# 第一引数 : 画像を表示するウィンドウからの、キーボード入力を待ち受ける時間。ミリ秒単位指定。int型。
42# (例) 1000を指定すると、1秒間キーボード入力を待ち受ける。2000を指定すると、2秒間キーボード入力を待ち受ける。
43# ミリ秒とは? : https://e-words.jp/w/%E3%83%9F%E3%83%AA%E7%A7%92.html#:~:text=%E3%83%9F%E3%83%AA%E7%A7%92%E3%81%A8%E3%81%AF%E3%80%81%E6%99%82%E9%96%93,1%E7%A7%92%E3%81%AB%E7%9B%B8%E5%BD%93%E3%81%99%E3%82%8B%E3%80%82
44# ※ 0以下の数字を指定すると、画像を表示するウィンドウからの、キーボード入力が発生しない限り、ウィンドウを表示し続けます。
45
46# 戻り値 : キーボード入力した文字を、10進数で表記するアスキーコードの値で返す。
47# 10進数とは? : https://wa3.i-3-i.info/word1608.html
48# アスキーコードとは? : https://wa3.i-3-i.info/word15290.html
49# アスキーコード表 : https://www.k-cube.co.jp/wakaba/server/ascii_code.html
50k = cv2.waitKey(0)
51
52# キーボードから's'の文字が入力された場合、画像を保存する。
53# ord : 文字をアスキーコードの値へ変換する。
54if k == ord('s'):
55 # imwrite : 画像の保存を行う関数
56 # 第一引数 : 保存先の画像ファイル名
57 # 第二引数 : 多次元配列(numpy.ndarray)
58 # <第二引数の例>
59 # [
60 # [
61 # [234 237 228]
62 # ...
63 # [202 209 194]
64 # ]
65 # [
66 # [10 27 16]
67 # ...
68 # [36 67 46]
69 # ]
70 # [
71 # [34 51 40]
72 # ...
73 # [50 81 60]
74 # ]
75 # ]
76 # imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
77 cv2.imwrite('output.jpg', img)
78
79# destroyAllWindows : 全てのウィンドウを閉じる関数
80# destroyAllWindowsに関する公式ドキュメント : https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga6b7fc1c1a8960438156912027b38f481
81# もしくは、cv2.destroyAllWindow('image')。imageはウィンドウ名。
82# destroyAllWindow : 指定するウィンドウ名に紐づく、ウィンドウを閉じる関数
83# destroyAllWindowに関する公式ドキュメント : https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga851ccdd6961022d1d5b4c4f255dbab34
84cv2.destroyAllWindows()
以下の画像のように、ウィンドウへ画像を表示します。
多次元配列情報からどのように画像が表示されているのか、イメージ画像
imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
waitkeyに関しては、OpenCVで使われるwaitkeyとは?定義から実用例をわかりやすく解説!?でまとめていますので、詳しく知りたい方は是非ご確認ください。
Matplotlibを利用してウィンドウへ画像を表示してみる
最後にMatplotlibを利用して、ウィンドウへ画像を表示する方法をお伝えいたします。
Matplotlibとは、データを可視化するために利用するライブラリを意味します。
以下のようなコードを作成して、Python環境で実行ください。
1import cv2
2import sys
3from matplotlib import pyplot as plt
4
5# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
6# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
7# 第一引数 : 画像のファイルパス
8# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
9img = cv2.imread('./xxx.xxx')
10
11# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
12if img is None:
13 sys.exit("Could not read the image.")
14
15# cvtColor : 画像の色空間(色)の変更を行う関数。
16# cvtColorについて : https://kuroro.blog/python/7IFCPLA4DzV8nUTchKsb/
17# cvtColorを使う理由 ###########################################
18# OpenCVで読み込んだ画像(imread関数)は、BGR(Blue, Green, Red)形式で読み込まれます。
19# しかしMatplotlibでは、画像をRGB(Red, Green, Blue)形式で表示します。
20# RGB(Red, Green, Blue)とは? : https://ja.wikipedia.org/wiki/RGB
21# 色の形式を合わせるため、cvtColor関数を利用し、画像をBGR(Blue, Green, Red)形式からRGB(Red, Green, Blue)形式へ変更します。
22#############################################################
23# 第一引数 : 多次元配列(numpy.ndarray)
24# 第二引数 : 変更前の画像の色空間(色)と、変更後の画像の色空間(色)を示す定数を設定。
25# cv2.COLOR_BGR2RGB : 画像をBGR(Blue, Green, Red)形式からRGB(Red, Green, Blue)形式へ変更します。
26# cvtColorに関する公式ドキュメント : https://docs.opencv.org/master/d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab
27img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
28
29# imshow : ウィンドウへ画像を表示するための準備を行う関数
30# imshowに関する公式ドキュメント : https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html
31plt.imshow(img)
32
33# show : ウィンドウを表示する。
34# showに関する公式ドキュメント : https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.show.html#matplotlib.pyplot.show
35plt.show()
実行すると以下の画像のように、ウィンドウへ画像を表示できます。
cvtColor関数を利用しない場合の画像
ModuleNotFoundError: No module named 'matplotlib'のエラーが出た場合 : pipでライブラリを管理している方は、
pip install matplotlib
を実行ください。
cvtColorに関しては、OpenCVで使われるcvtcolorとは?cvtcolorの活用例を徹底紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。
まとめ
- OpenCVで使われるimshowとは、多次元配列(numpy.ndarray)情報を元に、ウィンドウへ画像を表示するものを意味する。
- ウィンドウを表示し続けるためにwaitkey関数を利用する。
- ウィンドウの削除の際は、destroyAllWindows or destroyAllWindow関数を利用する。
参考文献
- OpenCVで使われるimshow関数に関するサンプルコード
- 多次元配列とは?
- ウィンドウとは?
- imshowに関する公式ドキュメント
- ミリ秒とは?
- アスキーコードとは?
- 10進数とは?
- waitKeyに関する公式ドキュメント
- destroyAllWindowsに関する公式ドキュメント
- destroyAllWindowに関する公式ドキュメント
- Matplotlibの公式ドキュメント
- ライブラリとは?
- RGB(Red, Green, Blue)とは?
- cvtColorに関する公式ドキュメント