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だけで問題ありません。 インストールや基本的な使い方などは以下の記事参照。

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

Pillow(PIL)を使った画像処理の例をいくつか挙げる。 画像に別の画像を貼り付ける 背景となる画像に別の画像を貼り付ける。 矩形のまま貼り付けるのはもちろん、マスク画像を使って円形に切り抜いて貼り付けたりもできます。

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

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

透過png画像を作成 アルファチャンネルを持つ透過png画像を生成します。 上の例と同じく、任意の形にマスクすることができます。

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

円形や正方形のサムネイル画像を作成 大きい画像から小さいサムネイル画像を作成するのも簡単。 中央を切り抜いたり、余白を付け加えて任意のサイズにしたり、円形にしたり、色々できます。複数の画像を一括で処理することもできます。

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

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

NumPyによる画像処理

画像をNumPy配列ndarrayとして読み込むと、NumPyの機能を使って様々な画像処理を行うことができます。特に各画素値に対して算術演算を行う処理が簡単に書けます。 Pillowを使って画像ファイルをNumPy配列ndarrayとして読み込む方法や、NumPy配列ndarrayを画像ファイルとして保存する方法についての詳細は、

OpenCVを使った画像の読み込み・保存は

NumPyを使った画像処理の例をいくつか示す。 単色化 NumPyでは配列の値を一括で変更できるので、例えばある色の画素値を0にしてしまうことで単色化ができます。

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

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

二値化処理 しきい値に応じて白黒に二値化します。

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

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

OpenCVでの画像処理

画像から何かを認識したり検出したりする場合はOpenCVを使います。豊富な機能があります。 顔検出(顔認識) 顔や瞳を検出します。

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

Pillowと同じく、長方形や円、線分など、様々な図形を描画できます。 上の顔認識の例のように、検出した位置を図示する際などに便利です。

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

処理前後の画像を比較したり、係数による変化を複数枚並べて比較したりするときに使います。 下は同じ画像を並べた例を示します。

Last Updated: 6/26/2019, 10:34:03 PM