我正在使用Scipy从3D数据(矢量200x200x200)中渲染平面。我可以通过2个矢量或矢量和一个Angular 指定所需的平面。我想从这个3D体积中提取这样一个任意切片。我发现如何在Matlab中完成:http://www.mathworks.com/help/techdoc/ref/slice.html我如何在Scipy中执行此操作?
我正在使用Scipy从3D数据(矢量200x200x200)中渲染平面。我可以通过2个矢量或矢量和一个Angular 指定所需的平面。我想从这个3D体积中提取这样一个任意切片。我发现如何在Matlab中完成:http://www.mathworks.com/help/techdoc/ref/slice.html我如何在Scipy中执行此操作?
3条答案
按热度按时间v8wbuo2f1#
你可以使用scipy.ndimage.interpolation.rotate来旋转你的3d数组到你想要的任何Angular (它使用样条插值),然后你可以从它中取出一个切片。
kyxcudwk2#
def extract_slice(数据,三元组):
““”
算法:
1.查找平面与数据标注栏边得交点
2.对于这些pts,找到面向轴的b-box
3.求出从R2到R3的“反向”反式(A,T),如X“= AX + T
使用(0,0),(0,h),(w,0)这三个易于计算的参数
4.对2D(w,h)图像中的每个值使用变换(使用三线性插值)
““”
我将在几个月内适当地发布代码,我相信作为这个项目的一部分。
fykwrbwg3#
我正在处理与OP类似的任务,因此我提出了基于numpy(而不是scipy)的代码,以从体积中提取任何给定切片,给定平面上任何点的位置矢量和三个正交方向矢量。
我很抱歉我的答复太长,但考虑到问题的复杂性,我认为最好是提供这么多的细节。
对于我的特殊问题,这些矢量以mm而不是像素为单位定义,因此间距(即每个方向上两个连续体积像素之间的距离)也用作输入。我使用了最近邻方法来插值切片的亚像素点。
reslice_volume (volume, spacing, o1, o2, n, pos)
这个算法的主要步骤如下。注意,我可以互换使用平面和切片:
1.获得所需平面和体积边界之间的交线。
2.获得这些线之间的交点,这些交点足够接近体积的边界,以被视为平面和体积之间的交点的角。
**3.**将找到的点转换到切片的参考系(sRF)(我们可以在切片平面内任意地将RF居中)。
4.****获得穿过这些点的最小x和y坐标并定义将被用作平面/切片的原点的角点。将该原点变换回体积的RF(vRF)并定义新的变换矩阵,其将RF从vRF变换到sRF,但现在以所述原点为中心。
5.根据这些切片内点坐标,我们可以确定切片的大小,然后使用它来生成目标切片的所有可能的切片内索引。
6.下一步是使用新定义的变换矩阵(步骤4)来将每个可能的切片内索引Map到卷的参考帧。
7.现在,我们有了切片包含的所有vRF坐标,这些坐标应立即转换为像素值,方法是将它们除以各自的间距。在这一步,我们发现,当切片经过体积的子像素位置时,我们最终得到非整数像素值。我们将像素值四舍五入到其最接近的整数- * 最近邻插值 *。
**8.**接下来,我们确定切片的哪些像素实际上在体积的边界内,并得到它们的值。体积外的像素被填充为0。
为了更加清晰,我添加了一个图。在这里,体积由黑色的边界框定义。切片与由框/体积的面定义的平面的线交叉点用橙子虚线表示。蓝色表示前面的线之间的交叉点。粉红色的点属于切片,橙色的点属于切片,并且在体积内。
在我的例子中,我处理的是MRI体积,所以作为例子,我添加了体积的结果切片。