Pythonの画像処理ライブラリpillowの使い方をわかりやすく解説!

今回は、機械学習でも使われることが多いPythonの画像処理ライブラリpillowを紹介しましょう。

  • PILとpillowのどちらを使ったらいい?
  • OpenCVとの役割の違いは?
  • pillowはPython 2では使えないの?
  • pillowのインストール方法は?

PIL(Python Imaging Library)とかpillowとか同じようなライブラリがありますので、このような疑問が浮かぶと思います。この記事では、Pythonで画像処理を行うことになったあなたのために、上のような疑問に答えます。

それでは、行ってみましょう!

PILとは

引用元:Python Imaging Library (PIL) http://www.pythonware.com/products/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 http://python-pillow.org/

上の画像は、pillowのホームページです。ホームページにも書いてあるとおり、pillowはPILの後継として開発が始められました。また、ホームページのデザインからもバシバシ伝わってきますが、今まさに開発が進められている画像処理ライブラリです。

最新版は、2018/4/3にリリースされたpillow 5.1.0です。ホームページに「View on GitHub」と表示されていることから、GitHubで開発が進められていることもわかりますね。

また、ドキュメント(英語)もしっかりしています。

ここまででもpillow一択という気もしますが、最近話題の機械学習でも、pillowを使って画像を読み込むサンプルコードがあります。侍エンジニア塾ブログでは、以下の2つの記事で紹介したコードがpillowを使っていました。


【TensorFlow】WindowsでObject Detection APIを試そう
更新日 : 2018年8月21日

PILでもpillowでもありませんが、より高度なことを実現するためのOpenCVという画像処理ライブラリもありますね。OpenCVについては、以下の記事で紹介していますので、気になった方はぜひご覧ください!

Pythonで画像処理をするならOpenCVがオススメ!
更新日 : 2019年7月31日

PILとpillowのどちらをインストールするか

ここまででPILとpillowを比較してきましたが、改めて表でまとめておきましょう。

項目PILpillow
安定バージョンの最新リリース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.7Python 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のインストールについては、以下の記事をご覧ください。

Linux Mint Cinnamonエディションを使ってみよう
更新日 : 2020年6月24日

そして、Anacondaのインストールは、以下のいずれかの記事をご覧ください。


【初心者必見!】AnacondaでPythonの環境を構築してみよう!(Mac編)
更新日 : 2019年5月22日

(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でどのように画像を扱うのか、確認しましょう。扱う画像はコチラ。

画像:shutter stock

ファイル名は、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を使って画像を読み込むことがあります。

イザというときに慌てないように、ここで紹介したような基本的な画像操作は、一度経験しておくと良いでしょう。

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

侍テック編集部

侍テック編集部