Просто к вашему сведению, у нас есть давний 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.