我正在调查https://scikit-image.org/docs/dev/api/skimage.draw.html#skimage.draw.ellipseskimage.draw.ellipsoid_stats(a, b, c)
声称,我引用
计算半长轴与指定间距的网格尺寸对齐的椭球体的分析表面积和体积。
但查看他们的代码,没有关于引入间距的信息。也许我错过了什么。
我的问题是:-在知道半径a, b, c
和网格间距的情况下,如何计算椭球体的体积?我正在处理DICOM CT体积,这些体积具有不同的间距。
def ellipsoid_stats(a, b, c):
"""
Calculates analytical surface area and volume for ellipsoid with
semimajor axes aligned with grid dimensions of specified `spacing`.
Parameters
----------
a : float
Length of semimajor axis aligned with x-axis.
b : float
Length of semimajor axis aligned with y-axis.
c : float
Length of semimajor axis aligned with z-axis.
Returns
-------
vol : float
Calculated volume of ellipsoid.
surf : float
Calculated surface area of ellipsoid.
"""
if (a <= 0) or (b <= 0) or (c <= 0):
raise ValueError('Parameters a, b, and c must all be > 0')
# Calculate volume & surface area
# Surface calculation requires a >= b >= c and a != c.
abc = [a, b, c]
abc.sort(reverse=True)
a = abc[0]
b = abc[1]
c = abc[2]
# Volume
vol = 4 / 3. * np.pi * a * b * c
# Analytical ellipsoid surface area
phi = np.arcsin((1. - (c ** 2 / (a ** 2.))) ** 0.5)
d = float((a ** 2 - c ** 2) ** 0.5)
m = (a ** 2 * (b ** 2 - c ** 2) /
float(b ** 2 * (a ** 2 - c ** 2)))
F = ellip_F(phi, m)
E = ellip_E(phi, m)
surf = 2 * np.pi * (c ** 2 +
b * c ** 2 / d * F +
b * d * E)
return vol, surf
scikit函数以像素为单位提供结果-因此,表面积以像素表示(如果您有2D图像(,体积以像素^2表示。
对于图像,要将其转换为mm,对于CT图像,则需要查找PixelSpacing标签,以获得每个像素的大小(以mm为单位(,并使用它来转换单位。
如果你使用的是pydicom,那么你可以使用.PixelSpacing[0]。PixelSpacing是一个2元素的列表,但我知道的所有CT都有相同的行/列像素间距,所以只使用列表PixelSpading[0]中的第一个元素就足够了。