Pillow・NumPy・OpenCVの違いとは?Python画像処理ライブラリを初心者向けに徹底比較

Pythonで画像処理を始めると、「Pillow」「NumPy」「OpenCV」という3つのライブラリを目にすることが多くなります。それぞれ何が違うのか、どのように使い分ければよいのでしょうか。

結論からいうと、Pillowは画像ファイルの読み込み・加工、NumPyは画像データを数値として扱う処理、OpenCVは高度な画像認識・コンピュータビジョン処理を得意としています。

Pillow・NumPy・OpenCVの違いを簡単に比較

まず3つの違いを表にすると、以下のようになります。

ライブラリ 主な役割 得意なこと 難易度
Pillow 画像処理 画像の読み込み・保存・リサイズ・加工 ★☆☆☆☆
NumPy 数値計算 画像データの配列処理・計算 ★★☆☆☆
OpenCV コンピュータビジョン 画像認識・物体検出・画像解析 ★★★★☆

もっと簡単に表現すると、次のように覚えると分かりやすいでしょう。

  • Pillow=画像を加工する
  • NumPy=画像を数字の配列として計算する
  • OpenCV=画像から情報を読み取る

ただし、実際のPython画像処理では、この3つを組み合わせて使うケースも非常に多くあります。

Pillowとは?

Pillowは、Pythonで画像ファイルを扱うための代表的なライブラリです。

JPEG、PNG、GIF、BMPなどの画像を読み込んだり、サイズを変更したり、保存したりできます。

Pillowは、Pythonで画像処理を始める初心者にとって非常に扱いやすいライブラリです。

Pillowでできること

  • 画像を開く
  • 画像を保存する
  • 画像をリサイズする
  • 画像を回転する
  • 画像を切り抜く
  • 色を変更する
  • 明るさを調整する
  • コントラストを変更する
  • 文字を描画する
  • 図形を描画する
  • JPEG・PNGなどの形式を変換する

例えば画像を開く場合は、次のように書けます。

from PIL import Image

img = Image.open("sample.jpg")

print(img.size)

画像のサイズを変更することもできます。

from PIL import Image

img = Image.open("sample.jpg")

img = img.resize((800, 600))

img.save("resized.jpg")

このように、Pillowは画像ファイルをシンプルに操作できる点が特徴です。

NumPyとは?

NumPyは、PillowやOpenCVとは少し性格が違います。

NumPyは、数値計算を行うためのライブラリです。

そのため、厳密には「画像処理専用ライブラリ」ではありません。

では、なぜ画像処理でNumPyが頻繁に登場するのでしょうか。

その理由は、画像を数字の配列として扱えるからです。

画像は数字の集合

例えば、RGB画像の場合、1つのピクセルは以下の3つの数値で表現できます。

  • 赤(R)
  • 緑(G)
  • 青(B)

例えば、以下の値なら赤色を表します。

[255, 0, 0]

画像全体は、このような数値が大量に並んだ配列として考えることができます。

そこでNumPyを利用すると、画像のピクセルを直接計算できます。

from PIL import Image
import numpy as np

img = Image.open("sample.jpg")

array = np.array(img)

print(array.shape)

例えば、以下のように表示された場合を考えてみましょう。

(600, 800, 3)

これは、次のような意味です。

  • 高さ:600
  • 幅:800
  • RGB:3

NumPyを使うと画像の数値を直接操作できる

NumPyの大きな特徴は、画像を配列として操作できることです。

例えば、画像を暗くしたい場合、次のような計算ができます。

array = array * 0.5

また、画像の一部分だけを取り出すこともできます。

cropped = array[100:300, 100:400]

このように、NumPyは画像そのものを加工するというより、画像を構成している数値を計算するために使うと考えると分かりやすいでしょう。

OpenCVとは?

OpenCVは、画像処理やコンピュータビジョンのための非常に強力なライブラリです。

OpenCVは「Open Source Computer Vision Library」の略です。

Pillowよりも高度な画像処理を得意としており、以下のような処理でよく利用されます。

  • 画像認識
  • 顔認識
  • エッジ検出
  • 二値化
  • オブジェクト検出
  • 動画処理
  • カメラ映像処理
  • 画像の特徴抽出
  • 図形検出
  • 画像変換
  • モーション検出

例えば画像を読み込むだけなら、次のように書けます。

import cv2

img = cv2.imread("sample.jpg")

OpenCVは、単純な画像加工だけでなく、画像や動画から特徴を抽出したり、認識・解析したりする用途に向いています。

PillowとOpenCVの違い

PillowとOpenCVはどちらも画像処理に使われるため、特に混同されやすいライブラリです。

大きな違いは目的です。

Pillow

Pillowは、以下のような用途に向いています。

画像ファイルを扱う
↓
画像を加工する
↓
画像を保存する

OpenCV

OpenCVは、以下のような処理を得意としています。

画像・動画を読み込む
↓
画像を解析する
↓
特徴を検出する
↓
物体や顔などを認識する

PillowとOpenCVの機能比較

処理 Pillow OpenCV
JPEG読み込み ◎ ◎
PNG読み込み ◎ ◎
画像保存 ◎ ◎
リサイズ ◎ ◎
回転 ◎ ◎
トリミング ◎ ◎
明るさ調整 ◎ ○
画像合成 ◎ ○
文字描画 ◎ ◎
エッジ検出 ○ ◎
顔検出 △ ◎
動画処理 △ ◎
カメラ処理 △ ◎
コンピュータビジョン △ ◎

つまり、単純な画像加工ならPillow、画像解析・認識ならOpenCVと考えると分かりやすいでしょう。

OpenCVとNumPyの関係

OpenCVとNumPyも非常に相性が良い組み合わせです。

OpenCVで画像を読み込むと、画像は基本的にNumPy配列として扱えます。

import cv2

img = cv2.imread("sample.jpg")

print(type(img))

例えば、以下のような結果になります。

<class 'numpy.ndarray'>

つまり、以下のような関係になります。

OpenCV
  ↓
画像を読み込む
  ↓
NumPy配列
  ↓
NumPyで数値処理

OpenCVで画像を読み込み、その画像データをNumPyで加工するという使い方は、Pythonの画像処理でよく利用されます。

PillowとNumPyの関係

PillowとNumPyも組み合わせて使えます。

例えば、Pillowで読み込んだ画像をNumPy配列に変換できます。

from PIL import Image
import numpy as np

img = Image.open("sample.jpg")

array = np.array(img)

逆にNumPy配列をPillowの画像に戻すこともできます。

img = Image.fromarray(array)

この組み合わせを覚えておくと、画像処理の幅が大きく広がります。

Pillow・NumPy・OpenCVを組み合わせる

実際の画像処理では、3つを使い分けることがあります。

Pillow
↓
画像ファイルを読み込む

NumPy
↓
画像データを数値として加工

OpenCV
↓
画像を解析・認識

ただし、必ず3つすべてを使わなければならないわけではありません。

処理内容に応じて必要なライブラリだけを利用します。

画像処理初心者はどれから学ぶべき?

Python初心者の場合は、目的によって選ぶのがおすすめです。

画像加工をしたいならPillow

例えば、以下のような用途ならPillowがおすすめです。

  • 画像を小さくしたい
  • サムネイルを作りたい
  • 画像形式を変換したい
  • 画像を回転したい
  • 画像に文字を入れたい

学習コストも比較的低いため、Python初心者にも向いています。

画像データを計算したいならNumPy

例えば、以下のような場合はNumPyが重要になります。

  • RGB値を取得したい
  • ピクセルを計算したい
  • 画像を配列として扱いたい
  • 機械学習用に画像を加工したい

特にAI・機械学習を学ぶ場合、NumPyは重要な基礎ライブラリの一つです。

画像認識をしたいならOpenCV

例えば、以下のような用途ではOpenCVが候補になります。

  • 顔を検出したい
  • カメラ映像を処理したい
  • 動画を解析したい
  • エッジを検出したい
  • 物体を検出したい
  • 画像から特徴を抽出したい

画像処理ではどれを使えばいい?目的別早見表

やりたいこと おすすめ
画像を開く Pillow
画像を保存する Pillow
画像をリサイズする Pillow
サムネイルを作る Pillow
画像形式を変換する Pillow
ピクセルを計算する NumPy
配列として画像を扱う NumPy
機械学習用データを加工する NumPy
エッジ検出 OpenCV
顔検出 OpenCV
動画処理 OpenCV
カメラ映像処理 OpenCV
コンピュータビジョン OpenCV

OpenCVには「BGR」という特徴がある

OpenCVを使うときに、初心者が特に注意したいのが色の並び順です。

一般的な画像処理では、次のようにRGBとして色を扱います。

RGB

しかしOpenCVでは、基本的に次の順番で色を扱います。

BGR

つまり、以下の順番です。

  • B = 青
  • G = 緑
  • R = 赤

PillowやNumPyでRGB画像を扱っている感覚でOpenCVを使うと、色が正しく表示されないことがあります。

例えばOpenCVとPillowの間で画像を変換する場合には、次のように色空間を変換することがあります。

import cv2

img = cv2.imread("sample.jpg")

rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

AI・機械学習ではどれを使う?

AI・機械学習では、Pillow・NumPy・OpenCVのすべてが登場する可能性があります。

例えば画像分類AIを作る場合、次のような流れになることがあります。

画像ファイル
↓
Pillow / OpenCV
↓
画像読み込み
↓
NumPy
↓
配列・数値処理
↓
機械学習モデル

ただし、実際にはPyTorchやTensorFlowなどのフレームワークが画像データを扱うことも多いため、必ずこの構成になるわけではありません。

Pillow・NumPy・OpenCVは競合するものではない

「PillowとOpenCVのどちらを使うべきか」と考えがちですが、3つは完全な競合関係ではありません。

それぞれ得意分野が異なります。

Pillow
画像ファイル・画像加工
        ↓
NumPy
画像データ・数値計算
        ↓
OpenCV
画像解析・コンピュータビジョン

というイメージを持っておくと理解しやすくなります。

特にPythonで本格的な画像処理を行うなら、Pillow+NumPy+OpenCVを必要に応じて組み合わせるという考え方が重要です。

機械学習の手法の関連記事

同じテーマの記事をまとめています。あわせて読むと理解が早くなります。

まとめ:Pillow・NumPy・OpenCVの違い

Pillow・NumPy・OpenCVの違いを一言でまとめると、次のようになります。

  • Pillowは「画像を扱う」ためのライブラリ
  • NumPyは「画像を数字の配列として計算する」ためのライブラリ
  • OpenCVは「画像や動画を解析する」ためのライブラリ

Python初心者なら、まずPillowで画像の読み込み・リサイズ・保存などを学び、その後NumPyで画像を配列として扱う方法を学ぶと理解しやすくなります。

さらに顔検出や物体検出、動画解析などに進みたい場合はOpenCVを学ぶとよいでしょう。

覚え方

Pillow → 画像加工
NumPy  → 数値・配列処理
OpenCV → 画像認識・解析

この3つの役割を理解しておけば、Pythonの画像処理コードを読むときにも、それぞれのライブラリがなぜ使われているのか理解しやすくなります。


NumPy|画像処理の関連記事

NumPyを画像データの処理に使う方法の記事です。

NumPy全体の使い方は「NumPyの使い方」、「NumPy関数一覧」でまとめています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら