matplotlibで画像を表示する

matplotlibで画像を表示させるための手順について。
matplotlibはPILを利用して画像の描画を行っているため、PILの機能に準じた処理になります。PILを使って画像の値を配列形式として読み込む作業を、matplotlibを使うと簡単に行うことができます。

画像の読み込みと描画

最も単純なサンプルです。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img=mpimg.imread('test.png') #image to array
plt.imshow(img) #array to 2Dfigure

plt.show()

matplotlib.imageのimreadで画像を配列に変換します。配列のデータを、pyplotの図にレンダリングする関数がimshowです。

print img

例えば全ての成分が赤であるRGB画像では次のように値が格納されます。


[ [ [ 1. 0. 0.]
[ 1. 0. 0.]
[ 1. 0. 0.]

...,
[ 1. 0. 0.]
[ 1. 0. 0.]
[ 1. 0. 0.] ] ]

ヒストグラムの表示

pyplotにヒストグラムを表示する機能としてhist関数が提供されているのでこれ画像処理用のヒストグラムにしてみます。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img=mpimg.imread('test.png')

plt.figure(1)
#red
plt.subplot(311)
r_img = img[:,:,0]
plt.hist(r_img.flatten(), 256, range=(0.0,1.0), fc='r', ec='k')
#green
plt.subplot(312)
g_img = img[:,:,1]
plt.hist(g_img.flatten(), 256, range=(0.0,1.0), fc='g', ec='k')
#blue
plt.subplot(313)
b_img = img[:,:,2]
plt.hist(b_img.flatten(), 256, range=(0.0,1.0), fc='b', ec='k')

plt.show()

引数のfcは棒グラフの棒の色、ecは棒のエッジ部分の色です。色の情報を0.から1.までの範囲で描画します。
img[:,:,0]で赤の成分を、img[:,:,1],img[:,:,2]で緑と青の成分を抽出した配列を生成します。例えば、全ての成分が赤であるRGB画像に対してimg[:,:,0]は下のような配列を生成します。


[ [ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.]
...,
[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.] ]
plt.subplot(31*)で3つの図を用意して、上からR,G,Bに対応したヒストグラムを描いています。

scipyと組み合わせる

scipyを使うと画像処理テスト用のレナ画像を読み込めます。読み込んだ画像の形式は、RGBそれぞれの二次元配列のリストです。Rだけ取り出すにはimg[0]だけでよいです。ただし、値はさきほどと違って0.から255.になっているので注意。

from scipy import signal, misc
from numpy import *
img = misc.lena().astype(float32)
print img


[ [ 162. 162. 162. ..., 170. 155. 128.]
[ 162. 162. 162. ..., 170. 155. 128.]
[ 162. 162. 162. ..., 170. 155. 128.]
...,
[ 43. 43. 50. ..., 104. 100. 98.]
[ 44. 44. 55. ..., 104. 105. 108.]
[ 44. 44. 55. ..., 104. 105. 108.] ]

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

#img=mpimg.imread('test.png')
from scipy import signal, misc
from numpy import *

img = misc.lena().astype(float32)

plt.figure(1)
#red
plt.subplot(311)
r_img = img[0]
plt.hist(r_img.flatten(), 256, range=(0.,255.), fc='r', ec='k')
#green
plt.subplot(312)
g_img = img[1]
plt.hist(g_img.flatten(), 256, range=(0.,255.), fc='g', ec='k')
#blue
plt.subplot(313)
b_img = img[2]
plt.hist(b_img.flatten(), 256, range=(0.,255.), fc='b', ec='k')

plt.show()