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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

Q&A

解決済

1回答

5306閲覧

3次元配列を表示したい

dendendenjirou

総合スコア41

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

0グッド

0クリップ

投稿2020/05/12 11:11

編集2020/05/12 12:37

目的

画像を扱っています。
画像枚数200枚程度、ピクセルが380×380程度の画像を
画像を積み上げて立体的な信号分布を捉えたいと考えています。

3Dの散布図にて、
X軸:ピクセル横軸
Y軸:ピクセル縦軸
Z軸:画像番号

配列は(画像番号、横軸ピクセル、縦軸ピクセル)で軸を取りたいと考えております。

1枚の画像を選択した際に表示上問題ないのですが、複数枚表示しようとするとZ軸の1断面内に複数の画像が載ってきてしまいます。

画像が積みあがっていくような感じで表示するためにはどのようにしたらいいのか、分からず困っております。

イメージ説明イメージ説明

python

1# -*- coding: utf-8 -*- 2 3import fileselect as fs 4import pydicom 5import numpy as np 6import cv2 7import matplotlib.pyplot as plt 8from mpl_toolkits.mplot3d import Axes3D 9 10filename = fs.many_files() 11 12dcm =pydicom.dcmread(filename[0]) 13row, columns = dcm.pixel_array.shape[0], dcm.pixel_array.shape[1] 14 15pix = np.zeros((len(filename),row//3,columns//3),dtype='int16') 16 17for i in range(len(filename)): 18 dcm = pydicom.dcmread(filename[i]) 19 pix[i] = cv2.resize(dcm.pixel_array,(row//3,columns//3)) 20 21x_list = np.arange(int(row//3)) 22y_list = np.arange(int(columns//3)) 23z_list = np.arange(len(filename)) 24 25 26Z,X,Y=np.meshgrid(z_list,x_list,y_list) 27 28fig = plt.figure() 29ax = fig.add_subplot(111, projection='3d') 30 31ax.set_xlabel("x",labelpad=20,fontsize=8) 32ax.set_ylabel("y",labelpad=50,fontsize=8) 33ax.set_zlabel("z",labelpad=50,fontsize=8) 34 35ax.set_xlim(row//3,0) 36ax.set_ylim(0,columns//3) 37ax.set_zlim(0,len(filename)) 38 39sc = ax.scatter(Y.ravel(),X.ravel(),Z.ravel(), c = pix.ravel(),alpha=0.1,zdir='z', cmap='PuRd') 40 41fig.colorbar(sc) 42ax.view_init(elev=0, azim=0) 43plt.show()

どなたか、ご教授いただけないでしょうか。
よろしくお願いいたします。

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

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

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

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

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

coco_bauer

2020/05/12 11:22

Z軸を、画像枚数ではなく、画像枚数x画像の厚さにすると3D的になるのではないでしょうか? 出来上がりが200枚の画像で厚さ1.0の立体なのだとすれば、1枚の画像の厚さを0.005ということになります。 Z軸を画像枚数にするから、下から0の位置に1枚目の画像、下から1の位置に2枚目の画像、というように(下側の画像のように)飛び飛びになってしまうのだと思われます
dendendenjirou

2020/05/12 12:32

追記・修正依頼ありがとうございます。 今回の質問の主旨は、 まず、1枚の画像は上の画像(頭部CT画像)です。 下の画像でz軸0.0と1.0の高さにそれぞれ2枚のCT画像が表示されています。 Z軸それぞれの高さに1枚の画像(1枚目の画像)の様に表示させたいという事であります。 言葉足らずで申し訳ございません。 ただ、今後volumerendering等のプログラミングを考えております。 今回の修正依頼は非常に役に立ちました。 ありがとうございます。
guest

回答1

0

自己解決

問題はmeshgridのパラメータ設定でした。

python

1Z,X,Y=np.meshgrid(z_list,x_list,y_list) 2 3>> X.shape 4>> (170, 3, 170) 5>> Y.shape 6>> (170, 3, 170) 7>> Z.shape 8>> (170, 3, 170)

だったので、indexingの設定を'ij'と指定したところ

python

1Z,Y,X=np.meshgrid(z_list,y_list,x_list,indexing='ij') 2 3>> X.shape 4>> (3, 170, 170) 5>> Y.shape 6>> (3, 170, 170) 7>> Z.shape 8>> (3, 170, 170)

と配列の次元と合うことになり問題を解決することができました。

イメージ説明

投稿2020/05/12 21:47

編集2020/05/12 21:48
dendendenjirou

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問