[Python] Pillowによる画像処理(Imageオブジェクト)

Python モジュール 画像処理

Pillowはサードパーティ製の画像処理モジュールです。本記事では、Imageオブジェクトを使った画像の読み出しや保存、各種画像処理(クリッピング、リサイズそして回転など)の方法についてまとめます。

環境

    • OS: Ubuntu16.04LTS
    • Python 3.7.0
    • Pillow 5.3.0

公式リファレンス: https://pillow.readthedocs.io/en/5.3.x/index.html

インストール

Pillowは3rdパーティ製のモジュールです。自分の環境に無いときはインストールしましょう。公式リファレンスに記載の通りpipコマンドでできます。

$ pip install Pillow

Anaconda環境の場合は以下でインストール可能です。

$ conda install pillow

使い方

Pillowモジュールのインポート

PillowはPIL(Python Imaging Library)から派生して作られた経緯があり、PILとの互換性を保つため、慣例的に以下のように呼び出すそうです。

from PIL import Image

画像データの読み出し

open()メソッドを使います。画像ファイルまたはファイルオブジェクトを引数に設定します。戻りはImageオブジェクトです。

>>> img = Image.open('sample.jpg')

また、Imageオブジェクトは様々なプロパティを持っており、サイズやフォーマットを確認することができます。

# 画像サイズを横幅、縦幅のタプルで返す
>>> img.size
(640, 426)
# ファイル名を返す
>>> img.filename
'sample.jpg'
# 画像フォーマットを返す
>>> img.format
'JPEG'

読みだした画像データを表示

show()メソッドを使います。

>>> img.show()

ただ、公式リファレンスによると、このメソッドは非効率なのでデバック目的にしか使わないほうが良いよ、とのこと。

画像を保存する

保存ファイル名をsave()メソッドの引数に設定します。拡張子を変更することで、自動的にフォーマットを変換することもできます。これは便利そうですね。

# jpg画像を読み込み
>>> img = Image.open('sample.jpg')
# 読み込んだ画像がjpg形式であることを確認
>>> img.format
'JPEG'

# 拡張子をpngにして保存
>>> img.save('sample.png')
>>> img2 = Image.open('sample.png')
# 読み込んだ画像がpng形式に変換されています
>>> img2.format
'PNG'

また、ファイル名の他にオプション引数を記述すると、画質の調整など細かな設定ができますが、細かくなるのでここでは割愛します。詳細は公式リファレンス:Image file formatsをご参照ください。

新しいImageオブジェクトを生成

new()メソッドを使います。
まずは、Lime色の幅200px, 高さ150pxの矩形を表示してみます。

>>> img = Image.new('RGBA', (200, 150), 'lime')

第一引数はカラーモードを表しており、上記例で設定した”RGBA”の他に”RGB”や”CMYK”などいろいろ設定できます。

<カラーモードの例>

    • RGBA:赤(Red),緑(Green), 青(Blue)、α値(不透明度)

RGB: 0 – 255の値(8bitで表せる数値: 2^8)
α : 0 – 255の値(0:透明 ⇔ 255:不透明)

    • RGB: 赤(Red),緑(Green), 青(Blue)

上記のRGBのみで表したもの。

    • CMYK:シアン(Cyan)、マゼンタ(Magenta)、イエロー(Yellow)、キー・プレート(Key plate:黒)

それぞれ0 – 255の値

※この他のカラーコードは公式リファレンスをご参照ください。

第二引数は、描画する矩形の幅、高さを表します。

第三引数は、カラーを表します。デフォルトは黒です。RBGなら3つ、RGBAなら4つのの整数値を要素としたタプルを設定します。また、上記例のようにImageColorモジュールによって定義された文字列で表すこともできます。他にも例を示すと、、、

カラー:赤 RGBA値=(255, 0, 0, 255)の場合

>>> img = Image.new('RGBA', (200, 150), 'red')

カラー:紫 RGBA値=(128, 0, 128, 255)の場合

>>> img = Image.new('RGBA', (200, 150), 'purple')

画像の切り抜き

crop()メソッドを用います。切り取るエリアを座標で表して引数として渡します。

ここで、Pillowにで使われる座標系について簡単におさらいします。

  • 座標系: 画面左上が原点(0, 0)、x軸は画面横方向、y軸は画面縦方向
  • 座標の表し方:
    • 点 : (x, y)の2つタプル
    • 四角形: (左上のx, 左上のy, 右下のx, 右下のy)の4つのタプル

これらを踏まえ、上図のエリアを切り取るには、以下のように記述します。

>>> cropped_img = img.crop((250, 100, 400, 300))

塗りつぶした矩形だと面白くないので、具体的な例を以下に示します。

# 元画像をオープン
>>> img = Image.open('coffee.jpg')

# (40, 50)、(150, 130)で囲われたエリアを切り抜きます
>>> cropped_img = img.crop((40, 50, 150, 130))

 → 

画像のペースト

paste()メソッドを用います。第一引数にペーストしたい画像、第二引数にペーストする座標を設定します。
このメソッドは、元の画像(Imageオブジェクト)を直接変更します。元の画像を変更したくない場合はcopy()メソッドで画像を複製しておきます。

# 元画像をコピー
>>> copy_img = img.copy()
# コピーした画像に、上記で切り抜いた画像を(0, 0)の位置にペースト
>>> copy_img.paste(cropped_img, (0, 0))
>>> copy_img.show()

この他に、maskパラメータを使ってペーストする画像の境界線をぼやかすなどエフェクトを付けることも可能ですが、ここでは割愛します。

画像のリサイズ

resize()メソッドを用います。
以下は元画像の1/4のサイズにする場合の例です。

# 元画像
>>> img.size
(300, 200)
# 元画像のサイズ確認
>>> w, h = img.size

# リサイズ処理
>>> resized_img = img.resize((int(w/2), int(h/2)))
# リサイズ後のサイズ確認
>>> resized_img.size
(150, 100)

画像の回転

rotate()メソッドを使います。引数は、半時計回りの回転角度(degree)です。

90°回転の場合の例

>>> r90_img = img.rotate(90)

この設定だと、画像のサイズが変わらないまま回転してしまうので、画像がはみ出てしまっています。
元の画像全部が表示されるように回転させるには、オプション引数expand=Trueを設定します。

>>> r90_img = img.rotate(90, expand=True)

まとめ

PillowモジュールのImageオブジェクトを使った画像処理についてまとめました。

  • 画像データの呼び出し・保存
  • 画像のクリッピング、ペースト、回転といった基本的な操作

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project