Pythonで始める画像・動画処理:OpenCVとMatplotlibによる読み込みと表示

はじめに:画像・動画処理の第一歩

デジタル画像処理の基礎として、Pythonでの画像および動画ファイルの読み込みと表示は不可欠です。本稿では、コンピュータビジョンとデータ可視化の主要なライブラリであるOpenCVとMatplotlibを用いた基本的な操作について解説します。これらのツールを活用することで、画像・動画データの取り扱いが容易になります。

必要なライブラリのインストール

まずは、以下のコマンドをターミナルで実行し、必要なライブラリをインストールします。OpenCVのPythonバインディングとMatplotlibを導入します。

pip install opencv-python matplotlib numpy

静止画像の読み込みと表示

Pythonにおける静止画像の取り扱いは、主にOpenCVとMatplotlibの二つのライブラリで行われます。それぞれの特徴を見ていきましょう。

1. OpenCVによる画像処理

OpenCV(Open Source Computer Vision Library)は、リアルタイム画像処理に特化した非常に強力なライブラリです。ここでは、画像の読み込み、表示、そして基本的な制御方法を見ていきます。

import cv2
import numpy as np # 画像データはNumPy配列として扱われます

# 読み込む画像ファイルのパスを指定
# このパスは実行環境に合わせて変更してください
image_path = "sample_image.jpg" 

# 画像ファイルを読み込む。第2引数で読み込みモードを指定可能。
# cv2.IMREAD_COLOR (または省略): カラー画像として読み込む (BGR形式)
# cv2.IMREAD_GRAYSCALE (または 0): グレースケール画像として読み込む
# cv2.IMREAD_UNCHANGED (または -1): アルファチャンネルを含めそのまま読み込む
loaded_color_image = cv2.imread(image_path, cv2.IMREAD_COLOR)

# 画像が正しく読み込まれたか確認
if loaded_color_image is None:
    print(f"エラー: 画像ファイル '{image_path}' を読み込めませんでした。パスを確認してください。")
else:
    # 画像を表示
    cv2.imshow("カラー画像 (OpenCV)", loaded_color_image)
    
    # グレースケールで読み込む例
    loaded_grayscale_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if loaded_grayscale_image is not None:
        cv2.imshow("グレースケール画像 (OpenCV)", loaded_grayscale_image)

    # キー入力があるまで待機 (0は無限待機)
    cv2.waitKey(0)
    # 表示ウィンドウを全て閉じる
    cv2.destroyAllWindows()

2. Matplotlibによる画像処理

Matplotlibは主にグラフ描画に使われますが、画像データの表示にも非常に便利です。OpenCVとは異なる方法で画像を読み込み、表示する手順を紹介します。

import matplotlib.pyplot as plt

# Matplotlibは通常、画像をRGB形式で読み込みます
image_file_mpl = "another_sample.png" # このパスも適宜変更してください
mpl_image_data = plt.imread(image_file_mpl)

if mpl_image_data is None:
    print(f"エラー: 画像ファイル '{image_file_mpl}' を読み込めませんでした。パスを確認してください。")
else:
    plt.figure(figsize=(8, 6)) # ウィンドウサイズを指定
    plt.imshow(mpl_image_data)
    plt.title("Matplotlibによる画像表示")
    plt.xlabel("幅 (ピクセル)")
    plt.ylabel("高さ (ピクセル)")
    plt.show()

3. 複数の画像を比較表示する

画像処理の前後でどのように変化したかを比較するため、複数の画像を並べて表示することは非常に重要です。Matplotlibのサブプロット機能を使って、これを実現する方法を説明します。

import matplotlib.pyplot as plt
import numpy as np

# Matplotlibで画像を読み込む(通常はRGB形式)
original_image_for_comparison_path = "sample_comparison.jpg" # パスを適宜変更
image_original = plt.imread(original_image_for_comparison_path)

if image_original is None:
    print(f"エラー: 画像ファイル '{original_image_for_comparison_path}' を読み込めませんでした。")
else:
    # 画像データに簡単な処理を適用 (例: 明るさ調整)
    # 画素値を20加算し、0-255の範囲にクリップ(丸める)します
    image_processed = np.clip(image_original.astype(np.float32) + 20, 0, 255).astype(image_original.dtype)

    plt.figure(figsize=(12, 6)) # 全体のウィンドウサイズを指定

    # 1行2列のグリッドの1番目のサブプロットに元の画像を表示
    plt.subplot(1, 2, 1)
    plt.imshow(image_original)
    plt.title("元の画像")
    plt.axis('off') # 軸を非表示にする

    # 1行2列のグリッドの2番目のサブプロットに処理後の画像を表示
    plt.subplot(1, 2, 2)
    plt.imshow(image_processed)
    plt.title("処理後の画像 (明るさ+20)")
    plt.axis('off') # 軸を非表示にする

    plt.tight_layout() # サブプロット間のスペースを自動調整
    plt.show()

4. カラーチャンネルの変換 (BGR to RGB)

OpenCVは画像をBGR (青-緑-赤) 形式で読み込むのがデフォルトであるのに対し、Matplotlibや多くの画像処理アプリケーションではRGB (赤-緑-青) 形式が一般的です。これら二つのライブラリを組み合わせて使う際には、カラーチャンネルの変換が必要になります。

import cv2
import matplotlib.pyplot as plt

image_path_bgr_to_rgb = "color_image.bmp" # パスを適宜変更

# OpenCVで画像を読み込む (BGR形式でロードされる)
bgr_format_image = cv2.imread(image_path_bgr_to_rgb)

if bgr_format_image is None:
    print(f"エラー: 画像ファイル '{image_path_bgr_to_rgb}' を読み込めませんでした。")
else:
    # OpenCVのcvtColor関数を使ってBGRからRGBに変換
    rgb_format_image = cv2.cvtColor(bgr_format_image, cv2.COLOR_BGR2RGB)

    plt.figure(figsize=(7, 5))
    plt.imshow(rgb_format_image)
    plt.title("BGRからRGBへ変換後 (Matplotlibで表示)")
    plt.axis('off')
    plt.show()

動画の読み込みと表示

OpenCVは、静止画像だけでなく、動画ファイルの読み込みやリアルタイムでのカメラフィードの処理も得意としています。ここでは、ウェブカメラからの映像取得と、その表示方法を解説します。

import cv2

# ウェブカメラからの映像取得 (0はデフォルトのカメラを指します)
# 特定の動画ファイルを読み込む場合は、ファイルのパスを指定します:
# cap = cv2.VideoCapture('path/to/your_video.mp4')
cap = cv2.VideoCapture(0)

# カメラまたは動画ファイルが正しく開かれたかを確認
if not cap.isOpened():
    print("エラー: カメラまたは動画ファイルを開けませんでした。")
    exit() # プログラムを終了

print("ライブストリームを開始しました。'q'キーを押すと終了します。")

last_captured_frame = None # 最後にキャプチャされたフレームを保存するための変数

while True:
    # フレームを1つずつ読み込む
    ret, frame = cap.read()
    
    # retはフレームが正しく読み込まれたかどうかを示すブール値
    if not ret:
        print("フレームを読み込めませんでした。ストリームを終了します。")
        break
    
    # フレームを表示
    cv2.imshow("ライブカメラフィード", frame)
    last_captured_frame = frame # 最後のフレームを更新

    # 'q'キーが押されたらループを終了
    # waitKey(1)は1ミリ秒待機し、キー入力を検出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# キャプチャリソースを解放
cap.release()
# 開いているすべてのOpenCVウィンドウを閉じる
cv2.destroyAllWindows()

# 最後にキャプチャされたフレームを画像として保存する例
if last_captured_frame is not None:
    output_image_path = "last_captured_frame.jpg"
    cv2.imwrite(output_image_path, last_captured_frame)
    print(f"最終フレームを '{output_image_path}' に保存しました。")

タグ: Python OpenCV matplotlib 画像処理 動画処理

7月22日 23:05 投稿