今シリーズは簡単なことはpythonでやってしまおう!!という精神の記事です。
今回は「python画像編集」シリーズその2
画像編集の基本である「合成」をやってみます!!
Pillow
Pillowを使っていきます。
この辺りは準備完了!という方は飛ばしてもらってもかまいません。
PillowとはPIL(Python Imaging Library)という画像ライブラリの後継です。
PILは開発が停止されましたが、Pillowは現在も開発が進められています。
インストール
まずPillowをインストールします。
pip install pillow
PillowとPILは共存出来ません。
両方インストールしてしまった場合は、まず両方ともアンインストールしてから片方だけをインストールしましょう。
画像の合成
今回は以下の二つの画像を合成していきたいと思います。
PillowからImageをインポートして、対象の画像を開いておきます。
from PIL import Image img_1 = Image.open('man.jpg')#人物写真 img_2 = Image.open("background.jpg")#背景写真
人物の写真のサイズが大きいのでリサイズします。
resize(width,height)という関数があります。
この関数を用いてアスペクト比を保ったまま横幅のみを任意の長さで指定し、リサイズする関数scale_to_width()を作成します。
def scale_to_width(img, width): # アスペクト比を固定して、幅が指定した値になるようリサイズする関数。 height = round(img.height * width / img.width)#横幅からアスペクト比をもとに高さを計算 return img.resize((width, height))#リサイズし、return
人物写真をリサイズし、背景写真の上に合成します。
bg.paste(image,(x_length,y_length))という関数を用います。
第一引数(image)は貼り付ける画像、
第二引数((x_length,y_length))は貼り付ける位置を指定します。
bgが貼り付けられる背景画像になります。
人物画像をリサイズし、実際に張り付けてみます。
img_resized = scale_to_width(img_1, 250)#先ほどの自作関数 img_2.paste(img_resized, (200, 200))#合成 img_2 = img_2.save('img_sync.jpg', quality=95)#保存
このように合成された画像が得られました。
画像の合成(マスキング)
実はpaste関数には第三引数がありマスク画像を指定することができます。
bg.paste(image,(x_length,y_length),mask)のように第三引数を増やしてあげればよいです。
マスク画像として使用できるのは、貼り付け画像と同じサイズでmodeが以下の三種類の場合です。
- 1: 1bit画像(二値画像)
- L: 8bitグレースケール画像
- RGBA: アルファチャンネルを持った画像
例えば、マスク画像が8bitグレースケール(mode=’L’)の場合、0(黒)ではベース画像(bg)が100%、255(白)では貼り付け画像(image)が100%、中間値では2つの画像が値に応じてブレンドされます。
分かりやすい例として画像を丸でマスクしてみます。
ImageDrawモジュールで黒地に白の円を描画しマスク画像を生成します。
from PIL import mageDraw#新たに追加 mask = Image.new("L", img_resized.size, 0)#img_resizedと同サイズでLモードの画像を生成 draw = ImageDraw.Draw(mask)#maskの描画変数 draw.ellipse((50, 50, 200, 200), fill=255)#円を描画(left,upper,right,lower)で示す長方形に内接する円になる mask.save('mask_circle.jpg', quality=95)
この画像の白い部分は貼り付け画像、黒い部分は背景画像が残ります。
ではマスキングして合成していきます。
img_2.paste(img_resized, (200, 200), mask)#第三引数に先ほどのmaskを追加 img_2 = img_2.save('img_sync_mask.jpg', quality=95)
マスク画像が合成されました。
画像の一体感を出すために円形をぼかしてあげます。
画像のぼかしにはImageFilterモジュールを使用します。
from PIL import ImageFilter#新たに追加 mask_blur = mask.filter(ImageFilter.GaussianBlur(10))#先ほどのmaskの周りをぼかす mask_blur.save('mask_circle_blur.jpg', quality=95)
境界線がぼやかされており、その部分は貼り付け画像と背景画像が混同されます。
このマスク画像を使って合成します。
img_2.paste(img_resized, (200, 200), mask_blur) img_2 = img_2.save('img_sync_mask.jpg', quality=95)
これで一通りの画像の合成方法を学んできました。
まだまだ、ペイントなどの写真編集ソフトで簡単にできることですが、
内部では、プログラミング言語が動かしていることを知ってもらえれば
勉強も楽しくなると思います!!
Pingback: 「それ、pythonでできるよ」-画像のリサイズ-