Matplotlibで画像の表示

概要

実践 コンピュータビジョンを読んで、出てきたサンプルコードを試したりいじったりする企画、その1-2。

Maplotlibを使ってあれこれ画像を操作してみる。Matplotlibは既にインストールされているものとする。

Pillow利用。利用方法については1-1 PILを参照。

@CretedDate 2015/01/20
@Versions Python 2.7.6, Matplotlib 1.3.1

画像の表示

まずはPillowで読み込んだ画像をそのまま表示してみる。

foo.jpgに適当な画像を保存しておく。

from PIL import Image
from matplotlib import pylab as plt

# 画像の読み込み
img = np.array( Image.open('foo.jpg') )

# 画像の表示
plt.imshow( img )

これで画像が表示される。iPythonで動かしている場合で画像が表示されなければ、%pylabしてから実行する。

%pylab

サンプル画像

座標の目盛りもサービスで付いてくる。ちなみにこの写真は友達の家のうさぎなんだけど、傍若無人な振る舞いがとてもかわいいヤツです。

画像にタイトルを入れる

日本語のフォントを使いたいので、fontをTakaoGothicにしておく。お使いの端末によっては設定しなくても良かったり、別のフォント名を指定しないといけなかったりする。

# fontを設定
font = {'family':'TakaoGothic' }
matplotlib.rc('font', **font)

# 画像表示
img = np.array( Image.open('foo.jpg') )
plt.imshow( img )

# タイトル表示
plt.title( u'うさぎ' )

サンプル画像

うさぎかわいい。

画像に線を引く

赤い実践と青い破線を引いてみる。

# 幅5pixelの赤線地帯
plt.plot( [50, 350], [200, 200], 'r', lw=5 )

# 幅5pixelの青破線
plt.plot( [50, 350], [220, 220], 'b--', lw=5 )

# 画像表示
img = np.array( Image.open('foo.jpg') )
plt.imshow( img )

サンプル画像

うさぎかわいい。

等高線

グレースケールの画像は等高線を出すことができるとか。やってみよう。

# グレースケールで画像読み込み
img = np.array( Image.open('foo.jpg').convert('L') )

# 等高線
plt.contour(img, origin='image')

サンプル画像

なるほど。こうなるのか。色が似ている箇所で等高線が引かれている。

ヒストグラム

グレースケールの画像からヒストグラムを出すことができるらしい。やってみよう。

img = np.array( Image.open('foo.jpg').convert('L') )

# グレースケールうさぎ画像
plt.subplot(121)
plt.imshow( img )
plt.axis('off')

# ヒストグラム
plt.subplot(122)
plt.hist( img.flatten(), 128 )
plt.axis('off')

サンプル画像

ちょっとうまく上と下を合わせられてない。そして今ひとつうまい感じの結果になっていない。もう少しヒストグラムが出しやすい画像を選んだ方が良かったかも。

クリックしたポイントに点を描画

ginputでクリックしたpointを取得して、

img = np.array( Image.open('foo.jpg').convert('L') )
plt.imshow(img)

# 1箇所pointを取る
x, y = plt.ginput(1)[0]

# ここでクリック

# 座標に赤い丸を(r=red, o=circle)
plt.plot( point[0][0], point[0][1], 'ro' )
plt.imshow(img)

サンプル画像