2017-02-17 10 views
0

我正在使用3D numpy陣列在Python2.7中工作,並試圖僅檢索落在2D傾斜光盤上的像素。用傾斜光盤遮掩3D numpy陣列

這裏是我的代碼繪製盤的邊界(=圓)我感興趣的

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() 

情節給出瞭如下圖所示:

circle

這是一個好的開始,但現在我想要一種方法來檢索位於由圓定義的光盤中的space的像素值:下圖中粉紅色區域中的像素值(在我的應用程序中,space將是一個三維二值圖像,這裏是numpy.zeros()僅僅是爲了能夠繪製,告訴你我想要的光盤):

disc

我應該如何PROCEDE? 我想有一些numpy的蒙版參與,我明白你會怎麼做在2D(如this question),但我有麻煩應用到3D。

+0

你是什麼意思的「跌倒」?如果一個像素是一個點,不能保證它完全與飛機相交,更不用說在一個圓內。你是否想要看一個高度爲1的圓柱體? – Eric

+0

是的,我意識到這一點,使用逼近對於這個應用程序來說很好,因此我在代碼中顯示round():圖上的點近似地在一個圓上。我想你可以說這相當於在1像素高的圓柱體中尋找點數,是的。 – Soltius

回答

1

一個簡單的方法是計算光盤平面的法向量。你可以使用你的球形座標。確保不是添加中心,將phi設置爲零,並且交換cos和sin theta,也將負號貼在罪行上。

可以稱之爲載體訴平面由V0給出* X0 + V1 * X1 + V2 * X2 == C可以將您的圓圈X點計算溫度。

接下來,您可以爲x0和x1製作2d網格並解析x2。這給你的高度x2作爲x0,x1網格的函數。對於這些點,您可以計算與光盤中心的距離,並丟棄距離太遠的點。這你確實會使用一個面具。

最後,取決於你想要如何精確地繪製,你可以圓的X2值網格單元,但例如用於表面圖,我不會那樣做。

爲了得到一個3D面膜爲你描述你是圓X2,然後從所有零空間開始設置使用空間的光盤像素[X0,X1,X2] = TRUE。這假定您已經如前所述屏蔽了x0,x1,x2。

+0

感謝您的輸入,這使我走向了正確的方向。我沒有完全按照你的建議去做,但是我的代碼是基於計算法向量等的。更確切地說,我使用http://demonstrations.wolfram.com/ParametricEquationOfACircleIn3D/中的技術來獲取外部圓的參數化。然後,我剛從0到我的maxradius半徑處獲得一張光盤! – Soltius

1

那麼這是一個數學問題,你應該問它在Mathematics Stack Exchange網站。

從我的角度來看,你應該先找到面光盤中,並且表面內做的面積計算,通過,例如,該方法在你所鏈接的問題中提到。

numpymatplotlib這裏絕對不負責的投影,你怎麼做。

沒有明確指出哪些(或哪一種)表面他們在和方程並不能保證它是一個平面,面積並不意味着什麼。