Python 2.7 填充三维numpy遮罩

Python 2.7 填充三维numpy遮罩,python-2.7,numpy,geometry,Python 2.7,Numpy,Geometry,我有一个二进制(0-1)3D numpy数组,我计划用它来屏蔽3D图像。此时的面罩位于圆柱体区域。面的两个中心是两个任意点,轴不平行于x、y或z。 如何用纯numpy溶液填充圆柱体?如果您标记了表面单元,但没有其他信息,则逐层扫描阵列以获得第一个标记的单元(或获得一些已知的表面单元) 标记[z,y,x]曲面单元后,在最后一个尺寸(x)1d数组中填充线,直到满足新的标记单元 然后在同一顶层(相同的z,接近y和x)中找到相邻的标记单元,重复填充线,直到填充整个截面(椭圆或切割椭圆),然后继续下一个z

我有一个二进制(0-1)3D numpy数组,我计划用它来屏蔽3D图像。此时的面罩位于圆柱体区域。面的两个中心是两个任意点,轴不平行于x、y或z。
如何用纯numpy溶液填充圆柱体?

如果您标记了表面单元,但没有其他信息,则逐层扫描阵列以获得第一个标记的单元(或获得一些已知的表面单元)

标记[z,y,x]曲面单元后,在最后一个尺寸(x)1d数组中填充线,直到满足新的标记单元

然后在同一顶层(相同的z,接近y和x)中找到相邻的标记单元,重复填充线,直到填充整个截面(椭圆或切割椭圆),然后继续下一个z层

编辑

也许我把问题复杂化了,泛光填充算法是一个简单的解决方案。

如果您标记了表面单元,并且没有其他信息,那么逐层扫描阵列以获得第一个标记的单元(或者获得一些已知的表面单元)

标记[z,y,x]曲面单元后,在最后一个尺寸(x)1d数组中填充线,直到满足新的标记单元

然后在同一顶层(相同的z,接近y和x)中找到相邻的标记单元,重复填充线,直到填充整个截面(椭圆或切割椭圆),然后继续下一个z层

编辑

也许我把问题复杂化了,洪水填充算法是一个简单的解决方案。

编辑:
pymrt。几何体已被删除,取而代之的是


假设圆柱体是凸面形状,则可以循环通过除1维以外的所有维度,并将问题减少到1D。在那里(在1D中),很容易编写一种有效的填补空白的方法,因为本质上,所需要的就是找到边界的位置(可以使用
numpy.where()
)然后从最小坐标和最大坐标填充所有内容

这在中针对N维问题实现(在
pypi
版本中尚不可用,需要从Bitbucket repo中获取)。 免责声明,我是它的主要作者

简而言之,(简化的)代码(适用于3D)如下所示:

def fill_convex(arr):
    for i in range(arr.shape[1]):
        for j in range(arr.shape[2]):
            mask = slice(None), slice(i, i + 1), slice(j, j + 1)
            line = arr[mask]
            k = np.where(line > 0)[0]
            if len(k):
                start, stop = np.min(k), np.max(k)
                line[start:stop] = 1
    return arr
要在混凝土(但二维而非圆柱形/椭圆形)示例上查看此操作,请执行以下操作:


编辑
pymrt。几何图形
已删除,以支持


假设圆柱体是凸面形状,则可以循环通过除1维以外的所有维度,并将问题减少到1D。在那里(在1D中),很容易编写一种有效的填补空白的方法,因为本质上,所需要的就是找到边界的位置(可以使用
numpy.where()
)然后从最小坐标和最大坐标填充所有内容

这在中针对N维问题实现(在
pypi
版本中尚不可用,需要从Bitbucket repo中获取)。 免责声明,我是它的主要作者

简而言之,(简化的)代码(适用于3D)如下所示:

def fill_convex(arr):
    for i in range(arr.shape[1]):
        for j in range(arr.shape[2]):
            mask = slice(None), slice(i, i + 1), slice(j, j + 1)
            line = arr[mask]
            k = np.where(line > 0)[0]
            if len(k):
                start, stop = np.min(k), np.max(k)
                line[start:stop] = 1
    return arr
要在混凝土(但二维而非圆柱形/椭圆形)示例上查看此操作,请执行以下操作:


您需要标记表面单元(提到的区域)还是填充体积?圆柱体相对于所有阵列有多大?@MBo我需要填充圆柱体以屏蔽其所有体积。圆柱体大约是所有阵列的1/100。您是否已经有圆柱体表面的坐标(或遮罩),或者您是否有分析说明(方向、高度、半径、中心位置)?是否要填充许多不同的圆柱体?我问这个问题是因为遍历所有细胞并标记其中的细胞比进行圆柱体体素化要简单得多。@MBo我已经有了曲面的遮罩,是的,给定两点,我应该能够构建各种圆柱体。不过,后者不是问题,因为我有算法来做。你需要标记表面单元(提到的区域)还是填充体积?圆柱体相对于所有阵列有多大?@MBo我需要填充圆柱体以屏蔽其所有体积。圆柱体大约是所有阵列的1/100。您是否已经有圆柱体表面的坐标(或遮罩),或者您是否有分析说明(方向、高度、半径、中心位置)?是否要填充许多不同的圆柱体?我问这个问题是因为遍历所有细胞并标记其中的细胞比进行圆柱体体素化要简单得多。@MBo我已经有了曲面的遮罩,是的,给定两点,我应该能够构建各种圆柱体。不过,后者不是问题,因为我有算法来做。谢谢!正因为如此,Python高手为您只能想象的每种情况制作了很好的库;)谢谢正因为如此,Python高手为您只能想象的每种情况制作了很好的库;)谢谢我来检查一下泛洪填充牙链!我也会检查洪水的