画像の表示【OpenCV】

OpenCVでは簡易的なGUI表示用のAPIが用意されており、それを使って読み込んだ画像を表示させることができます。

開発環境

  • OpenCV 4.2.0
  • Python 3.7.9

Pythonで画像を表示する方法

Pythonで画像を扱うライブラリとしてはOpenCVやmatplotlib、Pillowなどがありますが、いずれもピクセルデータをnumpy.ndarrayで扱います。ndarrayで読み込んだデータを画像として表示する方法も各種ライブラリで用意されていますが、データそのものはnumpy.ndarrayなので、「matplotlibで読み込んだ画像をOpenCVで表示させる」などということも問題なくできます。ただし、各ライブラリによって色チャネルの順番が違ったりなど微妙な差異があるので、注意が必要です。

ここでは、OpenCVを用いて画像を表示する方法について説明していきます。OpenCVを用いて画像を表示させる方法は少し癖があり、アプリに組み込んで一般向けの機能として考えるのは難しいですが、デバッグや解析中の画像の確認の用途に適しています。簡単なコーディングで新規のウィンドウがポップアップして画像を表示させることができます。

なお、他のライブラリについては以下をご覧ください。

OpenCVを用いた画像の表示

基本的な表示方法

OpenCVで画像を表示させるときはimshow関数を用います。第1引数にウィンドウ名を、第2引数にndarrayで画像データを指定します。ただし、これだけではウィンドウが表示されても画像は一瞬で閉じてしまいます。ウィンドウ自体は残っているので、次のように黒いウィンドウだけが表示されるようになります。

import cv2
img = cv2.imread(r'C:\BioTech-Lab\lena.jpg')
cv2.imshow('img',img)

input('Enterを押してください。')

画像を表示させるためにはwaitKey関数を加えて、キーボード入力があるまではそのまま待つようにしましょう。waitKey関数は引数に指定した時間だけキーボードを待ちますが、引数を0とするとキーボード入力を無限に待ち続けるようになります。「何か入力するまではずっと画像を表示させておく」というような場合には引数に0を指定しましょう。最後に画像の確認が終わったらウィンドウを消す必要があるので、destroyAllWindows関数でウィンドウをすべて閉じます。

import cv2
img = cv2.imread(r'C:\BioTech-Lab\lena.jpg')
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

これで画像を表示できました。このようにOpenCVでimshow関数を使う場合はwaitKey関数とdestroyAllWindows関数がセットになります。

なお、このウィンドウを消す場合は任意のキーを押してwaitKey関数を呼び出す必要があります。この時、ウィンドウの右上の「×」を押してしまうと、それ以降の処理に進めなくなってしまうので注意が必要です。

ウィンドウのサイズを変更できるようにする

先ほど画像を表示したウィンドはサイズを変更することができません。そこで、namedWindow関数を用いて、サイズの変更が可能な新たなウィンドウをあらかじめ作成しておいて、そのウィンドウで画像を表示させるという方法をとります。namedWindow関数は第1引数にウィンドウ名を指定し、第2引数にウィンドウの動作を示すフラグを指定します。cv2.WINDOW_NORMALと指定すればウィンドウのサイズを変更可能になります。最後に、ここで作成したウィンドウと同じ名前をimshow関数で指定すれば、そのウィンドウで画像を表示させることができます。

import cv2
img = cv2.imread(r'C:\BioTech-Lab\lena.jpg')
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像を表示する関数を1行で呼び出す

上記のようにしてプレビュー用の画像を表示させることができますが、単に確認用の画像を表示させるだけで3-4行の処理が必要になるのは若干煩雑でもあります。そのような場合は、以下のプレビュー用の関数(impreview)を作ってしまって、それを使えば簡単に呼び出すことができます。

def impreview(img, windowName='Preview'):
    cv2.namedWindow(windowName, cv2.WINDOW_NORMAL)
    cv2.imshow(windowName, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

この関数を使って、先ほどの画像を表示させてみましょう。

import cv2

def impreview(img, windowName='Preview'):
    cv2.namedWindow(windowName, cv2.WINDOW_NORMAL)
    cv2.imshow(windowName, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread(r'C:\BioTech-Lab\lena.jpg')
impreview(img)

何度も画像の表示を繰り返すような場合は、1度関数として定義してしまえば簡単に呼び出すことがでるので、ご活用ください。

関連記事・スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)