簡體   English   中英

用傾斜的光盤遮罩3D numpy陣列

[英]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網站上提出。

從我的角度來看,您應該首先找到光盤所在的表面,然后通過例如在鏈接的問題中提到的方法在該表面內進行面積計算。

numpymatplotlib在這里絕對不負責投影,您負責。

如果沒有明確指出它們處於哪個(或哪種)表面中,並且該方程式不能保證它是一個平面,則面積並不表示任何東西。

一種簡單的方法是計算光盤平面的法線向量。 您可以為此使用球坐標。 確保不要添加中心,將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM