Python画像処理のベストパートナー!Pillow, NumPy, OpenCVの使い分けと連携術


 

Pythonで画像処理を行う際、Pillow、NumPy、OpenCVといった強力なライブラリが選択肢として挙げられます。それぞれ異なる得意分野を持ち、適切に使い分けることで、効率的かつ高度な画像処理を実現できます。この記事では、Pillow, NumPy, OpenCVそれぞれの特徴と、それらを連携させて効果的に画像処理を進める方法について、具体的なサンプルコードを交えながら詳しく解説します。


 

1. Pillow:手軽な画像操作とファイル入出力の定番

 

Pillowは、Python Imaging Library (PIL) の後継として開発された、Pythonで画像を扱うためのデファクトスタンダードライブラリです。Webアプリケーションでの画像表示、簡単な編集、フォーマット変換など、手軽な画像操作と多様な画像フォーマットの読み書きに強みを発揮します。

 

得意なこと

 

  • JPEG, PNG, GIF, BMPなど、幅広い画像フォーマットの読み込みと保存

  • リサイズ、回転、クロップなどの基本的な画像変換

  • テキストや図形の描画、フィルタ(ぼかし、シャープネスなど)の適用

  • NumPy配列との相互変換が容易

 

こんな時に使う

 

  • Webアプリケーションでユーザーがアップロードした画像をリサイズして表示する

  • 画像ファイルのフォーマットを変換する

  • 簡単な透かしを入れる、キャプションを付ける

  • 機械学習の前処理で、画像データをNumPy配列に変換する最初のステップ

 

サンプルコード(画像のリサイズ)

 

Python
 
from PIL import Image

# 画像を読み込み
# 例: dummy_image.jpg がカレントディレクトリにあると仮定
# dummy_image.jpgがない場合は、下記をコメントアウトして、
# Image.new()でダミー画像を作成してください。
try:
    img = Image.open('dummy_image.jpg')
except FileNotFoundError:
    # ダミー画像を生成 (赤色の500x300画像)
    img = Image.new('RGB', (500, 300), color = 'red')
    img.save('dummy_image.jpg') # 保存して次回以降使えるようにする
    img = Image.open('dummy_image.jpg')


print(f"元の画像サイズ: {img.size}")

# 200x150にリサイズ
resized_img = img.resize((200, 150))
print(f"リサイズ後の画像サイズ: {resized_img.size}")

# 保存 (今回は表示しない)
# resized_img.save('resized_image.jpg')

 

2. NumPy:画素データへの直接アクセスと高速な数値演算

 

NumPyは、Pythonで数値計算を高速に行うための基盤ライブラリであり、画像処理においてもその能力を最大限に発揮します。画像は数値の配列(画素値の集合)として表現できるため、NumPy配列として扱うことで、画素データへの直接アクセスや、高度な数学的・論理的演算を効率的に行えます。PillowやOpenCVで読み込んだ画像データをNumPy配列に変換して、詳細な処理を行うのが一般的です。

 

得意なこと

 

  • 画素値の直接操作(例: 明るさ調整、コントラスト強調)

  • 画像間の算術演算(例: 画像の合成、差分検出)

  • フィルタ処理(畳み込み演算)の自作

  • ブロードキャスト機能を活用した効率的な処理

  • 配列スライシングによる領域抽出

 

こんな時に使う

 

  • 画像のRGB各チャンネルの値を個別に操作する

  • 画像の特定の領域だけを抽出・変更する

  • ノイズ除去のためのカスタムフィルタを適用する

  • 複数の画像の平均値を計算して合成する

  • 機械学習モデルへの入力データとして画像データを準備する

 

サンプルコード(画像の明るさ調整)

 

Python
 
from PIL import Image
import numpy as np

# Pillowで画像を読み込み、NumPy配列に変換
# 上記のPillowコードで dummy_image.jpg が作成されている前提
img_pil = Image.open('dummy_image.jpg')
img_np = np.array(img_pil)
print(f"元の画像配列の形状: {img_np.shape}, データ型: {img_np.dtype}")

# 明るさを調整 (例: 全ピクセル値に50を加算)
# np.clipで0-255の範囲に収める
bright_img_np = np.clip(img_np + 50, 0, 255).astype(np.uint8)
print(f"明るさ調整後の画像配列の形状: {bright_img_np.shape}, データ型: {bright_img_np.dtype}")

# NumPy配列からPillow画像に戻して表示・保存
bright_img_pil = Image.fromarray(bright_img_np)
# bright_img_pil.save('bright_image.jpg')

 

3. OpenCV:コンピュータビジョンと高度な画像解析の専門家

 

**OpenCV(Open Source Computer Vision Library)**は、コンピュータビジョン分野で最も広く使われているオープンソースライブラリです。PillowやNumPyよりも、高度な画像解析、機械学習、リアルタイム処理に特化しています。画像認識、物体検出、顔認識、動画処理など、複雑なタスクを実行する際にその真価を発揮します。

 

得意なこと

 

  • 特徴点検出とマッチング(SIFT, SURF, ORBなど)

  • 顔検出、顔認識、物体検出(Haar Cascade, YOLO, SSDなど)

  • 画像セグメンテーション、背景除去

  • 動画の読み込み、処理、保存

  • リアルタイム画像処理(Webカメラ入力など)

  • 多数の画像フィルタや変換(ガウシアンぼかし、エッジ検出、形態学変換など)

  • カメラキャリブレーション、3D再構築

 

こんな時に使う

 

  • 画像や動画から特定の物体や顔を検出する

  • 画像の特徴を抽出して、画像検索や画像認識を行う

  • 監視カメラの映像から動きを検出する

  • ロボットの視覚システムを開発する

  • 画像に複雑な幾何学的変換を適用する

 

サンプルコード(画像のグレースケール変換とぼかし)

 

Python
 
import cv2
import numpy as np # OpenCVは内部でNumPyを利用

# 画像を読み込み (OpenCVはBGR順で読み込むことに注意)
# 上記のPillowコードで dummy_image.jpg が作成されている前提
img_cv = cv2.imread('dummy_image.jpg')
print(f"元の画像サイズ (OpenCV): {img_cv.shape}") # (高さ, 幅, チャンネル)

# グレースケールに変換
gray_img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
print(f"グレースケール後のサイズ: {gray_img.shape}")

# ガウシアンぼかしを適用 (カーネルサイズ 5x5)
blurred_img = cv2.GaussianBlur(gray_img, (5, 5), 0)
print(f"ぼかし後のサイズ: {blurred_img.shape}")

# 保存 (今回は表示しない)
# cv2.imwrite('blurred_gray_image.jpg', blurred_img)

 

3つのライブラリの連携術

 

これら3つのライブラリは、それぞれの得意分野を活かして連携することで、より強力な画像処理パイプラインを構築できます。

  1. Pillowで読み込み・保存: 多くの画像フォーマットに対応しているPillowで画像を読み込み、基本的なリサイズなどの前処理を行います。

  2. NumPyで画素操作: PillowのImageオブジェクトをnp.array()でNumPy配列に変換し、画素値の直接操作や高速な数値演算を実行します。

  3. OpenCVで高度な解析: NumPy配列はOpenCVの多くの関数に直接渡せるため、NumPyで前処理した画像データをOpenCVに渡し、物体検出や特徴量抽出などの高度なコンピュータビジョン処理を行います。

  4. 結果の表示・保存: 処理後のNumPy配列を再度PillowのImageオブジェクトに変換して表示したり、OpenCVのcv2.imwrite()で直接保存したりします。

Pillow ↔ NumPy ↔ OpenCV の連携がスムーズに行えるため、タスクに応じて最適なライブラリを選択し、必要に応じて切り替えるのがPython画像処理のベストプラクティスです。


 

まとめ

 

Pythonでの画像処理において、Pillow、NumPy、OpenCVはそれぞれ異なる強みを持つ不可欠なツールです。

  • Pillow: 画像のファイルI/O、基本的な編集、フォーマット変換など、手軽な画像操作に最適。

  • NumPy: 画像を数値配列として扱い、画素値の直接操作や高速な数値演算に特化。

  • OpenCV: 顔認識、物体検出、画像セグメンテーションなど、高度なコンピュータビジョン処理や機械学習に強み。

これらのライブラリを適切に使い分け、必要に応じて連携させることで、あらゆる画像処理タスクを効率的かつ効果的にこなすことができるでしょう。あなたのPython画像処理プロジェクトに最適なツールを選び、ぜひ活用してください!📸