这似乎是一个非常简单的问题,而且我无法找到罐装解决方案。本质上,这将是3d
profile_line的skimage.measure
等效项
考虑矩阵A,其维度为(i,j,k)。每个矩阵元素都是一个数字。实际上,将其视为三维三维温度分布。
我想通过此数据从点(i_1,j_1,k_1)到(i_2,j_2,k_2)提取线轮廓(光线跟踪线)的有效方法。或者,类似地,使用极坐标中的theta,phi和半径定义起始点(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)
最佳答案
仅供参考,我们对3D profile_line
here具有长期的PR。您可能会在这里找到灵感。
但是,尚未将其合并的困难和原因是,如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。