Как извлечь профиль линии (линия трассировки лучей) через трехмерную матрицу (ndarray 3-dim), указав начальную и конечную точку - PullRequest
1 голос
/ 12 апреля 2019

Это кажется довольно простой проблемой, и я не смог найти готового решения.По сути, это будет 3d эквивалент skimage.measure profile_line

Рассмотрим матрицу A с размерами (i, j, k).Каждый элемент матрицы является числом.В реальных условиях рассмотрим это вокселизированное трехмерное распределение температуры.

Я хотел бы получить эффективный метод для извлечения профиля линии (линии трассировки лучей) через эти данные из точки (i_1, j_1, k_1) в (i_2, j_2, k_2).Или, аналогичным образом, определяя начальную точку (i_1, j_1, k_1) и траекторию линии, используя тета, фи и радиус в полярных координатах.путь, но я был бы удовлетворен грубым приближением, которое выбирает ближайшие значения вокселей с регулярным размером шага (скажем, 0,1 * размер вокселя) вдоль линии трассировки лучей.

Помощь очень ценится.Я с удовольствием опишу по мере необходимости,

Было бы неплохо, если бы это сработало ..

from skimage.measure import profile_line

line = profile_line(3dim_ndarray, (i1,j1,k1), (i2,j2,k2))
print(line)

1 Ответ

0 голосов
/ 12 апреля 2019

Просто к вашему сведению, у нас есть давний PR для 3D profile_line здесь . Вы можете найти там вдохновение.

Однако сложность и причина, по которой он еще не был объединен, заключается в том, что усреднение по цилиндру сложнее, чем усреднение по прямоугольнику, как в profile_line (2D). Если вам не нужно усреднять, его легко реализовать с помощью SciPy:

import numpy as np
from scipy import ndimage as ndi, spatial

def profile_line(image, start_coords, end_coords, *,
                 spacing=1, order=0, endpoint=True):
    coords = []
    n_points = int(np.ceil(spatial.distance.euclidean(start_coords, end_coords)
                           / spacing))
    for s, e in zip(start_coords, end_coords):
        coords.append(np.linspace(s, e, n_points, endpoint=endpoint))
    profile = ndi.map_coordinates(image, coords, order=order)
    return profile

order - это порядок интерполяции: по умолчанию 0 выше, т.е. значение ближайшего вокселя, но может быть 1 (линейная интерполяция) или 3 (кубическая интерполяция). Лучший выбор зависит от ваших потребностей.

Также возможны различные варианты дизайна, например, вместо np.ceil вы можете вместо этого вычислить, какой должна быть конечная точка , чтобы сам интервал был точным. например если расстояние между началом и концом равно 2,5, то ваш профиль может содержать 3 точки и будет заканчиваться на 0,5 вокселя меньше конечной точки, которую вы указали. В приведенной выше реализации вы получите 3 очка между начальной и конечной точкой, но реальный интервал в итоге составит 2,5 / 3 = 0,8333 вместо 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...