画像ファイルからデータを読み込む方法です。
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]に変更してモデルを使用します。

