ボリューム内のすべてのボクセルに1があり、ボリュームの外側にあるすべてのボクセルに0があるバイナリマスクを生成したいと思います。ボリュームは、3D座標のセットの周りの凸包によって定義されます(<100;一部の座標はボリューム内にあります)。
CONVHULLNを使用して凸包を取得できますが、それをバイナリマスクに変換するにはどうすればよいですか?
凸包を通過する良い方法がない場合、バイナリマスクを作成する方法について他に何か考えがありますか?
ボリューム内のすべてのボクセルに1があり、ボリュームの外側にあるすべてのボクセルに0があるバイナリマスクを生成したいと思います。ボリュームは、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 x 101 x 101メッシュの論理マスクを作成し、3の凸包内のメッシュポイントに1(真)を使用します。 Dポイントセット。
ここでは遅いので、非常に大雑把な提案だけです。
これは非常に遅く、より良い解決策があると思います。夢の中に来たら、明日また投稿します。
これはスキャン変換の問題です。ボクセルベースのグラフィックス用の3Dスキャン変換アルゴリズムのセクション8を確認してください。
必要なアルゴリズムはソリッドアルゴリズムであり、面が三角形である凸多面体をボクセル化するため、少し単純です。各「ボクセル」実行は2つの三角形で囲まれています。