将凸包转换为二进制掩码

时间:2010-05-04 21:35:17

标签: matlab geometry convex-hull

我想生成一个二进制掩码,其中包含所有体素内部的一个,并且对于体积外的所有体素都有零。体积由围绕一组3D坐标的凸包定义(<100;一些坐标在体积内)。

我可以使用CONVHULLN获取凸包,但是如何将其转换为二进制蒙版?

如果没有通过凸包的好方法,你还有其他想法如何创建二进制掩码吗?

3 个答案:

答案 0 :(得分:8)

您可以使用DelaunayTri classpointLocation 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

上面的例子为跨越单位体积的101×101×101网格创建了一个逻辑掩模(每个维度为0到1),凸包内的网格点为1(真)。三维点集。

答案 1 :(得分:2)

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

  1. 使用凸包的点构建Delaunay曲面细分。
  2. 使用DelaunayTri类的pointLocation方法测试像素数组中的每个点。
  3. 我希望这会非常缓慢,并且有更好的解决方案,如果有一个梦想我将在明天再次发布。

答案 2 :(得分:0)

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

你想要的算法是实心算法,并且稍微简单一些,因为你是一个面部是三角形的凸多面体的体素化 - 每个“体素”运行都是由两个三角形限定的。