こんにちは、管理人のウノケンです。
今回は、Pythonで画像を扱うための基礎として、matplotlibの画像チュートリアルを活用した学習について解説していきます。
matplotlib.pyplotを使うと、MATLABのようにグラフをプロットすることができます。有料ソフトウェアであるMATLABのような機能をPythonのライブラリとして使用できるのはとてもありがたいですよね。
とはいえ、matplotlibには膨大な機能があり、うまく使いこなせていない方も多いのではないかと思います。
matplotlibの基礎は、公式のチュートリアルを参考にした学習がおすすめです。とはいえ英語で記載されていたり、初心者にはわかりにくい部分もあるため、解説や修正を加えながら日本語で解説していきます。
今回は画像チュートリアルとして、画像チュートリアルを参考にしています。
それでは見ていきましょう!
日本語で解説!matplotlib画像チュートリアル
ライブラリのインポート
matplotlib.pyplotの他に、matplotlib.imageをインポートします。
また、Pythonにおける画像処理でよく使われるライブラリのPIL (Pillow)もインポートしておきます。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from PIL import Image
画像のインポート imread()
画像チュートリアルに使用するRGB画像をimread()でインポートします。今回は、画像処理で頻繁に使用されるLennaの画像を使います。このような画像処理に使われる画像は標準画像と呼ばれ、論文などで各手法の性能比較などに用いられます。こちらのサイトなどから取得できます。
img = mpimg.imread('./Lenna.png')
numpy配列を画像としてプロット imshow()
matplotlibでは、画像の表示にimshow()関数を使用します。
imgplot = plt.imshow(img)

疑似カラー表示
RGBから1つのチャネルのみを選ぶことで、疑似カラー表示します。疑似カラー表示は、コントラストが高まり、グレースケールなどよりも視覚的に把握しやすいという性質があります。
lum_img = img[:, :, 0]
plt.imshow(lum_img)

デフォルトのカラーマップから、他のカラーマップに変更することも可能です。
plt.imshow(lum_img, cmap='hot')

set_cmap()メソッドにより、プロット後のオブジェクトのカラーマップを変更することも可能です。

カラーバーの追加
数値と色の対応を把握するためには、カラーバーを表示しておくと便利です。plt.colorbar()によって追加できます。
imgplot = plt.imshow(lum_img)
plt.colorbar()

データ範囲の取得
画像のデータ分布がどのようであるか、どのようなデータ範囲の成分が多く含まれているかなどを把握したい場合、ヒストグラム関数plt.hist()を使用すると便利です。
ちなみに、ravel関数は多次元配列を1次元に変換するために使用しています。
plt.hist(lum_img.ravel(), bins=256, range=(0.0, 1.0), fc='b', ec='b')

上の例から、画像のデータが0.2~0.8に集中していることが読み取れます。
より画像のコントラストを高めるため、主要なデータ範囲に絞ってみます。
imshowの引数の中でclimの範囲を指定するか、画像プロットオブジェクトのメソッドとしてset_clim()で指定することもできます。
imgplot = plt.imshow(lum_img, clim=(0.2, 0.8))

コントラストが強調された様子を比較してみます。
fig = plt.figure()
ax = fig.add_subplot(1, 2, 1)
imgplot = plt.imshow(lum_img)
ax.set_title('Before')
plt.colorbar(ticks=[0.2,0.4, 0.6, 0.8], orientation='horizontal')
ax = fig.add_subplot(1, 2, 2)
imgplot = plt.imshow(lum_img)
imgplot.set_clim(0.2, 0.8)
ax.set_title('After')
plt.colorbar(ticks=[0.2, 0.4, 0.6, 0.8], orientation='horizontal')

画像配列の補間 interpolation
画像のサイズ変更時など、補間が必要になる場合があります。
bilinear
補間の実験のため、画像のサイズを変更します。デフォルトでは’bilinear’で補間され、ピクセルが強調されたような印象の画像が表示されます。
img = Image.open('./Lenna.png')
img.thumbnail((64, 64), Image.ANTIALIAS) # 画像データをリサイズします
imgplot = plt.imshow(img)

nearest
‘nearest’では補間されません。
imgplot = plt.imshow(img, interpolation="nearest")

bicubic
‘bicubic’ではぼやけたような印象の画像になりますが、ピクセルが強調されたような印象は薄れます。
imgplot = plt.imshow(img, interpolation="bicubic")

まとめ
今回は、Pythonで画像を扱うための基礎として、matplotlibの画像チュートリアルを活用した学習について解説してきました。Python画像処理で使用するライブラリやデータの形式、簡単な画像処理について感覚を掴めたのではないかと思います。
チュートリアルを越えてより詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。
参考書学習は…
matplotlibのみを扱った参考書は少ないですが、numpyやpandasを含めて、データサイエンスに必要なライブラリを詳しく解説する以下の書籍がおすすめです。
また、さらに画像処理について理解を深めたい!という方は、画像処理に欠かせないライブラリであるOpenCVについて学べる以下の書籍をおすすめします。