Matplotlibのplt.show()とcv2.imshow()の違いとは?画像表示の差をわかりやすく解説
Pythonで画像を扱う際、MatplotlibとOpenCV(cv2)はどちらも画像を多次元のNumPy配列として読み込みます。しかし、両者には重要な違いがあります。Matplotlibのimreadメソッドは画像を赤(R)・緑(G)・青(B)の順(RGB順)のNumPy配列として読み込み、imshowで画面に表示します。一方、OpenCVのcv2.imreadも同様に多次元NumPy配列として画像を読み込みますが、チャンネルの並びが逆順(BGR順)になっている点が最大の特徴です。
この違いを理解せずに使うと、cv2で読み込んだ画像をMatplotlibで表示した際に色が反転して見えるという現象が起こります。以下では、実際にコードを実行してその違いを確認してみましょう。
検証の手順
- 図のサイズを設定し、サブプロット間および周囲の余白を調整します。
- 表示する画像のファイル名を初期化します。
- nrows=1、ncols=2、index=1 を指定して、現在の図に1つ目のサブプロットを追加します。
- cv2を使って画像を読み込みます。
- 軸を非表示にし、続くステートメントで図を表示します。
- nrows=1、ncols=2、index=2 を指定して、2つ目のサブプロットを追加します。
- plt(matplotlib.image)を使って同じ画像を読み込みます。
- 軸を非表示にし、図を表示します。
- 最後に show() メソッドを呼び出して図全体を表示します。
サンプルコード
import cv2
from matplotlib import pyplot as plt, image
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
filename = "bird.jpg"
# 左側:cv2で読み込んだ場合
plt.subplot(121)
img = cv2.imread(filename)
plt.axis("off")
plt.imshow(img)
plt.title("with cv2")
# 右側:matplotlib.imageで読み込んだ場合
plt.subplot(122)
img = image.imread(filename)
plt.axis("off")
plt.imshow(img)
plt.title("with plt")
plt.show()実行結果

左側(cv2で読み込んだ画像)では、赤と青のチャンネルが入れ替わっているため、本来の色とは異なる表示になっていることが分かります。右側(matplotlibで読み込んだ画像)は正しい色で表示されています。
色ずれを解消するには
cv2で読み込んだ画像をMatplotlibで正しく表示したい場合は、cv2.cvtColor()を使ってBGRからRGBへ変換しましょう。
img = cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2RGB)
このように、plt.show()とcv2.imshow()はどちらも画像を表示するための機能ですが、背後にあるチャンネル順序(RGBかBGRか)の違いを理解しておくことが、意図通りの画像表示には欠かせません。
-
Matplotlibで棒グラフと折れ線グラフを同じプロットに重ねて表示する方法
データ分析や可視化の現場では、棒グラフと折れ線グラフを1つの図に重ねて表示したい場面がよくあります。Matplotlibでは、PandasのDataFrameと組み合わせることで、このような複合グラフを簡単に作成できます。 この記事では、同じプロット上に棒グラフと折れ線グラフを表示する具体的な手順を解説します。 実装の手順 図のサイズと余白を設定する — figureサイズを指定し、サブプロット間・周囲のパディングを調整します。 2次元の表形式データを作成する — サイズ変更可能な、PandasのDataFrameを用意します。 Figureとサブプロットを作成する — plt.subplo
-
Matplotlib.pyplotとMatplotlib.figureの違いとは?わかりやすく解説
Matplotlibでグラフを描く際によく使われるmatplotlib.pyplotとmatplotlib.figure。どちらも図を作成するために使われますが、役割と仕組みが異なります。この記事では、それぞれの特徴と違いを具体例とともに解説します。 matplotlib.pyplotとは matplotlib.pyplotは、MatplotlibをMATLABのように操作できるようにする関数のコレクションです。pyplotの各関数は、図(figure)に対して何らかの変更を加えます。例えば、次のような操作が該当します。 新しい図(figure)を作成する 図の中にプロット領域(Axes)