はじめに
PythonでOpenCVを使った画像の表示方法について紹介します。
画像の表示
OpenCVを使っていると、画像を簡単に確認したい場面がよくあります。そこで、比較的簡単に画像を表示する方法について紹介します。この記事では2種類の方法について紹介したいと思います。1つ目はOpenCVで用意されているimshow
関数を使う方法。2つ目はmatplotlib
を利用する方法です。matplotlibはメジャーなデータの可視化ライブラリなので利用したことがあるかもしれませんが、画像の表示にも利用できます。また、matplotlibもimshowという関数で画像を表示することができます。
それぞれ以下の特徴があります。
関数 | 特徴 |
---|---|
OpenCV imshow関数 | ・OpenCVの機能として提供されていて、import cv2 によりすぐに利用可。・ウィンドウ1つに画像1つを表示。 |
matplotlib imshow関数 | ・matplotlibのインストールが必要で、import が必要。・ウィンドウ1つに複数の画像を表示可。 |
OpenCV imshow関数
cv2.imshow関数
書式は2つの引数が用意されていて、戻り値はありません。
引数
名称 | 説明 |
---|---|
winname(必須) | ウィンドウ名 |
mat(必須) | 表示する画像データ |
使い方
基本的な使い方は例は次の通りです。この例ではウィンドウ名を"Image-1"と指定しています。
cv2.imshow('Image-1', image)
このままでは表示されないので、以下の様にcv2.waitKey(0)
とcv2.destroyAllWindows()
を追加して以下の様に記述します。
import cv2 # カラー画像を読み込む img_color = cv2.imread('image.jpg') # 画像を表示する。ウィンドウ名を"Image-1"に指定 cv2.imshow('Image-1', image) # キー入力を待つ cv2.waitKey(0) # キーが入力されたら画像を閉じる cv2.destroyAllWindows()
ここで、cv2.waitKey(0)
は何かのキー入力を待つという処理になります。cv2.destroyAllWindows
関数は前の行のキー入力後、ウィンドウを閉じる処理となります。
つまり、imshow関数1行のみではウィンドウが表示されてすぐにプログラムが終了してしまいウィンドウが閉じられてしまいます。
これ以降のプログラムがない場合はcv2.destroyAllWindows
関数はなくても構いません。この様に表示されます。
画像の右側に余白ができてしまいます。また、ディスプレーからはみ出るほど大きいサイズになってしまいました。公式ドキュメントによるとcv2.imshow
関数で作成されるウィンドウはcv2.WINDOW_AUTOSIZE
というフラグが設定されると説明されています。どうもこれが悪さをしているのかもしれません。別のフラグを設定するために cv2.namedWindow
関数を使用します。
引数
名称 | 説明 |
---|---|
winname(必須) | ウィンドウ名 |
flags(オプション) | 表示する画像データ(デフォルト:WINDOW_AUTOSIZE ) |
改良版の表示は次の様になります。
import cv2 # 画像を読み込む image = cv2.imread('images/duck.jpg') # ウィンドウ名を"Image-2"に指定。 cv2.namedWindow('Image-2', cv2.WINDOW_NORMAL) # 画像を表示する。 cv2.imshow('Image-2', image) # キー入力を待つ cv2.waitKey(0) # キーが入力されたら画像を閉じる cv2.destroyAllWindows()
引数のflag
はWindowFlagとして、以下の様に定義されています。
WindowFlag | 説明 |
---|---|
cv2.WINDOW_NORMAL | ウィンドウのサイズを変更できます (制限なし) / フルスクリーン ウィンドウを通常のサイズに切り替えるためにも使用します。 |
cv2.WINDOW_AUTOSIZE | ユーザーはウィンドウのサイズを変更できません。サイズは表示される画像によって制限されます。 |
cv2.WINDOW_OPENGL | OpenGL をサポートするウィンドウ。 |
cv2.WINDOW_FULLSCREEN | ウィンドウをフルスクリーンで表示します。 |
cv2.WINDOW_FREERATIO | 画像は可能な限り消費されます (比率の制約なし)。 |
cv2.WINDOW_KEEPRATIO | 画像の縦横比率に合わせたウィンドウのサイズになります。 |
cv2.WINDOW_GUI_EXPANDED | ステータスバーとツールバーが表示されます。 |
cv2.WINDOW_GUI_NORMAL | 古い形式の表示となります。 |
これらのフラグを組み合わせて使用することで、ウィンドウの動作や外観をカスタマイズできます。例えば、cv2.namedWindow('Example', cv2.WINDOW_AUTOSIZE | cv2.WINDOW_KEEPRATIO)
とすると、指定した2つのオプションが有効になったウィンドウが作成されます。
cv2.namedWindow
関数は通常、cv2.imshow
関数で画像を表示する前に呼び出され、ウィンドウの設定を行います。既に同じ名前のウィンドウが存在する場合は再利用されるため、プログラム内で複数回呼び出す必要はありません。
この様に余白がなくなりました。
画像を読み込む方法については下の記事で解説していますので、参考にしてください。
matplotlib imshow関数
matplotlibのインストール
matplotlibをインストールします。既にインストール済みの場合は飛ばしてください。ターミナルから下記コマンドを実行します。
pip install matplotlib
imshow関数の書式と使い方
最も簡単な使い方を紹介します。引数は画像データのみで動作します。戻り値はありません。
引数
名称 | 説明 |
---|---|
X(必須) | 表示する画像データ |
基本的な使い方は例は次の通りです。
Matplotlibのプロットインターフェイスであるpyplotを使用するので、モジュールをインポートします。
import matplotlib.pyplot as plt
画像ファイルの読み込みはOpenCVを使って行い、pyplotで表示します。
import matplotlib.pyplot as plt # 画像を読み込む。 image = cv2.imread('image.jpg') # ウィンドウ上に画像を表示する。 plt.imshow(image) # ウィンドウを表示する。 plt.show()
実行すると、この様に表示されます。
変な色になってしまいました。
これはmatplotlibとOpenCVの色の並びが異なるからです。
matplotlibではRGB(赤緑青)の順番ででーたが並んでいることを前提に扱われますが、OpneCVではBGR(青緑赤)となっています。
これを直すためにOpenCVのcv2.cvtColor
関数を使ってBGRからRGBの色の並びに変換することができます。
import matplotlib.pyplot as plt # 画像を読み込む。 bgr_image = cv2.imread('image.jpg') # BGRのデータの並びからRGBのデータの並びに変換 rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB) # ウィンドウ上に画像を表示する。 plt.imshow(rgb_image) # ウィンドウを表示する。 plt.show()
正しく表示できました。cv2.cvtColor
関数については別の記事でもう少し詳しく説明したいと思います。
最後までご覧いただきありがとうございました。
■(広告)OpenCVの参考書としてどうぞ!■
参考リンク
OpenCV: High-level GUI : imread()
OpenCV: High-level GUI : namedWindow()
Matplotlib: pyplot.imshow
Matplotlib: Image tutorial