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)
とりあえず、基本の基本はここまで。