画像ファイルからデータを読み込む方法です。
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-image | numpyの配列(ndarray) | [R, G, B] |
OpenCV | numpyの配列(ndarray) | [B, G, R] |
機械学習のように、画像を数値として処理したいときはscikit-imageが便利です。
scikit-imageは、numpy配列をネイティブに扱って画像処理を行いますので、機械学習の前処理に相性がよいです。
余談
深層学習(ディープラーニング)では、学習済みモデルを活用する方法があります。
VGG16という学習済モデルは、色(カラーチャネル)の順序を[B, G, R]で事前学習しています。
Pillowやscikit-imageで読み込んだデータは、色の順序を[R, G, B]から[B, G, R]に変更してモデルを使用します。