Я пытаюсь определить площадь поверхности трехмерного тома с использованием изоповерхностей в 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))
Нет, это не так. tryges - большой стек n x 3 x 3, где n представляет количество треугольников и оценивается вдоль 0-го столбца. Смотрите скриншот: http://imgur.com/V1w34bb – Nash