Как draw.ellipsoid и ellipse_stats из sckimage.draw.ellipse работают с шагом сетки? - PullRequest
0 голосов
/ 20 февраля 2020

Я смотрю в https://scikit-image.org/docs/dev/api/skimage.draw.html#skimage .draw.ellipse и skimage.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

1 Ответ

0 голосов
/ 21 февраля 2020

Функции scikit дают вам результаты в виде пикселей - таким образом, площадь поверхности в терминах пикселей (если у вас есть 2D-изображение) и объем в терминах пикселей ^ 2.

Единицы у вас есть что для изображений, чтобы получить его в мм и мм ^ 2 для ваших изображений CT, вам нужно будет найти тег PixelSpacing, чтобы получить размер каждого пикселя в мм, и использовать его для преобразования единиц измерения.

Если вы используете pydicom, вы можете использовать .PixelSpacing [0]. PixelSpacing - это двухэлементный список, но все известные мне CT имеют одинаковый интервал между строками и столбцами, поэтому достаточно просто использовать первый элемент в списке PixelSpacing [0].

...