画像処理用ライブラリ(Matplotlib、CV2、Pillow)
人工知能(AI)開発でディープラーニングを扱う場合、画像処理は花形です。AIが人と同じように画像を認識して分類します。しかし、どんな画像でもよいわけではなく、AIが認識しやすいように加工など前処理が必要です。Pythonプログラムから画像を表示する方法を説明します。また、自前で用意した画像ファイルとAIのチュートリアルでよく利用されるMNISTデータを比較しながら、両者が同様に利用できることを見ていきます。画像処理用ライブラリとしてMatplotlib、CV2(OpenCV)、Pillow(PIL)の3つを紹介します。
機械学習ライブラリ(入門編)
Pythonプログラム気分を味わえます
目次
準備
画像の準備
◆カレントディレクトリにデータを準備します。
- 画像データ:「lion.jpg」(任意の画像ファイル)
import glob
sample_image = './lion.jpg' #任意のファイル名に書き換え
glob.glob(sample_image)
['./lion.jpg']
--
カレントディレクトリに画像ファイルを準備しました。
実行環境がGoogle Colaboratoryの場合でも画像表示可能です。こちらのページでGoogle ColaboratoryプリインストールされているMNISTを表示するサンプルコードを記載していますので、参考にしてください。
MNISTデータの準備
◆「data」に読み込みます。
※
『AI学習用データセットのいろいろな入手方法』
を参考にしています
#sklearnを使った例
from sklearn import datasets
data = datasets.fetch_openml('mnist_784').data #ダウンロードに少し時間がかかる
data.shape
(70000, 784)
--
データの読み込みが完了しました。
画像表示
ファイルから
◆JPEG画像を読み込んで表示します。
import matplotlib.pyplot as plt
from matplotlib.image import imread
im = imread(sample_image)
plt.imshow(im)
plt.show()
print('shape:'+str(im.shape))
print('type:'+str(type(im)))
(画像表示)
(3456, 4608, 3)
type:<class 'numpy.ndarray'>
--
画像読み込みモジュールを使って、Matplotlibが表示できるデータにします。
ここでは、matplotlib.imageのimreadを使います。
画像読み込みモジュール(上記ではimread)は「Pillow」「cv2」に同様のものがありますが、それぞれ仕様が異なっていて、取り扱い方に違いがあります。
データから
◆MNISTデータを表示します。
import matplotlib.pyplot as plt
im = data[0].reshape(28,28,1)
plt.imshow(im, cmap="gray")
plt.show()
print('shape:'+str(im.shape))
print('type:'+str(type(im)))
(画像表示)
shape:(28, 28, 1)
type:<class 'numpy.ndarray'>
--
ファイルから読み込んだデータと比較すると3次元目が「1」になっています。
これはMNISTデータが2カラー(白黒)のためです。
※2行目reshape(28,28,1)はreshape(28,28)でも同様の表示結果
3行目cmap="gray"で2色カラーを白黒に表示設定
画像加工
Pillow(PIL)
◆様々な加工がありますが、切り抜き(crop)を試します。
from PIL import Image
import matplotlib.pyplot as plt
im = Image.open(sample_image)
crop_pos = (2400, 900, 3200, 1700)
im_crop = im.crop(crop_pos)
plt.imshow(im_crop)
plt.show()
print('元データのサイズ:' + str(im.size))
print('切り抜き後のサイズ:' + str(im_crop.size))
print('「crop_pos」のtype:' + str(type(crop_pos)))
(画像表示)
元データのサイズ:(4608, 3456)
切り抜き後のサイズ:(800, 800)
「crop_pos」のtype:<class 'tuple'>
--
サイズは(横,縦)表示。
im.cropの引数はタプル(またはリスト)で指定します。
「()」の数に注意します。
×:im_crop = im.crop(2400, 900, 3200, 1700)
〇:im_crop = im.crop((2400, 900, 3200, 1700))
切り抜き位置の指定は(x_from, y_from, x_to, y_to) の順です。
◆切り抜いたサイズを確認します。
print(imgp_crop.size)
(800, 800)
--
小さくなっていることが確認できます。
(4608, 3456)→(800, 800)
cv2(OpenCV)
◆様々な加工ができますが、矩形とテキスト描画します。
import cv2
import matplotlib.pyplot as plt
im = cv2.imread(sample_image)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) #BGRをRGBに変換
im = cv2.rectangle( #バウンディングボックスの描写
im,
(3200,2900), #終了点
(1500,900), #開始点
[0,255,0], #線のカラー
30 #線の太さ
)
im = cv2.putText(
im,
'LION',
(1500,800), #開始位置
cv2.FONT_HERSHEY_SIMPLEX, #フォント
10, #フォントサイズ
[255,255,0], #フォントカラー
30, #フォント太さ
cv2.LINE_AA #なめらか
)
plt.imshow(im)
plt.show()
(画像表示)
--
『物体検出(YOLO)』
のバウンディングボックスのようなイメージになりました。
以上




