目的
画像を扱っています。
画像枚数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()
どなたか、ご教授いただけないでしょうか。
よろしくお願いいたします。
Z軸を、画像枚数ではなく、画像枚数x画像の厚さにすると3D的になるのではないでしょうか?
出来上がりが200枚の画像で厚さ1.0の立体なのだとすれば、1枚の画像の厚さを0.005ということになります。
Z軸を画像枚数にするから、下から0の位置に1枚目の画像、下から1の位置に2枚目の画像、というように(下側の画像のように)飛び飛びになってしまうのだと思われます
追記・修正依頼ありがとうございます。
今回の質問の主旨は、
まず、1枚の画像は上の画像(頭部CT画像)です。
下の画像でz軸0.0と1.0の高さにそれぞれ2枚のCT画像が表示されています。
Z軸それぞれの高さに1枚の画像(1枚目の画像)の様に表示させたいという事であります。
言葉足らずで申し訳ございません。
ただ、今後volumerendering等のプログラミングを考えております。
今回の修正依頼は非常に役に立ちました。
ありがとうございます。
回答1件