scipy+scikit-image | 第4回pythonリモート社内勉強会

「python社内勉強会＆ハッカソン」の公開ログになります。
本日は、前半最終回。「Scipy」、「scikit-image（画像処理）」について触れていきます。
今回は科学計算ライブラリを用いることもあり、数学的な内容にも補足として少し見ていきます。

# この勉強会について
各回30〜60分程度。ダラダラとはやらずpythonのwhy、whatを共有していく時間になります。
基本的なプログラミングなどの実装は会内はやらず、実行デモ程度を予定しています。宿題も特にありませんので各自勉強したことを再学習していってください。

# 前半（基礎編）

これまでの勉強会の過去ログはこちら。
第1回 : https://qiita.com/classfox/items/edba3e8971aaa067b88b
第2回 : https://qiita.com/classfox/items/095c4f4b8aa9247a4392
第3回 : https://qiita.com/classfox/items/825116980ac7ca255a13
第4回 : https://qiita.com/classfox/items/9a4b8a513fd5b642534d

## SciPy

https://www.scipy.org/
https://qiita.com/search?q=scipy

scipy、高度な科学計算を行うためのライブラリ。前回勉強したnumpyは配列や行列の演算を行うことができるが、それらも処理でき、さらに信号処理、画像処理、統計といった計算が可能。
※scipyを使うにはnumpyが必要なので、numpyもインストールすること。

### 1. 積分

```scipytest.py

#coding: UTF-8

from scipy import integrate

# 3x + 5を積分する
def func(x):
    return 3*x + 5

result, err = integrate.quad(func, 0, 5)
print('Integration Result : {0}\nError : {1}'.format(result, err))

```

#### （補足１） 関数の定義、実行

`def 関数名(引数) : return 数式など`といったように関数を定義することができ、
`(関数名, 引数...)`といったように、実行していくことができる。
https://docs.python.jp/3/library/functional.html

#### （補足2） 積分

![0066-05.jpg](https://qiita-image-store.s3.amazonaws.com/0/59118/82b1ecd8-0ccb-3eee-5003-219fc4e64039.jpeg)
https://ja.wikipedia.org/wiki/%E7%A9%8D%E5%88%86%E6%B3%95

### 2. 微分方程式

```scipytest2.py

#coding: UTF-8

from scipy.integrate import odeint #微分
import numpy as np  # numpyを使う
import matplotlib.pyplot as plt

# 微分方程式（frac{dx(t)}{dt} = -3a x）
def diff_op(x, time, a):
    return -3*a*x

x0 = 4.0
a = 3.0
time = np.linspace(0,3,50)
traject = odeint(diff_op, x0 ,time, args=(a,))

# 描画
plt.plot(time, traject, '-k', linewidth=3)
plt.xlabel('t', fontsize=24)
plt.ylabel('x', fontsize=24,rotation='horizontal')
plt.show()

```

#### (補足3) 微分
![bibeqb1.gif](https://qiita-image-store.s3.amazonaws.com/0/59118/9ae9ea20-950e-0497-3a4d-75c8e403b225.gif)
![dxdy.png](https://qiita-image-store.s3.amazonaws.com/0/59118/0bf9dae9-246b-a136-037f-c480b727f375.png)
https://ja.wikipedia.org/wiki/%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F

### 3. Numpy行列を扱う

```scipytest3.py

#coding: UTF-8

from scipy import linalg
import numpy as np  # numpyを使う

narray = np.array([[1, 3], [2, 5]])
inv_narray = linalg.inv(narray)
print('narrayの逆行列：\n{}\n'.format(inv_narray))

result_det = linalg.det(inv_narray)
print('inv_narrayの行列式:{}\n'.format(result_det))

inv_narray_norm = linalg.norm(inv_narray)
print('inv_narrayのノルム:{}'.format(inv_narray_norm))

```
#### （補足4） 逆行列、行列式、ノルム

**逆行列**
<img width="806" alt="スクリーンショット 2018-01-28 8.29.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/59118/168d5c87-9607-2880-80e6-6aaf7456f2e4.png">
https://www.weblio.jp/content/%E9%80%86%E8%A1%8C%E5%88%97

**行列式**
<img width="751" alt="スクリーンショット 2018-01-28 8.31.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/59118/5c965484-d723-ee45-b9cc-c9981e0bc893.png">
https://www.weblio.jp/content/%E8%A1%8C%E5%88%97%E5%BC%8F

**行列ノルム**
https://ja.wikipedia.org/wiki/%E8%A1%8C%E5%88%97%E3%83%8E%E3%83%AB%E3%83%A0

## scikit-image

scikit-imageという画像処理ライブラリをインストールすることで、画像処理を行うことが可能。

```skimagetest.py

#coding: UTF-8

import numpy as np
from skimage import io
from skimage.color import rgb2gray
import skimage.filters as fil
import skimage.filters.rank as rank
import skimage.morphology as mor

# 画像表示
I = io.imread('images/lena.jpg')
print(I.shape)
io.imshow(I)
io.show()

# グレースケール変換
G = rgb2gray(I)
io.imshow(G)
io.show()

# 画像の保存
io.imsave('images/lenagray.jpg', G)

# ２値化（大津式）
img = io.imread('images/lena.jpg',as_grey=True,plugin=None,flatten=None)
thrOtsu = fil.threshold_otsu(img)

# 二値化
thrImg = ((thrOtsu < img) * 255).astype(np.uint8)
io.imshow(thrImg)
io.show()

# ガウシアンフィルタ
sigma = 1
gauImg = fil.gaussian_filter(img, sigma=sigma)
io.imshow(gauImg)
io.show()

# メジアンフィルタ
selem = mor.disk(10)
medImg = rank.median(img, selem=selem)
io.imshow(medImg)
io.show()

```

元画像（lena.jpg）
<img width="508" alt="スクリーンショット 2018-01-28 9.52.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/59118/7c590456-9d37-84f4-10ba-44796ac19046.png">

グレースケール
<img width="564" alt="スクリーンショット 2018-01-28 9.42.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/59118/88aa147c-54af-bbf9-2e32-4c63530f2927.png">

２値化
<img width="536" alt="スクリーンショット 2018-01-28 9.42.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/59118/0d5a7b0c-e650-0c36-1b9e-9d97d29eba3c.png">

ガウシアンフィルタ
<img width="553" alt="スクリーンショット 2018-01-28 9.42.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/59118/4ac6afa4-9bdf-8a2a-06b5-e4e28818759c.png">

メジアンフィルタ
<img width="534" alt="スクリーンショット 2018-01-28 9.49.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/59118/792052a6-b751-0609-de75-ce2a757e258a.png">

# 次回の予定
第4回はここまで。次回以降のラインナップは以下を参照ください。
※内容が大幅に変更となる場合もあります。

これまでの勉強会の過去ログはこちら。
第1回 : https://qiita.com/classfox/items/edba3e8971aaa067b88b
第2回 : https://qiita.com/classfox/items/095c4f4b8aa9247a4392
第3回 : https://qiita.com/classfox/items/825116980ac7ca255a13
第4回 : https://qiita.com/classfox/items/9a4b8a513fd5b642534d

# 後半（応用編）の予定

後半の勉強会は2018年3月を予定。前半で触れてきた基礎を活用しながら、より実用的・実践的なものを見ていきます。

0. おすすめライブラリ（ https://qiita.com/haminiku/items/5187713bba6cb30532bf ）
1. WEBアプリケーション
2. tensorflow（ディープラーニング）
3. レコメンドエンジンの実装（スコアリング）
4. 自然言語処理プログラムの実装（※mecab等も活用？）
5. 回帰分析などの統計プログラムの実装
6. データクレンジング関連
7. その他アルゴリズムの構築、ハッカソン形式
8. kaggleにあるデータ・セットを活用も面白そう