Tutorialに学ぶPillowの使い方④|Pythonによる可視化入門 #12

f:id:lib-arts:20191219181007p:plain

連載の経緯は#1をご確認ください。

#1〜#4まではMatplotlibに関して、#5〜#8まではseabornについてまとめました。

Matplotlibの使い方①(plt.plot、plt.scatter、plt.hist)|Pythonによる可視化入門 #1 - lib-arts’s diary

Tutorialに学ぶseabornの使い方①(概要&Visualizing statistical relationships)|Pythonによる可視化入門 #5 - lib-arts’s diary

#9からはPythonの描画ライブラリであるPillowについて取り扱っています。PillowはPIL(Python Imaging Library)のforkとされています。

#11ではチュートリアルより、"Color transforms"〜"Image sequences"の内容を取り扱いました。

Tutorialに学ぶPillowの使い方③|Pythonによる可視化入門 #11 - lib-arts’s diary

#11まででチュートリアルの内容は概ね取り扱えたので、#12ではImageDrawモジュールを用いた図形の描画について取り扱います。

ImageDraw Module — Pillow (PIL Fork) 6.2.1 documentation

以下、目次になります。
1. ImageDraw Module
2. まとめ

 

1. ImageDraw Module
1節では以下、ImageDrawモジュールについて確認していきます。

f:id:lib-arts:20191227225052p:plain

ImageDraw Module — Pillow (PIL Fork) 6.2.1 documentation

冒頭部の記述は、「ImageDrawライブラリはImageオブジェクトの2Dのグラフィックスを提供し、新しい画像を生成したり既存の画像を編集したりできる」とされています。説明だけだとイメージがわきにくいため、以下実装を元に確認していきます。

from PIL import Image, ImageDraw

im = Image.open("Python_logo.png")

draw = ImageDraw.Draw(im)
draw.line*1

im.show() 

上記の実行結果は下記のようになります。

f:id:lib-arts:20191227230905p:plain

画像の中心に半径10の円を描画しています。このようにImageDrawライブラリを用いることで図形の描画などを行うことができます。


2. まとめ
#12ではImageDrawモジュールを用いた図形の描画について取り扱いました。
Pillow関連の描画については一通り取り扱えたので、#13以降はNetworkXについて取り扱っていきます。

*1:0, 0, im.size[0], 0), fill=(0,0,0,255), width=5)
draw.line((0, 0, 0, im.size[1]), fill=(0,0,0,255), width=5)
draw.line((0, im.size[1], im.size[0], im.size[1]), fill=(0,0,0,255), width=5)
draw.line((im.size[0], 0, im.size[0], im.size[1]), fill=(0,0,0,255), width=5)

# write to stdout
im.show()

上記の実行結果は下記になります。

f:id:lib-arts:20191227225414p:plain

ImageDraw.Draw(im)でオブジェクトのdrawを作成し、lineメソッドを用いて描画を行なっています。

f:id:lib-arts:20191227225536p:plain

lineメソッドのドキュメントにおける説明は上記のようになっています。xyは始点の(x,y)の座標と終点の(x,y)を指定する形になっています。fillはlineメソッドで引く線の色、widthは線の幅を表すとされています。今回の例は画像の外枠を囲むような4つの線を引くような実装になっています。
次にellipseメソッドを用いて円を描画してみます。

from PIL import Image, ImageDraw

im = Image.open("Python_logo.png")

draw = ImageDraw.Draw(im)
x1 = im.size[0]/2-10
y1 = im.size[1]/2-10
x2 = im.size[0]/2+10
y2 = im.size[1]/2+10
draw.ellipse([(x1, y1),(x2, y2)], fill=(0,0,0,255