2015-03-16 2 views
2

Я пытаюсь определить площадь поверхности трехмерного тома с использованием изоповерхностей в Python с использованием pyqtgraph и numpy. Проблема заключается не в генерации изоповерхности, а в вычислении площади от векторов.Перекрестный продукт по сравнению с детерминантом

Если понимать правильно, величина перекрестного произведения из двух векторов (A X B) представляет собой площадь определяемого ими парареллограммы. Аналогично, определитель матрицы 3x3, где первая строка является единичным вектором, определяет площадь параболограма векторов, определяемых двумя другими строками.

Я использую следующий код, но я получаю разные ответы (хотя такой же величины)

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

Я думаю, что способ, с помощью которого назначаются значения индекса 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, ::]) 

Для определителя, чтобы представлять область, векторы должны быть определены по строке матрицы, но вы присваиваете вектор руку к столбец матрицы

+0

Нет, это не так. tryges - большой стек n x 3 x 3, где n представляет количество треугольников и оценивается вдоль 0-го столбца. Смотрите скриншот: http://imgur.com/V1w34bb – Nash

Смежные вопросы