綺麗なお姉さんをMatplotlibで3D表示して遊んでみた


3Dの図って、なんだか見てて楽しいですよね〜
この図だってなんか、いい感じに勾配ができてます！

![スクリーンショット 2017-10-19 23.09.39.png](https://qiita-image-store.s3.amazonaws.com/0/76493/761a3b46-973d-c049-781d-90f739f579ff.png "スクリーンショット 2017-10-19 23.09.39.png")

## 画像を3D表示しよう

帰ってるときに画像を3Dで表示してみたら、なんかRGBの勾配とかわかって面白いんだろうなあとか思ってたのを思い出して、とりあえずやって見ました。
簡単のためにこんな感じで

* 使う画像はモノクロ
	* R=G=Bになるので、これをCとでもすれば...
* XZ平面上に画像の画素を配置して、Yの値をCにしてあげれば完成ですね

私はここ2ヶ月くらい機械学習の勉強をしたりしていたので、ローカルに保存されている写真といえばあれしかないと思って、Lenaさんを表示しました。Lenaさんといえば、[実践 機械学習システム](https://www.amazon.co.jp/実践-機械学習システム-Willi-Richert/dp/4873116988)とか[ゼロから作るDeep Learning](https://www.amazon.co.jp/ゼロから作るDeep-Learning-―Pythonで学ぶディープラーニングの理論と実装-斎藤-康毅/dp/4873117585)で目にしましたね！
この人です！

![lena_gray.png](https://qiita-image-store.s3.amazonaws.com/0/76493/f725fdd8-71b1-ad7a-897a-14ebb851c986.png "lena_gray.png")

せっかくならこの綺麗なお姉さんを表示させよう！って感じです

正直、10行くらいのコードですが、最初何かわからないグラフが綺麗なお姉さんになるのは少し面白かったです

## 使ったもの

* Python 3.6.2
* matplotlib 2.0.2
* numpy
* (Axes3D)

matplotlibのscatter3Dを利用しました
scatter3Dは3次元データの散布図をプロットするための機能で、決してお姉さんを表示させるものではありません！

## コード

やってること

* 色々import
* 画像のロード,XとZ軸のメモリ(?)の用意,y軸の値の用意
	* matplotlibの散布図の

``` image_3d.py

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.image import imread
from mpl_toolkits.mplot3d import Axes3D

x = z = np.linspace(-100, 100, 256)
x , z = np.meshgrid(x, z)
y = (255 - imread('./lena_gray.png')*255) * 10 #バラけさせたい

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(np.ravel(x), np.ravel(z), np.ravel(y),s=10,marker='.')
ax.set_title("image")
plt.show()

```

## 実行結果

こんな感じです

![実行結果](https://qiita-image-store.s3.amazonaws.com/0/76493/5bbc231a-75f5-ac0d-cc38-118bab4373f7.png "スクリーンショット 2017-10-19 21.43.02.png")

なんとも残念なことに、視点が決まってるんだからお姉さんの跡形もありませんね。

でもここからが1つすごいところなんですが
グラフ上をドラッグすることで、視点移動できるんですね！！

ちょっとドラッグしてお姉さんを頑張って呼び出して見ましょう！！

## 綺麗なお姉さんを探求して...

ドラッグしてみるとこんな感じになりました

![スクリーンショット 2017-10-19 21.43.54.png](https://qiita-image-store.s3.amazonaws.com/0/76493/a63b3d4a-8cba-c3fc-947a-5eb800fbf5fa.png "スクリーンショット 2017-10-19 21.43.54.png")

どうです...?なんか、見えてきましたよね！！
もっともっと回転させていきましょう！！

![スクリーンショット 2017-10-19 21.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/76493/f3d678fd-d49e-43ef-c2e0-500f452d00c8.png "スクリーンショット 2017-10-19 21.44.11.png")

だいぶ上から見てるのでのっぺりとしていますが、紛れもなくLenaさんですね！
画面に対して随分とグラフが小さいので、一工夫しましょう！

左下にあるこのメニューの右から二番目のスライダー的なアイコンをクリックしてください！

![スクリーンショット 2017-10-19 21.45.33.png](https://qiita-image-store.s3.amazonaws.com/0/76493/b3824545-8fda-c900-605e-c5699aa058c8.png "スクリーンショット 2017-10-19 21.45.33.png")

そうすると次のようなウィンドウが表示されるので
グラフの左右上下の画面の端からの距離を移動させて、拡大させましょう！
感覚、CSSの設定みたいな感じですかね...

![スクリーンショット 2017-10-19 21.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/76493/bd7d9279-61cd-b274-c5bd-fdfc8e049bef.png "スクリーンショット 2017-10-19 21.45.27.png")

こんな感じになりました！！
こんにちはLenaさん！！

![スクリーンショット 2017-10-19 21.45.40.png](https://qiita-image-store.s3.amazonaws.com/0/76493/b7d2dc43-70ab-9589-31d7-198bc77c52e6.png "スクリーンショット 2017-10-19 21.45.40.png")

分かりにくいですが、写真立てみたいにするとこんな感じでした...

![スクリーンショット 2017-10-19 22.10.40.png](https://qiita-image-store.s3.amazonaws.com/0/76493/b03c5c34-3511-cb94-a4d5-a34a295dd363.png "スクリーンショット 2017-10-19 22.10.40.png")

## まとめ

matplotlibすごいですね、Lenaさんを綺麗に表示していい感じに立体感を出してくれました
皆さんも、ちょっとずつドラッグして綺麗なお姉さんを表示させて見てはどうでしょうか...?

## ついでに

色付けもして見ました

``` coloredImage_3d.py

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.image import imread
from mpl_toolkits.mplot3d import Axes3D

x = z = np.linspace(-100, 100, 256)
x , z = np.meshgrid(x, z)
img = imread('./lena_gray.png')
y = (255 - img*255) * 3

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(np.ravel(x), np.ravel(z), np.ravel(y),marker='.',c=img)
ax.set_title("image")
plt.show()

```


![スクリーンショット 2017-10-19 23.08.36.png](https://qiita-image-store.s3.amazonaws.com/0/76493/42952287-5c17-7321-d9a7-5a75432e9886.png "スクリーンショット 2017-10-19 23.08.36.png")

``` 

ax.scatter3D(np.ravel(x), np.ravel(z), np.ravel(y),marker='.',c=img,cmap="binary")

```

としてあげれば
![スクリーンショット 2017-10-19 23.39.53.png](https://qiita-image-store.s3.amazonaws.com/0/76493/7f43d08b-4554-800d-922b-310de3c25d35.png "スクリーンショット 2017-10-19 23.39.53.png")

![スクリーンショット 2017-10-19 23.42.27.png](https://qiita-image-store.s3.amazonaws.com/0/76493/49461cb0-999c-b6a2-728d-e04187a338ac.png "スクリーンショット 2017-10-19 23.42.27.png")

こんな感じになります！

左のほうにあるのは海溝ですかね...