今回は、機械学習でも使われることが多いPythonの画像処理ライブラリpillowを紹介しましょう。
- PILとpillowのどちらを使ったらいい?
- OpenCVとの役割の違いは?
- pillowはPython 2では使えないの?
- pillowのインストール方法は?
PIL(Python Imaging Library)とかpillowとか同じようなライブラリがありますので、このような疑問が浮かぶと思います。この記事では、Pythonで画像処理を行うことになったあなたのために、上のような疑問に答えます。
それでは、行ってみましょう!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
PILとは
上の画像は、PIL(Python Imaging Library)のホームページです。ホームページが古めかしいデザインであることからも伝わってきますが、2011年を最後に開発が停止した画像処理ライブラリです。
最後の安定版は、さらに2年さかのぼって2009/11/15にリリースされたPIL 1.1.7です。PILの歴史についてはWikipediaが詳しいので、詳しく知りたい方はそちらをご覧ください。
参考:https://ja.wikipedia.org/wiki/Python_Imaging_Library
Pillowとは
上の画像は、pillowのホームページです。ホームページにも書いてあるとおり、pillowはPILの後継として開発が始められました。また、ホームページのデザインからもバシバシ伝わってきますが、今まさに開発が進められている画像処理ライブラリです。
最新版は、2018/4/3にリリースされたpillow 5.1.0です。ホームページに「View on GitHub」と表示されていることから、GitHubで開発が進められていることもわかりますね。
また、ドキュメント(英語)もしっかりしています。
ここまででもpillow一択という気もしますが、最近話題の機械学習でも、pillowを使って画像を読み込むサンプルコードがあります。侍エンジニアブログでは、以下の2つの記事で紹介したコードがpillowを使っていました。
PILでもpillowでもありませんが、より高度なことを実現するためのOpenCVという画像処理ライブラリもありますね。OpenCVについては、以下の記事で紹介していますので、気になった方はぜひご覧ください!
PILとpillowのどちらをインストールするか
ここまででPILとpillowを比較してきましたが、改めて表でまとめておきましょう。
項目 | PIL | pillow |
---|---|---|
安定バージョンの最新リリース | 2009/11/15(1.1.7) | 2018/4/3(5.1.0) |
対応Python環境 | Python 1.5.2、2.1、2.2、2.3、2.4、2.5、2.6、2.7 | Python 2.6、2.7、3.3、3.4、3.5、3.6、3.7 |
その他 | 2011年に開発中止 | ・PILの後継として開発開始 ・開発が継続されている ・機械学習でも使われている |
すでにPython 3を使わない理由もありませんので、Python 3.xにpillowをインストールすると良いでしょう。
pillowをインストールする
この記事では、以下の環境にpillowをインストールする操作を説明します。
- Linux Mint 18.3 Xfceエディション
- Anaconda環境(Python 3.6)
Linux Mintのインストールについては、以下の記事をご覧ください。
そして、Anacondaのインストールは、以下のいずれかの記事をご覧ください。
(1)Anaconda Navigatorを起動します。
(2)「Environment」をクリックし、「Create」をクリックします。
(3)「Name」欄に「pillow」と入力し、「Create」をクリックします。「Python」にチェックが付いていて、「3.6」が選択されていることも確認してください。
pillow環境が作成されます。
(4)「端末」を起動し、以下のコマンドを1行ずつ順番に入力します。
source activate pillow pip install pillow
以上で、Linux Mint+Anaconda(pillow環境)に、pillowがインストールされました。作業用のディレクトリも作っておきましょう。
(5)以下のコマンドを1行ずつ順番に入力します。
mkdir -p ~/python/pillow-demo/ cd -p ~/python/pillow-demo/
これで準備完了です!
画像を扱ってみよう
ここからは、ソースコードを紹介しながらpillowでどのように画像を扱うのか、確認しましょう。扱う画像はコチラ。
ファイル名は、shutterstock_450212698.jpg。pillowのサンプル画像ですから、迷わずに枕(pillow)を選びました。
画像モードを変換する(convert)
RGBカラーの画像の画像モードを変換するには、convert()を使います。
Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)
画像モードを変換するだけなら、mode(画像モード)を指定すればokです。
使用例:
from PIL import Image image = Image.open("shutterstock_450212698.jpg") image.convert("1").save("1_1-bit-pixels.png") image.convert("L").save("L_8-bit-grayscale.png") image.convert("P").save("P_8-bit-colors.png")
このコードを実行すると、以下のファイルが作成されます。
1_1-bit-pixels.png(1ビット白黒)
L_8-bit-grayscale.png(8ビット/256階調グレースケール)
P_8-bit-colors.png(8ビット/256階調カラー)
画像をトリミングする(crop)
画像をトリミングするには、crop()を使います。
Image.crop(box=None)
boxには、(左端のx座標, 上端のy座標, 右端のx座標, 下端のy座標)という形式のタプルを指定します。
使用例:
from PIL import Image image = Image.open("shutterstock_450212698.jpg") image.crop((457,173,674,390)).save("crop.png")
crop.png
crop()にはタプルを渡す必要がありますので、カッコが2重になっているのは間違いではありません。#ちなみに座標は、GIMPで調べました。
画像を回転する(rotate)
画像を回転するには、rotate()を使用します。
Image.rotate(angle, resample=0, expand=0)
引数の意味は以下のとおりです。
引数 | 説明 |
---|---|
angle | 角度 |
resample | リサンプリングの方式 |
expand | ・指定しない(またはFalesを指定する)と、画像の大きさは変化しない ・Trueを指定すると、回転に合わせて画像が大きくなる |
from PIL import Image image = Image.open("shutterstock_450212698.jpg") image.rotate(30).save("rotate_30.png") image.rotate(30, Image.NEAREST, True).save("rotate_30_expand.png") image.rotate(-30).save("rotate_-30.png")
rotate_30.png(30度回転、拡張なし)
拡張していないため画像の一部が欠けていますね。rotate_30_expand.png(30度回転、拡張あり)
拡張ありにすると、画像が欠けません。rotate_-30_expand.png(-30度回転、拡張あり)
負の数を指定すると逆向きに回転します。
画像を貼り付ける(paste)
画像を貼り付けるときは、paste()を使います。
Image.paste(im, box=None, mask=None)
imには、画像データを指定します。boxには、貼り付ける位置を(左のx座標, 上のy座標)の形式で指定します。
使用例:上でcrop()のコードを紹介しましたので、それを流用しました。
from PIL import Image image = Image.open("shutterstock_450212698.jpg") cropimage = image.crop((457,173,674,390)) image.paste(cropimage, (240,40)) image.save("paste.png")
paste.png
paste()は、rotate()などとは異なりimageを変更するため、貼り付けた画像を保存するにはimage.save()を実行します。
画像サイズを取得する(size)
最後に画像サイズを取得する方法です。様々な自動化に挑戦していると、画像サイズ(高さ, 幅)を知りたいことが意外に多いので紹介しておきます。
実は、Image.open()で画像を読み込んだときに、image.sizeに(高さ, 幅)のタプルが設定されています。したがって、改めて何かする必要はありません。
from PIL import Image image = Image.open("shutterstock_450212698.jpg") print("width: {}, height: {}".format(image.size[0], image.size[1]))
実行結果:
width: 700, height: 467
まとめ
この記事では、pillowとPIL(Python Imaging Library)を比較して、pillowを使うことをおすすめしました。また、pillowを使って基本的な画像操作に挑戦してみました。機械学習で画像を取り扱うときに、pillowを使って画像を読み込むことがあります。
イザというときに慌てないように、ここで紹介したような基本的な画像操作は、一度経験しておくと良いでしょう。