note.nkmk.me

Pythonでの画像処理、Pillow, NumPy, OpenCVの違いと使い分け

Date: 2018-01-12 / Modified: 2018-02-08 / tags: Python, 画像処理, Pillow, NumPy, OpenCV

Pythonで画像処理を行う場合、PillowやNumPy、OpenCVなど様々なライブラリが利用できる。

PythonのOpenCVは画像をNumPyの配列ndarrayとして扱っており、「OpenCVでの画像処理」といって紹介されているものも、OpenCVの関数は使っておらずNumPy配列ndarrayの操作だけで完結していることが多い。

そのような場合、OpenCVをインストールしなくても、Pillow + NumPyで画像をndarrayとして読み込むことで同様の処理が可能。もちろんOpenCVを使ってもいいが、OpenCVの環境構築はまだまだ面倒なことも多いので、Pillow + NumPyのほうがお手軽。

また、そもそもPillowのみで事足りる場合も多々ある。

ここでは、Pillow, NumPy, OpenCVの基本的な違いと使い分けについて説明したあと、

  • Pillow(PIL)による画像処理
  • NumPyによる画像処理
  • OpenCVによる画像処理

について、それぞれできることの例を示す。

スポンサーリンク

Pillow, NumPy, OpenCVの基本的な違いと使い分け

Pillow, NumPy, OpenCVのそれぞれの位置づけは

  • Pillow(PIL): 画像処理ライブラリ
  • NumPy: 数値計算ライブラリ
  • OpenCV: コンピュータビジョンライブラリ

なので、得意分野・守備範囲に違いがある。

基本的には以下のように使い分けられる。

  • Pillow(PIL)
    • リサイズやトリミングなどの基本的な処理を行いたい場合
  • NumPy ( + Pillow or OpenCV)
    • 画素値ごとに算術演算などの処理を行いたい場合
      • 画像をNumPyの配列ndarrayとして読み込んで計算・操作する
      • NumPy単体で画像ファイルを読み込むことはできないので、PillowやOpenCVなどを併用する
  • OpenCV
    • ndarrayの処理に加えて、顔認識などコンピュータビジョン系の処理を行いたい場合

Pillow(PIL)による画像処理

リサイズやトリミング、回転、反転など基本的な処理はPillowだけでOK。

インストールや基本的な使い方などは以下の記事参照。

リサイズやトリミングなどについて説明した個別記事は以下から。

Pillow(PIL)を使った画像処理の例をいくつか挙げる。

画像に別の画像を貼り付ける

背景となる画像に別の画像を貼り付ける。

矩形のまま貼り付けるのはもちろん、マスク画像を使って円形に切り抜いて貼り付けたりもできる。

Pillow Image.paste 結果画像 円形マスク ぼかし

2枚の画像を合成する

2枚の同じサイズの画像を合成する。

上の貼り付けの例のようにマスク画像に従って任意の図形に切り抜いて合成したり、グラデーション画像をマスクとして徐々に変化するように合成することもできる。

Python Pillow composite gradation

複数の画像を連結(結合)する

複数枚の画像を縦や横に並べて連結画像を作成する。

python pillow concat tile resize

透過png画像を作成

アルファチャンネルを持つ透過png画像を生成する。

上の例と同じく、任意の形にマスクすることができる。

Python Pillow putalpha circle

ネガポジ反転(画素値を逆転)

画素値を逆転して、ネガポジ反転した画像を生成する。

pillow invert lena

円形や正方形のサムネイル画像を作成

大きい画像から小さいサムネイル画像を作成するのも簡単。

中央を切り抜いたり、余白を付け加えて任意のサイズにしたり、円形にしたり、色々できる。複数の画像を一括で処理することも可能。

Pillow thumbnail max square Pillow thumbnail expand square Pillow thumbnail circle transparent

図形描画

長方形や円、線分など、様々な図形を描画できる。既存の画像の上に描画することも可能。

Pillow ImageDraw

アニメーションgifを作成

jpgやpngはもちろん、アニメーションするgif画像を作成することもできる。

pillow gif

NumPyによる画像処理

画像をNumPy配列ndarrayとして読み込むと、NumPyの機能を使って様々な画像処理を行うことができる。特に各画素値に対して算術演算を行う処理が簡単に書ける。

Pillowを使って画像ファイルをNumPy配列ndarrayとして読み込む方法や、NumPy配列ndarrayを画像ファイルとして保存する方法についての詳細は、以下の記事を参照。

OpenCVを使った画像の読み込み・保存は以下の記事を参照。

NumPyを使った画像処理の例をいくつか示す。

単色化

NumPyでは配列の値を一括で変更できるので、例えばある色の画素値を0にしてしまうことで単色化が可能。

NumPy画像処理 単色化

ネガポジ反転(画素値の反転)

画素値を逆転して、ネガポジ反転した画像を生成する。

Python NumPy inverse

減色処理

画素値を飛び飛びの値にして色数を減らす。

Python NumPy decrease color

二値化処理

しきい値に応じて白黒に二値化する。

Python NumPy OpenCV binarization

ガンマ補正

累乗もできるのでガンマ補正も簡単。

Python NumPy gamma

グラデーション画像生成

既存の画像に対する処理だけでなく、等間隔で増加または減少する配列を生成する関数を使ってグラデーション画像を生成したりすることもできる。

NumPyで生成したグラデーション画像 カラー

OpenCVでの画像処理

画像から何かを認識したり検出したりする場合はOpenCVを使う。豊富な機能がある。

顔検出(顔認識)

顔や瞳を検出する。

Python OpenCV 顔検出

モザイク処理

画像の全面または一部にモザイクをかける。顔検出と組み合わせて顔部分にモザイクをかけたりすることもできる。

Python OpenCV mosaic 2

Python OpenCV mosaic face

図形描画

Pillowと同じく、長方形や円、線分など、様々な図形を描画できる。

上の顔認識の例のように、検出した位置を図示する際などに便利。

OpenCV draw function sample

複数の画像を連結(結合)する

複数枚の画像を縦や横に並べて連結画像を作成することができる。

処理前後の画像を比較したり、係数による変化を複数枚並べて比較したりするときに使う。

下は同じ画像を並べた例。

Python OpenCV concat tile

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事