コードDE描画

プログラミングで図を描く練習

【pythonista3】Pillowモジュールで画像を合成する(モノクロ)メソッドの使用例8選

pythonスクリプトでjpgやpmgなどの画像を加工、作成することが出来る。

簡単な画像処理にPillowモジュールが使われる。このモジュールは、読み込んだ画像をもとに新たな画像の作成、保存が出来る。

iOSアプリのpythonista3には標準でこのモジュールがあるがver1.1.7と古い。(2020年5月現在。)

pythonista3内でPillowモジュールが出来ることを紹介する。

Pillowモジュールには、次の2つの型でモノクロ画像を扱える。

  • L型:256色の白から黒までの色を使ったモノクロ画像(灰色あり)
  • 1型:白と黒の2色のみを使った白黒画像(灰色なし)

主に画像を合成する時のマスク画像に使われる。

以下では、次の4つの操作を説明する。

  • モノクロ化
  • グレースケール調整
  • モノクロに色をつける
  • 論理演算

使用環境

使っているアプリの都合上、Pillowモジュールが古い。そのため関数の引数など現在の仕様が若干異なる場合がある。

Pythonista3では最初からPillowモジュールが入っているためインストールは必要がない。

使い方

お借りした画像のリソース

以下では次の画像を使う。

sample.jpg
sample.jpg

上の画像をsample.jpgとする。

pillow-line-2.png
pillow-line-2.png

上の画像をpillow-line-2.pngとする。

以下のマスク画像を使う。

mask.png
mask.png

この画像をmask.pngとする。

モノクロにする

例1

カラーの画像をモノクロにする。

  • 実行結果

白黒にした画像
白黒にした画像

from PIL import Image

# 画像読み込み
maskimg=Image.open('sample.jpg')
# グレースケール
mask=maskimg.convert('L')

# 画像を保存
mask.save('pillow-gray-1.png')
  • 解説

Imageオブジェクトのconvertメソッドで画像の形式を変える。 'RGB'型から'L'型に変えてモノクロにする。

結果=画像オブジェクト,convert('型')

モノクロをはっきりさせる

基準値よりも濃いか薄いかで分ける。

例2
  • 実行結果

グレースケールでビット演算
グレースケールでビット演算

from PIL import Image

# 画像読み込み
maskimg=Image.open('pillow-line-2.png')
# グレースケール
mask=maskimg.convert('L')
# ビットごとに処理
out=mask.point(lambda x: 0 if x < 51 else 255)

# 画像を保存
out.save('pillow-gray-2.png')
  • 解説

Imageオブジェクトのpointメソッドで画像の色をビット単位で編集出来る。式はラムダ式を使う。引数は整数で、カラーの場合は全てのRGB成分でラムダ式の演算が行われる。(例えばR成分のみの演算はできない。)

結果=画像オブジェクト,point(式)

モノクロ画像に色をつける。

例3

モノクロ画像の白と黒を指定した色に変換する。

  • 実行結果

グレースケールに色をつけた画像
グレースケールに色をつけた画像

from PIL import Image,ImageOps

# 画像読み込み
gray=Image.open('mask.png').convert('L')
# グレースケールに色をつける
out=ImageOps.colorize(gray, black=(0, 0, 255), white=(255, 255, 0))

# 画像を保存
out.save('pillow-gray-3.png')
  • 解説

ImageOpsオブジェクトのcolorizeメソッドで画像に色をつける。

結果=ImageOps.colorize(画像オブジェクト, black=R成分,G成分,B成分),white=(R成分,G成分,B成分))

引数whiteには白から置き換える色を、blackには黒から置き換える色を指定する。間のグレーはその濃さに応じて引数の色が混ぜられる。 色はRGB成分のタプルを渡す。

白と黒のみの画像

例4

モノクロ画像を完全な白と黒のみの画像にする。

  • 実行結果

白と黒のみの画像
白と黒のみの画像

from PIL import Image

# 画像読み込み
maskimg=Image.open('mask.png')
# グレースケール
mask=maskimg.convert('1')

# 画像を保存
mask.save('pillow-gray-4.png')
  • 解説

Imageオブジェクトのconvertメソッドで画像の形式を変える。 'RGB'型から'1'型に変えて白黒にする。

結果=画像オブジェクト,convert('型')

モノクロから完全な白黒の1型への変換は、グレーは適度に白と黒の点の集まりになる。 機械的な色の切り上げ切り捨てではない、

例5

モノクロ画像を濃さで白と黒を分け、その後'1'型にすることで、白と黒の境界をはっきり分ける。

  • 実行結果

白と黒のみの画像
白と黒のみの画像

from PIL import Image

# 画像読み込み
maskimg=Image.open('pillow-line-2.png')
# グレースケール
mask=maskimg.convert('L')
# ビットごとに処理
out=mask.point(lambda x: 0 if x < 51 else 255)

out=out.convert('1')
# 画像を保存
out.save('pillow-gray-5.png')

色の演算

'1'型の白と黒のみの画像は、黒を偽、白を真として論理演算出来る。

and演算

'1'型の2つの画像でand演算する。

例6
  • 実行結果

and演算した画像
and演算した画像

from PIL import Image,ImageChops

# 画像読み込み
img1=Image.open('pillow-gray-4.png')
img2=Image.open('pillow-gray-5.png')

# モードとサイズ確認
print('ing1',img1.mode,img1.size)
print('img2',img2.mode,img2.size)

# リサイズ
img3=img1.resize(img2.size)

# ビットごとにand演算
out=ImageChops.logical_and(img3,img2)

# 画像を保存
out.save('pillow-gray-6.png')
  • 解説

広辞苑第六版にand演算は次のように解説される。

アンド【AND】
(「…と…」の意)論理演算の一つ。複数の命題のすべてが真であるときのみ真となる。論理積。

ImageChopsオブジェクトのlogical_andメソッドでand演算する。

out=ImageChops.logical_and(img3,img2)

白同士の点は白になり。それ以外は黒になる。

  • 黒と黒→黒
  • 黒と白→黒
  • 白と黒→黒
  • 白と白→白
or演算
例7

'1'型の2つの画像でand演算する。

  • 実行結果

or演算した画像
or演算した画像

from PIL import Image,ImageChops

# 画像読み込み
img1=Image.open('pillow-gray-4.png')
img2=Image.open('pillow-gray-5.png')

# モードとサイズ確認
print('ing1',img1.mode,img1.size)
print('img2',img2.mode,img2.size)

# リサイズ
img3=img1.resize(img2.size)

# ビットごとにor演算
out=ImageChops.logical_or(img3,img2)

# 画像を保存
out.save('pillow-gray-7.png')
  • 解説

広辞苑第六版にor演算は次のように解説される。

オア【OR】
(「…または…」の意)論理演算の一つ。複数の命題のうち一つでも真であるときに真となる。論理和。

ImageChopsオブジェクトのlogical_orメソッドでor演算する。

out=ImageChops.logical_or(img3,img2)

黒同士の点は黒になり。それ以外は白になる。

  • 黒と黒→黒
  • 黒と白→白
  • 白と黒→白
  • 白と白→白
xor演算
例8

'1'型の2つの画像でxor演算する。

  • 実行結果

xor演算した画像
xor演算した画像

from PIL import Image,ImageChops

# 画像読み込み
img1=Image.open('pillow-gray-4.png')
img2=Image.open('pillow-gray-5.png')

# モードとサイズ確認
print('ing1',img1.mode,img1.size)
print('img2',img2.mode,img2.size)

# リサイズ
img3=img1.resize(img2.size)

# ビットごとにxor演算
out=ImageChops.logical_xor(img3,img2)

# 画像を保存
out.save('pillow-gray-8.png')
  • 解説

広辞苑第六版にxor演算は次のように解説される。

エクスクルーシブ‐オア【Exclusive OR】
論理演算の一つ。二つの命題AとBのどちらか一方のみが真であるときだけ真となる。排他的論理和。XOR

ImageChopsオブジェクトのlogical_xorメソッドでxor演算する。

out=ImageChops.logical_xor(img3,img2)

同じ色同士の点は黒になり。それ以外は白になる。

  • 黒と黒→黒
  • 黒と白→白
  • 白と黒→白
  • 白と白→黒

まとめ

ImageimageOps,ImageChopsオブジェクトを使って、モノクロ画像を扱える。

  • Imageオブジェクト
    • convertメソッド:カラー、モノクロ、白黒の変換
    • pointメソッド:色の濃さを編集
  • ImageOpsオブジェクト
    • colorizeメソッド:モノクロに色をつける
  • ImageChopsオブジェクト
    • logical_andメソッド:and演算
    • logical_orメソッド:or演算
    • logical_xorメソッド:xor演算

参考リンク