4

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

我可以使用CONVHULLN获得凸包,但是如何将其转换为二进制掩码?

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

4

3 回答 3

9

您可以使用DelaunayTripointLocation方法解决此问题。这是一个例子:

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×101×101 网格创建了一个逻辑遮罩,其中 1(真)用于 3- 凸包内的网格点D点集。

于 2010-05-04T22:46:30.687 回答
2

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

  1. 使用凸包中的点构建 Delaunay 细分。
  2. 使用 DelaunayTri 类的 pointLocation 方法测试像素数组中的每个点。

我希望这会很慢,并且有更好的解决方案,如果我梦到了,我明天会再次发布。

于 2010-05-04T22:46:23.837 回答
1

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

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

于 2010-05-04T23:40:44.877 回答