よちよちpython

独習 python/Qpython/Pydroid3/termux

【Pillow】画像処理いろいろテスト

今回も画像処理用モジュールPillowを使って色んな加工をやってみる。
あまりにいろいろ出来るので、手頃なものだけ。
参照
Pillow 公式

Pillowはインストールがいります。

pip install pillow



目次




作業環境


Androidスマホ
Pydroid3のJupiterNotebook(python3.7)



画像の読み込み


こちらの画像を使います。
福岡県の宮地嶽神社の馬像(石馬だと面白いのに…)

f:id:chayarokurokuro:20190914184041j:plain

from PIL import Image, ImageFilter

file_name = "DSC_0303.JPG"
im = Image.open(file_name)



フォーマットの取得


print(im.format)
JPEG



画像サイズの取得


(幅、高さ)

print(im.size)
(5504, 3096)



モード(メタ情報)の取得


print(im.mode)
RGB



白黒写真に変換


wb_im = im.convert('L')



画像の保存


save_name = "wb_" + file_name

wb_im.save(save_name)

f:id:chayarokurokuro:20190914205011j:plain



画像を回転させる


度で指定。画像の中心を軸に反時計回り。90度左回転させるには

rotate_im = im.rotate(90)

rotate_im.save("rotate_"+file_name)

f:id:chayarokurokuro:20190914184139j:plain


はみ出した部分の頭とお尻がカットされてしまいました。



全体を残しながら回転


画像中心に時計回りで45度回転させ、はみ出す部分も残すには

rotate_im2 = im.rotate(-45, expand=True)

rotate_im2.save("rotate_2_" + file_name)

f:id:chayarokurokuro:20190914184209j:plain



回転軸の位置を指定し回転


rotate_im3 = im.rotate(45, center=(0, 0),expand=True)

rotate_im3.save("rotate_3_" + file_name)

f:id:chayarokurokuro:20190914184256j:plain


はみ出した部分がカットされましたねぇ。なぜなんだ…
expand=Trueの場合はセンターの設定は無視され中心で回転、範囲が決定、そしてはみ出しもカット…らしい。



平行移動


0度回転で、右に半分ほど、上に3分の1ほど移動させてみる。
translate=(x方向の移動距離,y方向の移動距離)
x軸は右がプラス、yは下がプラス方向。

rotate_im4 = im.rotate(0, translate=(2500, -1000))

rotate_im4.save("rotate_4_" + file_name)

f:id:chayarokurokuro:20190914184322j:plain



平行移動でexpand=True


expand=Trueの場合、translateの値は考慮されず、平行移動がない状態で回転したとみなして範囲が決定する。

rotate_im5 = im.rotate(45, translate=(1000, 500), expand=True)

rotate_im5.save("rotate_5_" + file_name)

f:id:chayarokurokuro:20190914184340j:plain


はみ出しはカットされる。



上下反転


180度回転ではなく、上下で裏表にする形。

from PIL import Image, ImageOps

flip_im = ImageOps.flip(im)

flip_im.save("flip_" + file_name)

f:id:chayarokurokuro:20190914184409j:plain



左右反転


これも左右で裏表、鏡に写ったときの形。

from PIL import Image, ImageOps

im_mirror = ImageOps.mirror(im)
im_mirror.save("im_mirror_" + file_name)

f:id:chayarokurokuro:20190914184439j:plain


左右が反転しただけだが、写真を写したときの情景を思い浮かべながらこの画像を見ると別世界のよう。



ネガとポジを反転


nega_posi = ImageOps.invert(im)

nega_posi.save("nega_posi_" + file_name)

f:id:chayarokurokuro:20190914184500j:plain



画像を明るくする


2倍明るくする。

light_im = im.point(lambda x: x * 2.0)    
   
light_im.save("light_" + file_name)

f:id:chayarokurokuro:20190914184518j:plain



画像を暗くする


半分の明るさににする。

half_light = im.point(lambda x: x * 0.5)

half_light.save("half_light_" + file_name)

f:id:chayarokurokuro:20190914184547j:plain



モザイクをかける


# モザイク
mosaic = im.resize([x // 100 for x in im.size]).resize(im.size)

mosaic.save("mosaic_" + file_name)

f:id:chayarokurokuro:20190914184624j:plain



ガウシアンブラー


眼鏡の掛け忘れではありません。

gauss = im.filter(ImageFilter.GaussianBlur(50))

gauss.save("gauss_" + file_name)

f:id:chayarokurokuro:20190914184640j:plain



使われている色の数


im.getcolors(im.size[0] * im.size[1])

注意。実行すると色の数が大量に吐き出されます。



オフセット


from PIL import Image, ImageChops

offset_im = ImageChops.offset(im, 2500, 1500)

offset_im.save("offset_" + file_name)

f:id:chayarokurokuro:20190914184714j:plain



サイズと解像度の変更


カレントディレクトリ内のJPG拡張子の全ファイルを幅と高さを各々12分の1にし、解像度も下げる。
新規作成で加工したファイルは「resize_元のファイル名」でカレントディレクトリに保存する。

import glob
from PIL import Image

# カレントディレクトリ内JPGを全取得
file_name_lst = glob.glob("*.JPG")



# 各画像ファイルの処理と保存
for file_name in file_name_lst:

    im = Image.open(file_name)

    # サイズ変更後のファイル名
    resize_file = "resize_" + file_name
    
    # 処理と保存
    width, height = im.size
    img_resize_bilinear = im.resize((width, height), Image.BILINEAR)
    img_resize_bilinear = im.resize((int(im.width / 12), int(im.height / 12)))
    img_resize_bilinear.save(resize_file)
    
    



参考




↓ こちらはめちゃくちゃ充実している



複数画像の貼り合わせ



二枚の画像をおしゃれに合成できそう



サイズと解像度の変更