plant-raspberrypi3のブログ

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

scikit-imageのお勉強 第2回 colorモジュール ~色空間~

scikit-imageの便利機能を、自分への備忘録としてメモしていきます。

第1回はコチラ。

plant-raspberrypi3.hatenablog.com

今回は第2回で色空間について。

colorモジュール

色空間に関するモジュールです。 画像の色空間を変更できます。

公式ページ: Module: color — skimage v0.14.0 docs

色空間を変換する方法は2種類です。

  • color.convert_colorspace()関数を使う
  • 専用の関数(color.rgb2hsv()など)を使う

color.convert_colorspace

color.convert_colorspace()を使う場合の引数は以下の通りです。

第1引数:画像データ
第2引数:元画像の色空間
第3引数:変換後の色空間

はじめに準備として、テスト画像をdataモジュールで読み込みます。

%matplotlib inline
import matplotlib.pyplot as plt
from skimage import color, data

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

rocket = data.rocket()
image_show(rocket)

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

早速、color.convert_colorspace()を実行してみます。

rocket_hsv = color.convert_colorspace(rocket,'RGB','HSV')
image_show(rocket_hsv)

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

専用の関数

color.rgb2hsv()を試してみます。

rocket_hsv = color.rgb2hsv(rocket)
image_show(rocket_hsv)

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

利用できる色空間はたくさんあります。
基本的な使い方は同じなので、今回はHSV空間に変換する場合のみをご紹介しました。

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

今日はここまで。

「TensorFlow」が「Raspberry Pi」を正式にサポートしたそうです!

これはうれしいニュース!

japan.zdnet.com

Pete Warden氏はTensorFlow 1.9について、「Raspberry Pi Foundationとの協力で、TensorFlowの最新リリース1.9は、Pythonのpipパッケージシステムを使い、ビルド済みバイナリからインストール可能になった」と記している。

時間ができたら試してみたいです。

3D可視化ツールMayaviを導入してみる

こんにちは。らずべりーです。特に脈絡もなくPythonの可視化ツールネタ。

Matplotlibにも3D表示機能がありますが、より高度な3D可視化ツールとしてMayaviというのがあるのを知ったので、お試しに導入してみました。

公式ページ
Mayavi: 3D scientific data visualization and plotting in Python — mayavi 4.6.1 documentation

日本語解説 (以下コメントの引用元)
3.5. Mayavi による 3D プロット — Scipy lecture notes

Mayavi は対話的な3次元プロットパッケージです。 matplotlib も簡単な3次元プロットを持っていますが、 Mayavi はより強力なエンジン ( VTK ) を利用し、大規模なデータや複雑なデータを表示するのに向いています。

まだちゃんと読めてません。ぼちぼち読む。

環境構築

参考ページ

qiita.com

実行環境

必要なパッケージVTKをHomebrewで入れます。 このあたりを参考に。

apple.stackexchange.com

$ brew install vtk --with-python3 --without-python

30分以上かかる。(Macがウンウン言っていた、、、)

失敗したケース (Python3で動かそうとした)

とりあえず、普通にPython3のAnaconda環境でpipする。

$ pip install mayavi
$ python

インストール自体は問題なくできた。 とりあえずテスト。

from mayavi import mlab
mlab.test_plot3d()

importは実行できるものの、何も表示されない、、、orz

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

成功したケース (Python2で再挑戦)

仕方がないので、新たにPython2のAnacondaを導入。Python2はもうすぐ主要パッケージのサポートが打ち切られる見込みなのであまり触りたくなかったのですが、、、

まずはAnaconda2と必要なパッケージを導入。

$ pyenv install anaconda2-5.2.0
$ conda install -n py27mayavi numpy jupyter mayavi=4.4

pyenvとcondaを併用する場合、source activateがうまくいかないという情報があったため、こちらのページを参考に

qiita.com

pyenv localを他所で使っているため、以下のコマンドでactivate。

$ source $PYENV_ROOT/versions/anaconda2-5.2.0/bin/activate py27mayavi

ひとまず、問題なくクリア。

再びPythonを起動してテスト。

from mayavi import mlab
mlab.test_plot3d()

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

動いた!!!

とりあえず、Python2環境で試してみようと思います。Python3で(Macで)うまくいく方法をご存知の方、いらっしゃったらコメントください、、、(切実)

GitHubのセキュリティ脆弱性アラートがPythonに対応

ニュースの備忘録。

GitHubでセキュリティ脆弱性アラート機能のPythonバージョンがリリースされたそうです。

blog.github.com

以下、google翻訳で一部抜粋

昨年、RubyJavaScriptパッケージのセキュリティ脆弱性を追跡するセキュリティ警告をリリースしました。それ以来、私たちは何百万という脆弱性を特定し、多くのパッチを要求してきました。 私たちはPythonのサポートを出荷したことをお知らせします。今週の時点で、Pythonユーザーは、依存関係グラフにアクセスし、リポジトリが既知のセキュリティ脆弱性を持つパッケージに依存する場合はいつでも、セキュリティ警告を受け取ることができます。

原文、全文はリンク記事を参照のこと。

requirements.txtやPipfile.lockがリポジトリに含まれていると自動でチェックしてくれるそうです。

requirements.txtはpip freezeから簡単に作ることができます。このあたりを参考に。

raimon49.github.io

note.nkmk.me

karaage.hatenadiary.jp

ssh接続でPythonをバックグラウンドで実行する方法

最近、sshでつないだサーバーでPythonを実行しているのですが、実行途中で切れてしまうことが多くて困っていました。詳しい方に、バックグラウンドで実行すると良いと教えてもらったので、やり方のメモ。

nohupを使います。

参考にさせていただいたページは以下。

qiita.com

$ nohup python main.py &

状況を確認する

$ ps u

プロセスを終了させるには

$ kill -KILL [プロセスID]