【Pillow】画像処理いろいろテスト
今回も画像処理用モジュールPillowを使って色んな加工をやってみる。
あまりにいろいろ出来るので、手頃なものだけ。
参照
Pillow 公式
Pillowはインストールがいります。
pip install pillow
目次
- 目次
- 作業環境
- 画像の読み込み
- フォーマットの取得
- 画像サイズの取得
- モード(メタ情報)の取得
- 白黒写真に変換
- 画像の保存
- 画像を回転させる
- 全体を残しながら回転
- 回転軸の位置を指定し回転
- 平行移動
- 上下反転
- 左右反転
- ネガとポジを反転
- 画像を明るくする
- 画像を暗くする
- モザイクをかける
- ガウシアンブラー
- 使われている色の数
- オフセット
- サイズと解像度の変更
- 参考
作業環境
Androidスマホ
Pydroid3のJupiterNotebook(python3.7)
画像の読み込み
こちらの画像を使います。
福岡県の宮地嶽神社の馬像(石馬だと面白いのに…)
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)
画像を回転させる
度で指定。画像の中心を軸に反時計回り。90度左回転させるには
rotate_im = im.rotate(90) rotate_im.save("rotate_"+file_name)
はみ出した部分の頭とお尻がカットされてしまいました。
全体を残しながら回転
画像中心に時計回りで45度回転させ、はみ出す部分も残すには
rotate_im2 = im.rotate(-45, expand=True) rotate_im2.save("rotate_2_" + file_name)
回転軸の位置を指定し回転
rotate_im3 = im.rotate(45, center=(0, 0),expand=True) rotate_im3.save("rotate_3_" + file_name)
はみ出した部分がカットされましたねぇ。なぜなんだ…
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)
平行移動でexpand=True
expand=Trueの場合、translateの値は考慮されず、平行移動がない状態で回転したとみなして範囲が決定する。
rotate_im5 = im.rotate(45, translate=(1000, 500), expand=True) rotate_im5.save("rotate_5_" + file_name)
はみ出しはカットされる。
上下反転
180度回転ではなく、上下で裏表にする形。
from PIL import Image, ImageOps flip_im = ImageOps.flip(im) flip_im.save("flip_" + file_name)
左右反転
これも左右で裏表、鏡に写ったときの形。
from PIL import Image, ImageOps im_mirror = ImageOps.mirror(im) im_mirror.save("im_mirror_" + file_name)
左右が反転しただけだが、写真を写したときの情景を思い浮かべながらこの画像を見ると別世界のよう。
ネガとポジを反転
nega_posi = ImageOps.invert(im)
nega_posi.save("nega_posi_" + file_name)
画像を明るくする
2倍明るくする。
light_im = im.point(lambda x: x * 2.0) light_im.save("light_" + file_name)
画像を暗くする
半分の明るさににする。
half_light = im.point(lambda x: x * 0.5) half_light.save("half_light_" + file_name)
モザイクをかける
# モザイク mosaic = im.resize([x // 100 for x in im.size]).resize(im.size) mosaic.save("mosaic_" + file_name)
ガウシアンブラー
眼鏡の掛け忘れではありません。
gauss = im.filter(ImageFilter.GaussianBlur(50)) gauss.save("gauss_" + file_name)
使われている色の数
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)
サイズと解像度の変更
カレントディレクトリ内の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)
参考
↓ こちらはめちゃくちゃ充実している
複数画像の貼り合わせ
二枚の画像をおしゃれに合成できそう
サイズと解像度の変更