我想生成一个二进制掩码,其中所有体素都为一个,而体积外的所有体素为零。体积由一组 3D 坐标(<100;一些坐标在体积内)周围的凸包定义。
我可以使用CONVHULLN获得凸包,但是如何将其转换为二进制掩码?
如果没有通过凸包的好方法,您还有其他想法如何创建二进制掩码吗?
我想生成一个二进制掩码,其中所有体素都为一个,而体积外的所有体素为零。体积由一组 3D 坐标(<100;一些坐标在体积内)周围的凸包定义。
我可以使用CONVHULLN获得凸包,但是如何将其转换为二进制掩码?
如果没有通过凸包的好方法,您还有其他想法如何创建二进制掩码吗?
您可以使用DelaunayTri类和pointLocation方法解决此问题。这是一个例子:
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点集。
这里已经很晚了,所以只有一个非常粗略的建议:
我希望这会很慢,并且有更好的解决方案,如果我梦到了,我明天会再次发布。
这是一个扫描转换问题。查看3D Scan-Conversion Algorithms for Voxel-Based Graphics 的第 8 节。
您想要的算法是实心算法,并且稍微简单一些,因为您正在对面是三角形的凸多面体进行体素化 - 每个“体素”运行都由两个三角形界定。