我想生成一个二进制掩码,其中包含所有体素内部的一个,并且对于体积外的所有体素都有零。体积由围绕一组3D坐标的凸包定义(<100;一些坐标在体积内)。
我可以使用CONVHULLN获取凸包,但是如何将其转换为二进制蒙版?
如果没有通过凸包的好方法,你还有其他想法如何创建二进制掩码吗?
答案 0 :(得分:8)
您可以使用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
上面的例子为跨越单位体积的101×101×101网格创建了一个逻辑掩模(每个维度为0到1),凸包内的网格点为1(真)。三维点集。
答案 1 :(得分:2)
现在已经很晚了,所以只有一个非常粗略的建议:
我希望这会非常缓慢,并且有更好的解决方案,如果有一个梦想我将在明天再次发布。
答案 2 :(得分:0)
这是扫描转换问题。查看3D Scan-Conversion Algorithms for Voxel-Based Graphics的第8部分。
你想要的算法是实心算法,并且稍微简单一些,因为你是一个面部是三角形的凸多面体的体素化 - 每个“体素”运行都是由两个三角形限定的。