OpenCVとPILの基本操作

Pythonでの画像操作に使うライブラリは、OpenCVとPILではないかと思います。
私はいつもOpenCVで読み込むことが多いですが、単純な読み書きの場合にPILも使うことがあります。

ファイル操作の方法について、OpenCVとPILで比較を行ってみました。
ちなみに、PILはPython Imaging Libraryの略だそうです。

インポート

OpenCVとPILのインポートは以下のコマンドでできます。
画像表示用にpyplotもインポートしておきます。

import cv2 # OpenCV
from PIL import Image # PIL
import matplotlib.pyplot as plt

ファイルの読み込み

OpenCV

・cv2.imread()
 画像を読み込みます。
 読み込んだ画像をmatplotで表示してみます。

img_cv = cv2.imread('img00001.jpg')
plt.imshow(img_cv)
plt.show()

なんだか色合いが変ですね。
それもそのはず、OpenCVはカラー画像をRGBではなくBRGの順に読み込んでいるのです。
OpenCVの機能だけで読み込み、書き込みをするのであればBGRのままで問題ないのですが、今回のようにOpenCV以外のライブラリを使う場合には、RGBの順に直してあげる必要があります。

・cv2.cvtColor()
 画像タイプを変換します。第2引数にcv2.COLOR_BGR2RGBを指定すればRGBの順序に変換されます。逆方向はcv2.COLOR_RGB2BGRです。

img_cv = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)

RGB変換処理を追加して、画像を表示してみます。

img_cv = cv2.imread('img00001.jpg')
img_cv = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)
plt.imshow(img_cv)
plt.show()

きれいな海が表示されました。


PIL

・Image.open()
 こっちはRGBの順番で読んでくれるので、そのまま表示できます。

img_pil = Image.open('img00001.jpg')
plt.imshow(img_pil)
plt.show()

おんなじ画像ですが……

データフォーマット


OpenCVとPILで読み込んだ画像に対して、何かしらの演算処理をしたいという場合、読み込んだときのフォーマットが異なりますので、注意が必要です。

【OpenCVでの読み込み】

img_cv = cv2.imread('img00001.jpg')
print(type(img_cv))

<class ‘numpy.ndarray’>

【PILでの読み込み】

img_pil = Image.open('img00001.jpg')
print(type(img_pil))

<class ‘PIL.JpegImagePlugin.JpegImageFile’>

OpenCVはnumpyのndarray形式ですが、PILのほうはPILの独自フォーマットになっていることがわかります。

どういうことかというと、PILで読み込んだままの状態だと、演算子による計算ができないとうことです。

img_pil += 1
img_cv += 1

この計算をすると、OpenCVで読み込んだほうはエラーなく処理が行われますが、PILのほうは下のようなエラーが返ってきます。

Traceback (most recent call last):
File “”, line 1, in
TypeError: unsupported operand type(s) for +=: ‘JpegImageFile’ and ‘int’

ですので、読み込んだデータをnumpy arrayに変換する処理が必要になります。

img_pil = np.array(img_pil)

ちなみに、numpy arrayをPIL形式に変換するには、Image.fromarray()を使えばOKです。

img_np = np.array(img)
print(type(img_np))
 >> <class 'numpy.ndarray'>
img_pil = Image.fromarray(img_np)
print(type(img_np))
 >> <class 'numpy.ndarray'>

書き込み

OpenCV

・cv2.imwrite()

out_cv_fname = 'output_cv.jpg'
cv2.imwrite(out_cv_fname, img_cv)

ちなみに、OpenCVの場合は出力もBGR並びが前提になっていますので、もしもRGBに並び替えたときは、cv2.cvtColor(img, cv2.COLOR_RGB2BGR)でBGR並びに変更しておく必要があります。

PIL

img.save()

out_fname = 'output_pil.jpg'
img_pil.save(out_fname)

とりあえず、基本の基本はここまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です