scikit-imageのお勉強 第3回 drawモジュール ~図形の描画~
scikit-imageの便利機能の備忘録シリーズ。
これまでの回はコチラ。
第1回 dataモジュールとioモジュール ~画像の入出力~
今回は第3回です。draw
モジュールについてメモしていきます。
drawモジュールでできること
様々な図形を描画し、画像に上書きできます。
公式ページ: Module: draw — skimage v0.14.0 docs
次のような図形が描けます。
直線
draw.line
draw.line_aa
ベジェ曲線
draw.bezier_curve
多角形
draw.polygon
draw.polygon_perimeter
四角形
draw.rectangle
楕円
draw.ellipse
draw.ellipse_perimeter
正円
draw.circle
draw.circle_perimeter
draw.circle_perimeter_aa
手順としては以下の通り。
draw.xxx
関数を使って描画したい座標群rr, ccを指定- NumPyの座標指定の機能を使って、rr,cc座標群を塗りつぶす
直線
直線を描く関数はdraw.line
とdraw.line_aa
の2種類あります。
いずれも引数は以下の通り。
第1引数:始点の座標(縦)
第2引数:始点の座標(横)
第3引数:終点の座標(縦)
第4引数:終点の座標(横)
draw.line_aa()
のほうは自然な感じに描けますが、valというパラメーターが増えます。
まず前回と同じように、テスト画像をdata
モジュールで読み込みます。
・code
%matplotlib inline import matplotlib.pyplot as plt from skimage import draw, data def image_show(img): plt.imshow(img) plt.xticks([]) plt.yticks([]) plt.show() rocket = data.rocket() image_show(rocket)
・元画像
直線を描いてみます。
・code
rr,cc = draw.line(51,101,301,601) print(rr[:10]) #10番目までの座標群(縦) print(cc[:10]) #10番目までの座標群(横) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2) image_show(rocket2[50:100,125:175]) #出力結果 [51 52 52 53 53 54 54 55 55 56] #10番目までの座標群(縦) [101 102 103 104 105 106 107 108 109 110] #10番目までの座標群(横)
・出力画像
・出力画像(拡大)
draw.line_aa
も試してみます。
・code
rr,cc,val = draw.line_aa(51,101,301,601) #valも計算される rocket2 = data.rocket() for i in range(3): rocket2[rr,cc,i] = val*255 #各色チャネルに対して塗りつぶし処理する必要がある image_show(rocket2) image_show(rocket2[50:100,125:175])
・出力画像
・出力画像(拡大)
ベジェ曲線
draw.bezier_curve
を使うとベジェ曲線も描けちゃいます。
ただし、思うような曲線を描くためには試行錯誤が必要かもしれません。
第1引数:始点の座標(縦)
第2引数:始点の座標(横)
第3引数:中間点の座標(縦)
第4引数:中間点の座標(横)
第5引数:終点の座標(縦)
第6引数:終点の座標(横)
第7引数:重み
引数が多くてややこしいです。
・code
for i in range(1,5): rr,cc = draw.bezier_curve(51,101,301,301,301,601,i) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2)
・重み=1
・重み=2
・重み=3
・重み=4
多角形
draw.polygon
(塗りつぶし)またはdraw.polygon_perimeter
(輪郭)で描けます。
第1引数:頂点の座標群(縦・Numpyアレイで与える)
第2引数:頂点の座標群(横・Numpyアレイで与える)
・code
import numpy as np rr,cc = draw.polygon(np.array([101,301,201,101,51]),np.array([101,201,401,401,301])) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2)
・出力画像
・code
rr,cc = draw.polygon_perimeter(np.array([101,301,201,101,51]),np.array([101,201,401,401,301])) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2)
・出力画像
四角形
scikit-imageのversion0.14.xで足されたようです。
draw.rectangle
で描きます。
第1引数:始点の座標([縦、横])
第2以降の引数(end=):終点の座標([縦、横])
・code
rr,cc = draw.rectangle([101,101],end=[201,301]) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2)
・出力画像
楕円
draw.ellipse
(塗りつぶし)またはdraw.ellipse_perimeter
(輪郭)で描けます。
第1引数:中心の座標(縦)
第2引数:中心の座標(横)
第3引数:長軸・短軸方向の径(縦)
第4引数:長軸・短軸方向の径(横)
・code
rr,cc = draw.ellipse(251,251,50,150) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2)
・出力画像
・code
rr,cc = draw.ellipse_perimeter(251,251,50,150) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2)
・出力画像
正円
正円を描く方法はdraw.circle
とdraw.circle_perimeter
とdraw.circle_perimeter_aa
の3種類です。
第1引数:中心の座標(縦)
第2引数:中心の座標(横)
第3引数:直径(縦)
・code
rr,cc = draw.circle(251,251,50) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2)
・出力画像
・code
rr,cc = draw.circle_perimeter(251,251,50) rocket2 = data.rocket() rocket2[rr,cc] = 255 image_show(rocket2) image_show(rocket2[190:240,190:240])
・出力画像
・出力画像(拡大)
・code
rr,cc,val = draw.circle_perimeter_aa(251,251,50) rocket2 = data.rocket() for i in range(3): rocket2[rr,cc,i] = val*255 #各色チャネルに対して塗りつぶし処理する必要がある image_show(rocket2) image_show(rocket2[190:240,190:240])
・出力画像
・出力画像(拡大)
今回は以上です。
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)
早速、color.convert_colorspace()
を実行してみます。
rocket_hsv = color.convert_colorspace(rocket,'RGB','HSV') image_show(rocket_hsv)
専用の関数
color.rgb2hsv()
を試してみます。
rocket_hsv = color.rgb2hsv(rocket) image_show(rocket_hsv)
利用できる色空間はたくさんあります。
基本的な使い方は同じなので、今回は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
今回の環境は
です。
18種類のモジュール
APIのページを見てもらうとわかりますが、モジュールが18種類あります。
API Reference for skimage 0.14.0 — skimage v0.14.0 docs
- color 色空間
- data テスト画像呼び出し等
- draw 線・円などの図形描画
- exposure 露出補正
- external TIF操作
- feature 特徴抽出など
- filters フィルター処理
- future
- graph グラフ
- io 画像ファイル出入力・画像表示
- measure 測定
- morphology モルフォロジー処理
- novice
- restoration 復元
- segmentation 区画化
- transform 変換
- util ユーティリティ
- 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)
テスト画像のロードその2
ファイル名を指定してロードする以外に、関数として呼び出す方法もあります。
rocket = data.rocket() image_show(rocket)
chels = data.chelsea() image_show(chels)
immuno = data.immunohistochemistry() image_show(immuno)
とても簡単ですね。
ちなみに、ロードしたデータ型はNumPyアレイに
type(immuno) #numpy.ndarray
データは3次元で、「縦、横、色」の順になっています。
chels.shape
#(300, 451, 3)
ioモジュール
ioモジュールには自前の画像の読み込みや保存に関わる機能が含まれています。
いらすとやさんより画像をダウンロードさせてもらってテストしてみます。
データの読み込み
io.imread()
で読み込むことができます。
from skimage import io f = 'gardening_tane.png' img1 = io.imread(f) image_show(img1)
データの保存
io.imsave()
で書き出すことができます。
第1引数:保存先ファイル名
第2引数:保存する画像
io.imsave('test.png',img1)
ioモジュールにはこの他にも画像の表示やプラグインの呼び出しに関わる関数が存在しますが、今回は割愛します。
今日はここまで。
「TensorFlow」が「Raspberry Pi」を正式にサポートしたそうです!
これはうれしいニュース!
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 ) を利用し、大規模なデータや複雑なデータを表示するのに向いています。
まだちゃんと読めてません。ぼちぼち読む。
環境構築
参考ページ
実行環境
必要なパッケージVTKをHomebrewで入れます。 このあたりを参考に。
$ 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
成功したケース (Python2で再挑戦)
仕方がないので、新たにPython2のAnacondaを導入。Python2はもうすぐ主要パッケージのサポートが打ち切られる見込みなのであまり触りたくなかったのですが、、、
まずはAnaconda2と必要なパッケージを導入。
$ pyenv install anaconda2-5.2.0 $ conda install -n py27mayavi numpy jupyter mayavi=4.4
pyenvとcondaを併用する場合、source activateがうまくいかないという情報があったため、こちらのページを参考に
pyenv localを他所で使っているため、以下のコマンドでactivate。
$ source $PYENV_ROOT/versions/anaconda2-5.2.0/bin/activate py27mayavi
ひとまず、問題なくクリア。
再びPythonを起動してテスト。
from mayavi import mlab mlab.test_plot3d()
動いた!!!
とりあえず、Python2環境で試してみようと思います。Python3で(Macで)うまくいく方法をご存知の方、いらっしゃったらコメントください、、、(切実)
GitHubのセキュリティ脆弱性アラートがPythonに対応
ニュースの備忘録。
GitHubでセキュリティ脆弱性アラート機能のPythonバージョンがリリースされたそうです。
以下、google翻訳で一部抜粋
昨年、RubyやJavaScriptパッケージのセキュリティ脆弱性を追跡するセキュリティ警告をリリースしました。それ以来、私たちは何百万という脆弱性を特定し、多くのパッチを要求してきました。 私たちはPythonのサポートを出荷したことをお知らせします。今週の時点で、Pythonユーザーは、依存関係グラフにアクセスし、リポジトリが既知のセキュリティ脆弱性を持つパッケージに依存する場合はいつでも、セキュリティ警告を受け取ることができます。
原文、全文はリンク記事を参照のこと。
requirements.txtやPipfile.lockがリポジトリに含まれていると自動でチェックしてくれるそうです。
requirements.txtはpip freezeから簡単に作ることができます。このあたりを参考に。