代码之家  ›  专栏  ›  技术社区  ›  Jonas

凸壳到二值掩模的转换

  •  3
  • Jonas  · 技术社区  · 15 年前

    我想生成一个二元掩码,其中一个用于所有体素,一个用于所有体素。体积由围绕一组三维坐标的凸面外壳定义(部分坐标在体积内)。

    我可以用 CONVHULLN ,但如何将其转换为二进制掩码?

    如果没有好的方法可以通过凸面外壳,你知道我如何创建二元掩模吗?

    3 回复  |  直到 15 年前
        1
  •  7
  •   gnovice    15 年前

    您可以使用 DelaunayTri class 以及 pointLocation method . 下面是一个例子:

    pointMatrix = rand(20,3);       %# A set of 20 random 3-D points
    dt = DelaunayTri(pointMatrix);  %# Create a Delaunay triangulation
    [X,Y,Z] = meshgrid(0:0.01:1);   %# Create a mesh of coordinates for your volume
    simplexIndex = pointLocation(dt,X(:),Y(:),Z(:));  %# Find index of simplex that
                                                      %#   each point is inside
    mask = ~isnan(simplexIndex);    %# Points outside the convex hull have a
                                    %#   simplex index of NaN
    mask = reshape(mask,size(X));   %# Reshape the mask to 101-by-101-by-101
    

    上面的示例为跨越单位体积(每个维度0到1)的101 x 101 x 101网格创建逻辑遮罩,对于三维点集的凸包内的网格点创建1(真)。

        2
  •  2
  •   High Performance Mark    15 年前

    现在很晚了,所以只有一个很粗略的建议:

    1. 利用凸面外壳上的点构造delaunay细分。
    2. 使用delaunaytri类的pointlocation方法测试像素数组中的每个点。

    我希望这将是非常缓慢的,并有更好的解决方案,如果有一个在我的梦想,我将再次张贴明天。

        3
  •  0
  •   brainjam    15 年前

    这是扫描转换问题。查看第8节 3D Scan-Conversion Algorithms for Voxel-Based Graphics .

    你想要的算法是实体的,并且稍微简单一点,因为你正在对一个凸多面体进行体素化,它的面是三角形-每个“体素”运行由两个三角形限定。