plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

scikit-imageのお勉強 第1回 dataモジュールとioモジュール ~画像の入出力~

scikit-imageの便利機能を、自分への備忘録としてメモしていくシリーズです。 今回は第1回です。

scikit-imageとはなんぞや

公式ページはコチラ: scikit-image: Image processing in Python — scikit-image

Pythonで画像処理を可能にするためのパッケージです。SciPyのためのツールボックスとのことですが、単体で使っても便利です。コンピュータービジョンがらみで色々な機能が使えます。

pipでインストールできます。

$ pip install scikit-image

今回の環境は

  • MacOSX Sierra
  • python 3.6.5
  • scikit-image 0.14.0
  • matplotlib 2.2.2
  • jupyter 1.0.0
  • jupyterlab 0.32.1

です。

18種類のモジュール

APIのページを見てもらうとわかりますが、モジュールが18種類あります。

API Reference for skimage 0.14.0 — skimage v0.14.0 docs

  1. color 色空間
  2. data テスト画像呼び出し等
  3. draw 線・円などの図形描画
  4. exposure 露出補正
  5. external TIF操作
  6. feature 特徴抽出など
  7. filters フィルター処理
  8. future
  9. graph グラフ
  10. io 画像ファイル出入力・画像表示
  11. measure 測定
  12. morphology モルフォロジー処理
  13. novice
  14. restoration 復元
  15. segmentation 区画化
  16. transform 変換
  17. util ユーティリティ
  18. viewer ビューワー

たくさんあるので大変ですが、細かく使い方について解説しているページがあまりない気がしたので、使えそうな関数について地道に見ていく予定にしています。

今回は2番のdataと10番のioから解説します。

dataモジュール

scikit-imageに付属しているテスト画像を読み込むことができます。

準備

まず、Jupyterを起動します。

ロードした画像をmaplotlibで表示できるように準備します。

%matplotlib inline
import matplotlib.pyplot as plt

画像表示用の関数を作成しておきます。

def image_show(img):
    plt.imshow(img)
    plt.xticks([])
    plt.yticks([])
    plt.show()

テスト画像のロード

data.load()でロードできます。

skimageフォルダの中にdataフォルダがあり、その中にテスト画像が入っています。

もし場所がわからない場合でも(邪道ではありますが、、、)、試しに存在しない画像ファイルで実行してみると、エラーメッセージからどこを探索しているのかがわかります。

from skimage import data

data.load('.png')
#FileNotFoundError: [Errno 2] No such file or directory: '/Users/xxx/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/skimage/data/.png'

フォルダの場所がわかったら、試しにこのフォルダに入っているpng形式のファイル一覧を表示してみます。

import os

folder = '/Users/xxx/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/skimage/data/'
files = [img for img in os.listdir(folder) if img.endswith('.png')]
print(files)
    ['astronaut.png',
     'block.png',
     'brick.png',
     'bw_text.png',
     'camera.png',
     'checker_bilevel.png',
     'chelsea.png',
     'chessboard_GRAY.png',
     'chessboard_RGB.png',
     'clock_motion.png',
     'coffee.png',
     'coins.png',
     'color.png',
     'foo3x5x4indexed.png',
     'grass.png',
     'horse.png',
     'ihc.png',
     'logo.png',
     'moon.png',
     'motorcycle_left.png',
     'motorcycle_right.png',
     'page.png',
     'palette_color.png',
     'palette_gray.png',
     'phantom.png',
     'rough-wall.png',
     'text.png']

これらの画像ファイルをdata.load()で呼び出すことができます。

f = 'camera.png'
loaded_img = data.load(f)
image_show(loaded_img)

f:id:plant-raspberrypi3:20180903145552p:plain

テスト画像のロードその2

ファイル名を指定してロードする以外に、関数として呼び出す方法もあります。

rocket = data.rocket()
image_show(rocket)

f:id:plant-raspberrypi3:20180903145644p:plain

chels = data.chelsea()
image_show(chels)

f:id:plant-raspberrypi3:20180903145704p:plain

immuno = data.immunohistochemistry()
image_show(immuno)

f:id:plant-raspberrypi3:20180903145724p:plain

とても簡単ですね。

ちなみに、ロードしたデータ型はNumPyアレイに

type(immuno)

#numpy.ndarray

データは3次元で、「縦、横、色」の順になっています。

chels.shape

#(300, 451, 3)

ioモジュール

ioモジュールには自前の画像の読み込みや保存に関わる機能が含まれています。

いらすとやさんより画像をダウンロードさせてもらってテストしてみます。

www.irasutoya.com

データの読み込み

io.imread()で読み込むことができます。

from skimage import io

f = 'gardening_tane.png'
img1 = io.imread(f)
image_show(img1)

f:id:plant-raspberrypi3:20180903175646p:plain

データの保存

io.imsave()で書き出すことができます。

第1引数:保存先ファイル名
第2引数:保存する画像

io.imsave('test.png',img1)

ioモジュールにはこの他にも画像の表示やプラグインの呼び出しに関わる関数が存在しますが、今回は割愛します。

今日はここまで。