我正在尝试使用pyqtgraph和numpy在Python中使用isosurface来确定3D体积的表面积。问题不在于等值面的生成,而在于从向量计算面积。
如果理解正确,2个向量(A X B)的叉积的大小表示它们定义的平行四边形的面积。 类似地,3x3矩阵的行列式,其中第一行是单位向量,确定由其他2行定义的向量的平行四边形的面积。
我正在使用下面的代码,但我得到了不同的答案(尽管幅度相同)
np.linalg.norm(n, ord=1)
185088.05
triarea = (np.abs(np.linalg.det(triedges)))
tot = np.sum(triarea)
289059.69600568933 任何人对这里发生的事情都有任何想法?
以下是我正在使用的完整Python代码。
#import tiff file
print("Loading volume...")
img = tifffile.imread(r"C:\Users\Nachiket\Desktop\C1-confocal-series.tif")
print("Done")
print("Generating isosurface...")
verts, faces = pg.isosurface(img, img.max()/5.)
print("Done")
#creating an indexed array of vertices
tris = verts[faces]
#calculate area from normals
n = np.cross( tris[::,1 ] - tris[::,0] , tris[::,2 ] - tris[::,0] )
narea = np.linalg.norm(n, ord=1)
#calculate determinant using unit vectors
triedges = np.zeros(tris.shape)
triedges[::,0]=([[1,1,1]]) #unit vectors
triedges[::,1]=(tris[::,1] - tris[::,0])
triedges[::,2]=(tris[::,2] - tris[::,0])
triarea = np.abs(np.linalg.det(triedges))
tot = np.sum(np.abs(triarea))
答案 0 :(得分:0)
我认为分配tryges索引值的方式导致问题。
而不是这个
triedges[::,0]=([[1,1,1]]) #unit vectors
triedges[::,1]=(tris[::,1] - tris[::,0])
triedges[::,2]=(tris[::,2] - tris[::,0])
写
triedges[0, ::]=([[1,1,1]]) #unit vectors
triedges[1, ::]=(tris[1, ::] - tris[0, ::])
triedges[2, ::]=(tris[2, ::] - tris[0, ::])
对于表示区域的行列式,必须沿着矩阵的行定义向量,但是要将向量臂分配给矩阵的列