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