【Python入門】画像の読み込み(Pillow、Scikit-image、OpenCV)

read-image numpy

画像ファイルからデータを読み込む方法です。

Pythonで画像処理するとき、目的によって画像処理ライブラリを選択して利用します。

画像処理ライブラリの特徴

画像処理ライブラリの特徴は、
・Pillowは、画像の回転、反転、リサイズ(拡大・縮小)のような画像処理
・scikit-imageは、numpy配列の操作での画像処理
・OpenCVは、画像認識、文字認識などコンピュータビジョン
のように守備範囲が違っています。

Pythonで画像処理に利用する主なライブラリをまとめます。

ライブラリ名主な目的
PIL(Python Imaging Library)Python 3のサポートがされていない。
2011年から開発が停止しているが、後継プロジェクトのPillowでPython 3がサポートされている。
Pillow画像アーカイブ、画像表示、画像処理
scikit-image科学的な画像分析
OpenCV画像処理、構造解析、モーション解析と物体追跡、パターン認識

Python3環境では、 PILライブラリを使うことはなく、 Pillowライブラリを使用することになりますが、注意点があります。

Pillowモジュールを使用するときは、PILから慣例として呼び出します。

# Pillowモジュールのインポート
# 正しい
from PIL import Image
# 誤り
from Pillow import Image 

画像を読み込む書式を見てみましょう。

画像の読み込み

Pillow(Image.open)

# Pillow
from PIL import Image 
img = Image.open('test.jpg')
img.show() 

jupyter notebookで、Pillowを用いて画像を表示すると、OS標準の画像ビューアが開きます。

インライン表示させるときは、Matplotlibを利用します。
Matplotlibの画像表示は、読み込んだ画像をnumpyの配列(ndarray)に変換してから行います。

from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np

img = Image.open('test.jpg')
plt.imshow(np.array(img))

これで、画像がインライン表示されました。
Matplotlibを利用すると、タイトルを付けたり、複数の画像を並べて表示することができます。

もっと簡単な表示方法は、 jupyter notebookであれば、 imgを実行することです。
Pillowで読み込んだデータimgは、’JpegImageFile’ というオブジェクトです。
画像の形式ですので、実行することでインライン表示されます。

# 画像imgの表示
img

scikit-image(io.imread)

# Scikit-image
from skimage import io
%matplotlib inline

img = io.imread('test.jpg')
io.imshow(img)  

scikit-imageを利用して画像を表示すると、 Matplotlibを利用してインライン表示されます。

scikit-imageで読み込んだデータimgは、 numpyの配列(ndarray) です。
データimgのままで、Matplotlibでも画像表示できます。

# Matplotlibで表示
import matplotlib.pyplot as plt 
plt.imshow(img) 

OpenCV(cv2.imread)

# OpenCV
import cv2
img = cv2.imread('test.jpg')
cv2.imshow('test.jpg', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

jupyter notebookで、OpenCVを利用して画像を表示すると、OS標準の画像ビューアが開きます。

インライン表示させるときは、Matplotlibを利用します。
OpenCVで読み込んだデータimgは、 numpyの配列(ndarray) ですが、色の順序が scikit-image と違います。
・OpenCVは、[B, G, R]
・scikit-imageは、[R, G, B]

Matplotlibの画像表示は、OpenCVで色の順序を[R, G, B]に変換してから行います。

# OpenCV 
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread('/Users/user/Desktop/RGB-sample.jpg')
img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
plt.imshow(img)

まとめ

  • 画像処理ライブラリは、画像ファイルからデータを読み込む機能をもっています
  • 画像処理ライブラリごとに、読み込んだデータの形式や色の順序が違います
ライブラリ名読み込んだデータの形式色の順序
Pillow画像のオブジェクト[R, G, B]
scikit-imagenumpyの配列(ndarray)[R, G, B]
OpenCVnumpyの配列(ndarray) [B, G, R]

機械学習のように、画像を数値として処理したいときはscikit-imageが便利です。

scikit-imageは、numpy配列をネイティブに扱って画像処理を行いますので、機械学習の前処理に相性がよいです。

余談

深層学習(ディープラーニング)では、学習済みモデルを活用する方法があります。

VGG16という学習済モデルは、色(カラーチャネル)の順序を[B, G, R]で事前学習しています。
Pillowやscikit-imageで読み込んだデータは、色の順序を[R, G, B]から[B, G, R]に変更してモデルを使用します。

タイトルとURLをコピーしました