Pythonで画像サイズを知る:OpenCVとPillowで幅・高さを取得


 


画像処理を行う際、画像の幅(width)と高さ(height)を取得することは基本的ながら非常に重要な操作です。画像のサイズ情報は、処理の自動化、メモリ管理、表示の調整など、様々な場面で必要となります。Pythonでは、主要な画像処理ライブラリであるOpenCVと**Pillow(PIL)**を使って、この画像サイズ情報を簡単に取得できます。

この記事では、OpenCVとPillow、それぞれのライブラリを用いた画像サイズ(幅、高さ)の取得方法を、短いサンプルコードとともに分かりやすく解説します。Pythonで画像処理の第一歩を踏み出したい方や、効率的な画像ファイル操作を目指す方にとって、必見の内容です。


 

なぜ画像サイズを知る必要があるのか?

 

画像の幅と高さは、画像データを扱う上で最も基本的なメタデータの一つです。

  • 処理の最適化: 画像のサイズに応じて処理アルゴリズムを調整したり、メモリ使用量を予測したりできます。

  • レイアウト調整: Webページやアプリケーションで画像を適切に配置するために、サイズ情報を利用します。

  • バリデーション: 特定のサイズ要件を満たしているかを確認し、不正な画像を弾くことができます。

  • アスペクト比の維持: 画像のリサイズ時に、元の比率を保つために幅と高さの比率を使用します。


 

Pythonで画像サイズを取得する

 

OpenCVとPillowは、それぞれ異なる方法で画像オブジェクトを扱い、サイズ情報を格納しています。

 

準備:テスト画像の作成

 

まず、画像サイズを取得するためのテスト画像を用意しましょう。ここでは、Pillowを使って簡単な画像を生成し、ファイルとして保存します。

Python
 
from PIL import Image
import numpy as np
import os

# 1. Pillowでテスト画像を生成
width_test, height_test = 320, 240
img_pil_test = Image.new('RGB', (width_test, height_test), color = 'red')
img_pil_test.save("test_image.png")
print(f"テスト用に 'test_image.png' (幅: {width_test}, 高さ: {height_test}) を作成しました。\n")

 

1. OpenCVで画像サイズを取得する

 

OpenCV(cv2モジュール)では、画像をNumPy配列として読み込みます。画像サイズは、そのNumPy配列のshape属性から取得できます。

Python
 
import cv2
import numpy as np # OpenCVはNumPy配列を扱うため

# 読み込む画像ファイル名
image_path = "test_image.png"

try:
    # 画像を読み込み (NumPy配列として)
    img_cv = cv2.imread(image_path)

    if img_cv is None:
        raise FileNotFoundError(f"画像ファイル '{image_path}' を読み込めませんでした。")

    # 画像のshape属性からサイズ情報を取得
    # shapeは (高さ, 幅, チャンネル数) の順
    height, width, channels = img_cv.shape

    print(f"--- OpenCVで取得した画像サイズ ---")
    print(f"幅 (Width): {width} ピクセル")
    print(f"高さ (Height): {height} ピクセル")
    print(f"チャンネル数: {channels}")

except FileNotFoundError as e:
    print(f"エラー: {e}")
except Exception as e:
    print(f"処理中にエラーが発生しました: {e}")

# 出力例:
# --- OpenCVで取得した画像サイズ ---
# 幅 (Width): 320 ピクセル
# 高さ (Height): 240 ピクセル
# チャンネル数: 3
  • cv2.imread()で画像を読み込むと、NumPyのndarray(多次元配列)として扱われます。

  • NumPy配列のshape属性は、次元ごとのサイズをタプルで返します。画像のshapeは通常(高さ, 幅, チャンネル数)の順になっています。グレースケール画像の場合は(高さ, 幅)となります(チャンネル数が省略されます)。


 

2. Pillow(PIL)で画像サイズを取得する

 

Pillow(PIL.Imageモジュール)では、Imageオブジェクトを介して画像サイズを取得します。Imageオブジェクトのsize属性から直接幅と高さのタプルを取得できます。

Python
 
from PIL import Image
import os

# 読み込む画像ファイル名
image_path = "test_image.png"

try:
    # 画像をPillowのImageオブジェクトとして開く
    img_pil = Image.open(image_path)

    # 画像のsize属性から (幅, 高さ) のタプルを取得
    width, height = img_pil.size

    print(f"\n--- Pillowで取得した画像サイズ ---")
    print(f"幅 (Width): {width} ピクセル")
    print(f"高さ (Height): {height} ピクセル")

    # 画像のモード(例: 'RGB', 'L'など)も確認できる
    print(f"画像モード: {img_pil.mode}")

    img_pil.close() # 開いた画像ファイルを閉じる

except FileNotFoundError as e:
    print(f"エラー: 画像ファイル '{image_path}' が見つかりません。")
except Exception as e:
    print(f"処理中にエラーが発生しました: {e}")

# 出力例:
# --- Pillowで取得した画像サイズ ---
# 幅 (Width): 320 ピクセル
# 高さ (Height): 240 ピクセル
# 画像モード: RGB
  • PIL.Image.open()で画像ファイルを開くと、Imageオブジェクトが返されます。

  • Imageオブジェクトのsize属性は、(幅, 高さ)の順のタプルを返します。

  • 処理が終わったら、img_pil.close()で明示的にファイルを閉じることを推奨します。with open(...)構文のように、with Image.open(...) as img_pil:とすることで自動的に閉じられます。


 

まとめと使い分け

 

Pythonで画像の幅と高さを取得する際、OpenCVとPillowはどちらも有効な手段ですが、それぞれに得意な状況があります。

  • OpenCV (cv2.imread().shape):

    • 特徴: 画像をNumPy配列として扱うため、数値計算や高度な画像処理(フィルタリング、特徴抽出など)と連携しやすい。

    • 使い分け: 画像のピクセルデータそのものを直接操作したり、OpenCVの他の機能と組み合わせて複雑な画像処理パイプラインを構築する場合に最適です。shape属性の順番(高さ、幅)に注意が必要です。

  • Pillow (PIL.Image.open().size):

    • 特徴: 画像ファイルの読み書き、リサイズ、回転、合成など、基本的な画像編集操作に非常に優れています。

    • 使い分け: Webアプリケーションでの画像処理、サムネイル作成、画像のフォーマット変換など、より「画像ファイル」としての操作が多い場合に便利です。size属性の順番は直感的な(幅、高さ)です。

どちらのライブラリもPythonの画像処理において非常に強力です。あなたのプロジェクトの要件や、既に利用しているライブラリに合わせて、最適な方法を選択してください。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座