2種類の画像を表示する方法について解説(imshow)

※当サイトではアフィリエイト広告を利用しています

Python プログラミング 画像処理

【Python・OpenCV・matplotlib】2種類の画像を表示する方法について解説(imshow)

2023-02-07

はじめに

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関数

入力画像として、この画像を使用しました。

引用元
https://unsplash.com/photos/VTvnoNBowZs

cv2.imshow関数

書式は2つの引数が用意されていて、戻り値はありません。

cv2.imshow(winname, mat)

引数

名称説明
winname(必須)ウィンドウ名
mat(必須)表示する画像データ

画像形式について

cv2.imshow関数は、さまざまな形式の画像データを受け付けることができます。

  1. カラー画像 (BGR形式)
    • OpenCVではカラー画像はBGR形式で表現されます。
    • 入力形式はnumpy.ndarrayで、shape(高さ, 幅, 3) となります。
    • 各ピクセルは0~255の値をとる青、緑、赤の3つの値で表現されます。
  2. グレースケール画像
    • グレースケール画像は1チャンネルの画像です。
    • 入力形式はnumpy.ndarrayで、shape(高さ, 幅) となります。
    • 各ピクセルは0(黒)~255(白)の値をとります。
  3. その他のカラー形式
    • OpenCVは様々なカラー形式をサポートしています(HSV、YCrCbなど)。
    • OpenCVは様々な色空間をサポートしています(HSV、YCrCbなど)。
      これらの形式でもcv2.imshow関数に渡すことができますが、カラー空間をBGRに変換する必要があります。

cv2.imshow関数の動作について

  • ウィンドウは別スレッドで動作するため、プログラムの実行は中断されません。
    ウィンドウを閉じるまでプログラムは待機状態になります。
  • 複数の画像を同時に表示することも可能です。
    winnameを変えれば、別ウィンドウで表示されます。

使い方

基本的な使い方は例は次の通りです。この例ではウィンドウ名を"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関数を使用します。

cv2.namedWindow(winname[, flags])

引数

名称説明
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()

引数のflagWindowFlagとして、以下の様に定義されています。

WindowFlag説明
cv2.WINDOW_NORMALウィンドウのサイズを変更できます (制限なし) / フルスクリーン ウィンドウを通常のサイズに切り替えるためにも使用します。
cv2.WINDOW_AUTOSIZEユーザーはウィンドウのサイズを変更できません。サイズは表示される画像によって制限されます。
cv2.WINDOW_OPENGLOpenGL をサポートするウィンドウ。
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関数の書式と使い方

最も簡単な使い方を紹介します。引数は画像データのみで動作します。戻り値はありません。

matplotlib.pyplot.imshow(X)

引数

名称説明
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の参考書としてどうぞ!■

参考リンク

-Python, プログラミング, 画像処理
-,