[英]Masking a 3D numpy array with a tilted disc
我正在使用具有3D numpy數組的Python2.7,並嘗試僅檢索落在2D傾斜光盤上的像素。
這是我的代碼,用於繪制我感興趣的光盤邊界(=圓)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#creating a 3d numpy array (empty in this example, but will represent a binary 3D image in my application)
space=np.zeros((40,40,20))
r = 8 #radius of the circle
theta = np.pi / 4 # "tilt" of the circle
phirange = np.linspace(0, 2 * np.pi) #to make a full circle
#center of the circle
center=[20,20,10]
#computing the values of the circle in spherical coordinates and converting them
#back to cartesian
for phi in phirange:
x = r * np.cos(theta) * np.cos(phi) + center[0]
y= r*np.sin(phi) + center[1]
z= r*np.sin(theta)* np.cos(phi) + center[2]
space[int(round(x)),int(round(y)),int(round(z))]=1
x,y,z = space.nonzero()
#plotting
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, zdir='z', c= 'red')
plt.show()
該圖給出了下圖:
這是一個好的開始,但是現在我想要一種方法,僅檢索位於圓所定義的光盤中的space
像素的值:下圖中粉紅色區域中的像素值(在我的應用程序中, space
將是3D二進制圖像,這里是numpy.zeros()只是為了能夠繪制並向您顯示我想要的光盤):
我應該如何進行? 我猜想其中涉及一些麻木的蒙版,我了解您將如何在2D中進行處理( 如此問題 ),但在將其應用於3D時遇到了麻煩。
這是一個數學問題,您應該在Mathematics Stack Exchange網站上提出。
從我的角度來看,您應該首先找到光盤所在的表面,然后通過例如在鏈接的問題中提到的方法在該表面內進行面積計算。
numpy
或matplotlib
在這里絕對不負責投影,您負責。
如果沒有明確指出它們處於哪個(或哪種)表面中,並且該方程式不能保證它是一個平面,則面積並不表示任何東西。
一種簡單的方法是計算光盤平面的法線向量。 您可以為此使用球坐標。 確保不要添加中心,將phi設置為零,並交換cos和sin theta,也要在正負號上加上減號。
讓我們稱該向量為v。平面由v0 * x0 + v1 * x1 + v2 * x2 == c給出,您可以通過從圓中為x插入一個點來計算c。
接下來,您可以為x0和x1制作2d網格並求解x2。 這使您獲得的高度x2是x0,x1網格的函數。 對於這些點,您可以計算到光盤中心的距離,並丟棄距離太遠的點。 您確實會使用遮罩做到這一點。
最后,根據要繪制的精度,可以將x2值四舍五入為網格單位,但是例如對於曲面圖,我不會這樣做。
要獲得您所描述的3d蒙版,您需要對x2進行四舍五入,然后從全零的空間開始,使用space [x0,x1,x2] = True設置光盤像素。 假定您已屏蔽了x0,x1,x2,如前所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.