画像処理用ライブラリ(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']
--
カレントディレクトリに画像ファイルを準備しました。

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.imageimreadを使います。
Matplotlibでの画像表示
画像読み込みモジュール(上記では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色カラーを白黒に表示設定
データから画像を表示(MNISTデータ)
カラーと白黒の違いはあるものの、どちらも3次元ndarrayNumpy配列)になっていて、表示方法も同じです。つまり、ファイル、データを分け隔てなく利用できると言うことです。

画像加工

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))
PIL(Pillow)で画像の切り抜き

切り抜き位置の指定は(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)』
のバウンディングボックスのようなイメージになりました。
cv2(OpenCV)での矩形描画

『機械学習ライブラリ(入門編)』に戻る>>

以上