はじめに:画像・動画処理の第一歩
デジタル画像処理の基礎として、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}' に保存しました。")