【pythonista3】Pillowモジュールで画像を合成する(モノクロ)メソッドの使用例8選
pythonスクリプトでjpgやpmgなどの画像を加工、作成することが出来る。
簡単な画像処理にPillowモジュールが使われる。このモジュールは、読み込んだ画像をもとに新たな画像の作成、保存が出来る。
iOSアプリのpythonista3には標準でこのモジュールがあるがver1.1.7と古い。(2020年5月現在。)
pythonista3内でPillowモジュールが出来ることを紹介する。
Pillowモジュールには、次の2つの型でモノクロ画像を扱える。
L
型:256色の白から黒までの色を使ったモノクロ画像(灰色あり)1
型:白と黒の2色のみを使った白黒画像(灰色なし)
主に画像を合成する時のマスク画像に使われる。
以下では、次の4つの操作を説明する。
- モノクロ化
- グレースケール調整
- モノクロに色をつける
- 論理演算
使用環境
- ハード: iPad第6世代
- OS: iOS13.4.1 (17E262)
- 開発環境:pythonista3 app
- python ver 3.6.1
- モジュール Pillow ver 1.1.7
使っているアプリの都合上、Pillowモジュールが古い。そのため関数の引数など現在の仕様が若干異なる場合がある。
Pythonista3では最初からPillowモジュールが入っているためインストールは必要がない。
使い方
お借りした画像のリソース
以下では次の画像を使う。
上の画像をsample.jpg
とする。
上の画像をpillow-line-2.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
- 実行結果
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
演算する。
- 実行結果
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
演算する。
- 実行結果
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)
同じ色同士の点は黒になり。それ以外は白になる。
- 黒と黒→黒
- 黒と白→白
- 白と黒→白
- 白と白→黒
まとめ
Image
やimageOps
,ImageChops
オブジェクトを使って、モノクロ画像を扱える。
Image
オブジェクトconvert
メソッド:カラー、モノクロ、白黒の変換point
メソッド:色の濃さを編集
ImageOps
オブジェクトcolorize
メソッド:モノクロに色をつける
ImageChops
オブジェクトlogical_and
メソッド:and演算logical_or
メソッド:or演算logical_xor
メソッド:xor演算