KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるimshowとは?定義から実用例をわかりやすく解説!?

OpenCVで使われるimshowとは?定義から実用例をわかりやすく解説!?

今回はOpenCVで使われるimshowに関して、定義から実用例をわかりやすく解説致します。なんとなくimshowを使っていた、OpenCV初学者の方はおすすめです。ぜひ最後までご覧ください。

目次
  1. OpenCVで使われるimshowとは?
    1. なぜ多次元配列(numpy.ndarray)からウィンドウへ画像を表示するの?
  2. OpenCVで使われるimshow関数の定義
  3. Matplotlibを利用してウィンドウへ画像を表示してみる
  4. まとめ
  5. 参考文献

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関数を利用する。

参考文献