質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

612閲覧

2Dマップを用いた3Dマップの作成手法について

aoisora

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/07/05 05:08

前提・実現したいこと

このような勾配を表した2次元の図を用いて、3次元のマップを作成したいと考えています。
(グラフの青色の部分から赤色の部分に向けて山なり)
初歩的な質問になってしまい申し訳ありませんが、よろしければご教授ください。

イメージ説明

該当のソースコード

Python

1from mpl_toolkits.mplot3d import Axes3D 2from matplotlib import pylab as pl 3from PIL import Image 4import numpy as np 5import pylab 6 7img = Image.open('rei.jpg').convert('L') 8z = np.asarray(im_gray) 9print(np.shape(z)) 10mydata = z[::1,::1] 11fig = pl.figure(facecolor='w') 12ax1 = fig.add_subplot(1,2,1) 13im = ax1.imshow(mydata,interpolation='nearest',cmap=pl.cm.jet) 14ax1.set_title('2D') 15 16ax2 = fig.add_subplot(1,2,2,projection='3d') 17x,y = np.mgrid[:mydata.shape[0],:mydata.shape[1]] 18ax2.plot_surface(x,y,mydata,cmap=pl.cm.hot,rstride=1,cstride=1,linewidth=0.,antialiased=False) 19ax2.set_title('3D') 20ax2.set_zlim3d(0,100) 21pl.show()

試したこと

画像の表示をjetを用いることで勾配が表現されるのではないかと考えましたが、画像を読みこむ段階でconvertを用いて
グレースケールにしているため、図中の赤でも青でもない(黄緑色)部分が勾配としてうまく表現されませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

グレースケールでは画像の情報(z軸方向)を正確に取り込めません(用いているcolormapにもよると思いますが).特に理由が無いのであればRGBの3次元データで解析するべきだと思います.
参考 Choosing Colormaps

"勾配を表した"が,"標高を表した"として以下のような提案をしています.
もし,"勾配"であったとしても,元データを再構成すれば目的のプロットは作れると思うので,良ければ参考にしてください.


  • 元データがある場合(質問はこれに該当しないと思うが).

1, そのまま3次元プロット.


  • 2次元プロットを作成した状況(例えばmatplotlibでcolormapはjetなど)が分かる場合(かつ元データは不明).

1, 画像をグレースケールにせず取り込む.
2, jet等のcolormapのRGBの値に画像のRGBを当てはめて相対値(01)を得る.
3, 各ピクセルで作業を繰り返し,2次元プロットを自分で作成できる状況に持っていく.
4, 3次元プロットを作成する.
この場合,2に相当する関数RGB2Vのようなものを作れば良いと思います.(R,G,B) -> (0
1)の変換が簡単にできるapiがあるかはわかりませんが,(0~1) -> (R,G,B)というは例えばcm.hot(float)から得られるので,その逆関数を作れるかどうかが鍵でしょうか.原理的にはできる筈です.


  • プロット作成状況が不明の場合(ネットで拾った図など)

1, プロットを見てどのcolormapが使われているかを推測する.
2, 上記の場合と同様に処理.
この場合,colormapの推定で結果が大きく変わります.極端な例では赤と青の値を逆にすれば,山のような形からくぼんだ形になります.どれを選ぶかで大きなバイアスがかかるので,どんなところから拾ったプロットでもうまくいくプログラムを書くのは難しいと思います(機械学習等である程度実現できそうですが).


ここに挙げたのは画像から元データを(少なくとも相対的な関係を)推定する手法なので,非常に原始的なやり方です.自分で実装して無いので考えだけの回答になりますが,参考になれば幸いです.ダラダラとした文章で申し訳ありません.

投稿2018/07/08 03:34

winophy

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問