Python画像処理の三強:Pillow, NumPy, OpenCVの違いと賢い使い分け 🖼️


Pythonで画像処理を行う際、数多くのライブラリが存在しますが、特に頻繁に名前が挙がるのがPillow (PIL)NumPy、そしてOpenCVの三つです。それぞれ異なる特性と得意分野を持つため、プロジェクトの要件に応じて最適なライブラリを選択することが重要です。

この記事では、Pillow、NumPy、OpenCVのそれぞれの特徴と、どのような場面でどのライブラリを使うべきかについて、短いサンプルコードを交えながら分かりやすく解説します。Pythonでの画像処理を効率的かつ効果的に進めるための、賢いライブラリ選択術を身につけましょう。

なぜ複数の画像処理ライブラリが存在するのか?

画像処理のニーズは多岐にわたります。簡単な画像ファイルの読み書きやリサイズから、複雑な数値計算を伴うフィルタリング、機械学習のための特徴抽出、さらにはリアルタイムのビデオ処理まで、目的によって必要な機能セットが異なります。そのため、特定の目的に特化した、あるいは汎用性の高い複数のライブラリが発展してきました。


主要画像処理ライブラリの比較表

まずは、三つの主要ライブラリの概要をまとめた比較表を見てみましょう。

ライブラリ名 主な用途 強み・得意なこと 弱み・苦手なこと
Pillow (PIL) 画像ファイルの入出力、基本的な画像編集 幅広い画像形式のサポート、直感的なAPI、サムネイル作成、簡単な画像加工 高度な数値計算、リアルタイム処理
NumPy 数値計算、画像データ表現 画像を多次元配列として高速に操作、独自のアルゴリズム実装、低レベルなピクセル操作 画像ファイルの直接読み書きはできない、画像編集機能は持たない
OpenCV (cv2) コンピュータビジョン、機械学習、高度な画像処理 豊富なアルゴリズム(特徴点検出、物体認識)、高速な実行速度(C++ベース)、リアルタイム処理 学習コストがやや高い、画像ファイルの直接編集機能は限定的

各ライブラリの詳細と賢い使い分け

1. Pillow (PIL): 画像ファイルの扱いと基本編集のエキスパート 🖼️

Pillowは、Python Imaging Library (PIL) から派生したライブラリで、画像の読み書き、表示、および基本的な画像編集に優れています。

特徴

  • 幅広い画像形式のサポート: JPEG, PNG, BMP, GIFなど、多くの画像形式に対応しています。

  • 直感的なAPI: 画像のリサイズ、回転、クロップ、フィルタ適用などがシンプルなコードで実現できます。

  • サムネイル作成: Webアプリケーションなどで、元の画像から高速にサムネイル画像を生成するのに非常に便利です。

どんな時に使う?

  • 画像ファイルの読み込み、保存、フォーマット変換。

  • 画像のサイズ変更、回転、切り抜き、反転といった基本的な編集。

  • Webアプリケーションでの画像アップロード処理や表示。

  • 非破壊的な画像処理や、複雑な数値計算が不要な場合。

短いサンプルコード(読み書き・リサイズ)

Python
 
from PIL import Image

# 画像を作成して保存 (テスト用)
img = Image.new('RGB', (600, 400), color = 'blue')
img.save('original.png')
print("original.png を作成しました。")

# 画像の読み込み
img_pil = Image.open('original.png')
print(f"元の画像サイズ (Pillow): {img_pil.size}") # (幅, 高さ)

# 画像のリサイズ
img_resized = img_pil.resize((300, 200))
img_resized.save('resized.png')
print("resized.png を作成しました。")

2. NumPy: ピクセルデータ操作の基盤 📊

NumPyは、多次元配列(ndarray)を扱うためのPythonライブラリであり、画像データもこの配列として表現されます。OpenCVやPillowで画像を読み込んだ後、ピクセルレベルでの高速な数値計算を行う際の基盤となります。

特徴

  • 高速な数値計算: C言語で実装されたコア部分により、Pythonのループよりも圧倒的に高速な配列操作が可能です。

  • 画像データの表現: 画像はNumPy配列として(高さ, 幅, チャンネル数)または(高さ, 幅)で表現されます。

  • 数学的操作: ピクセル値に対する加算、減算、乗算、論理演算などを効率的に行えます。

どんな時に使う?

  • 画像のピクセル値を直接操作する、あるいは独自のフィルタリングアルゴリズムを実装する場合。

  • 画像データに対して統計処理(平均、分散など)を行いたい場合。

  • OpenCVやPillowで読み込んだ画像データを、より低レベルで細かく制御したい場合。

  • 機械学習の前処理で画像データを数値的に操作する場合。

苦手なこと

  • 画像ファイルの直接的な読み書きはできません。

  • 基本的な画像編集(リサイズ、回転など)の専用機能は持っていません。

短いサンプルコード(画像データの変換・操作)

Python
 
import numpy as np
from PIL import Image

# Pillowで画像を読み込み、NumPy配列に変換
img_pil = Image.open('original.png') # original.pngは上記で作成
img_np = np.array(img_pil)
print(f"NumPy配列のshape: {img_np.shape}") # (高さ, 幅, チャンネル数)

# 画像の各ピクセル値を反転 (255から引く)
img_inverted_np = 255 - img_np
print("画像を反転しました。")

# NumPy配列をPillow画像に戻して保存
img_inverted_pil = Image.fromarray(img_inverted_np.astype(np.uint8)) # データ型をuint8に
img_inverted_pil.save('inverted.png')
print("inverted.png を作成しました。")

3. OpenCV (cv2): コンピュータビジョンの巨人 👁️

OpenCVは、コンピュータビジョン分野の主要ライブラリであり、リアルタイム画像処理、物体検出、顔認識など、高度な画像解析アルゴリズムを豊富に提供します。内部的にNumPyを画像データの表現に利用しています。

特徴

  • 豊富なアルゴリズム: フィルタリング、特徴点検出、セグメンテーション、物体認識、トラッキングなど、コンピュータビジョンの最先端アルゴリズムが多数実装されています。

  • 高速な実行速度: C++で書かれた高性能なバックエンドを持っており、Pythonから利用しても非常に高速です。

  • リアルタイム処理: Webカメラからのストリーム処理など、リアルタイムアプリケーションに適しています。

どんな時に使う?

  • 顔検出、ナンバープレート認識、ジェスチャー認識などの物体検出・認識。

  • 動画からの画像処理や、リアルタイム画像処理アプリケーションの開発。

  • 高度な画像フィルタリングや変換(例:エッジ検出、画像合成、パノラマ作成)。

  • 機械学習や深層学習と連携した画像解析。

苦手なこと

  • Pillowほど多くの画像ファイル形式に対応しているわけではありません(主要な形式はカバー)。

  • 基本的な画像編集(リサイズ、回転など)は可能ですが、Pillowの方が直感的である場合があります。

短いサンプルコード(画像読み込み・グレースケール変換)

Python
 
import cv2
import numpy as np

# 画像の読み込み (OpenCVはBGR順で読み込む)
img_cv = cv2.imread('original.png') # original.pngは上記で作成

if img_cv is None:
    print("画像が見つからないか、読み込めませんでした。")
else:
    print(f"OpenCVで読み込んだ画像サイズ: (高さ:{img_cv.shape[0]}, 幅:{img_cv.shape[1]})") # (高さ, 幅, チャンネル数)

    # グレースケールに変換
    img_gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
    cv2.imwrite('grayscale.png', img_gray)
    print("grayscale.png を作成しました。")

    # 画像を表示 (Jupyter Notebookやスクリプト実行時)
    # cv2.imshow('Original Image', img_cv)
    # cv2.imshow('Grayscale Image', img_gray)
    # cv2.waitKey(0) # キーが押されるまで表示
    # cv2.destroyAllWindows()

まとめ:あなたのプロジェクトに最適な選択を 🎯

ライブラリ 最適な状況
Pillow 画像ファイルの入出力と基本的な編集がメイン。Webアプリケーションやシンプルな画像加工。
NumPy 画像のピクセル値を低レベルで操作したり、独自のアルゴリズムを実装したりする際の基盤。
OpenCV コンピュータビジョン分野の高度な画像解析(物体検出、追跡など)、リアルタイム処理。

多くの場合、これらのライブラリは単独で使うだけでなく、組み合わせて利用することで、それぞれの強みを最大限に引き出すことができます。例えば、Pillowで画像を読み書きし、NumPyで数値計算を行い、OpenCVで高度なコンピュータビジョンアルゴリズムを適用するといったワークフローが一般的です。

あなたのPythonでの画像処理の旅が、これらの知識でよりスムーズになることを願っています!

「らくらくPython塾」が切り開く「呪文コーディング」とは?

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

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

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

■テックジム東京本校

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

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

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

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