图片缩略图

网格血管素化

版本1.20.0.0(134 KB)由 亚当一个
Voxelise一个三角形多边形网。
5.0
48级

47下载

更新2013年2月12日

查看版本历史记录

查看许可协议

多边形网状血管素化
=========================.

亚当·h·Aitkenhead
adam.aitkenhead@christie.nhs.uk
Christie NHS基金会信任

体素化闭合(即防水)三角形多边形网格。网格可以采用以下几种格式之一:在STL文件中;在包含面和顶点数据的结构中;在包含x、y、z坐标的三个3xN数组中;或者在单个Nx3x3阵列中定义N个面中每个面的顶点坐标。


用法:
= = = = = =

[gridOUTPUT, gridCOx gridCOy gridCOz] = VOXELISE (gridX, gridY、gridZ STLin, raydirection)

[gridOUTPUT, gridCOx gridCOy gridCOz] = VOXELISE (gridX, gridY、gridZ meshFV, raydirection)

[gridOUTPUT, gridCOx gridCOy gridCOz] = VOXELISE (gridX, gridY、gridZ meshX,网状的,meshZ, raydirection)

[gridOUTPUT, gridCOx gridCOy gridCOz] = VOXELISE (gridX, gridY、gridZ meshXYZ, raydirection)


输入参数
================

gridX -必选- 1xP array -网格X坐标列表。
或X方向上网格中的体内体数的整数。

gridY -必选- 1xQ array -网格Y坐标列表。
或网格中Y方向的体素的整数。

gridZ -必选- 1xR array -网格Z坐标列表。
OR整数- Z方向上网格中的体素数。

STLin -可选- string STL文件的文件名。

meshFV - Optional - structure -包含网格的面和顶点的结构,格式与isosurface命令生成的格式相同。

meshX -可选- 3xN数组-每个N个平面的3个顶点的网格X坐标列表
meshY -可选- 3xN数组-每个N个平面的3个顶点的网格Y坐标列表
meshz - 可选 - 3xn array - 网格z坐标列表,用于每个小平面的3个顶点

meshXYZ -可选- Nx3x3数组-每个facet的顶点位置,包括:
每个方面1行
三列表示x y z坐标
三个顶点的3页

raydirection—可选—String—定义在哪个方向执行光线跟踪。默认是'xyz',它在x,y,z方向上跟踪并组合结果。


输出参数
=================

gridOUTPUT-必填-PxQxR逻辑阵列-体素化数据(1=>网格内部,0=>网格外部)

gridCOx -可选- 1xP array -网格X坐标列表。
gridCOy -可选- 1xQ数组-网格Y坐标列表。
gridCOz -可选- 1xR数组-网格Z坐标列表。


例子
========

将STL文件体素化:
>> [gridOUTPUT] = VOXELISE(gridX,gridY,gridZ,STLin) / /输出

voxelise由包含面和顶点的结构定义的网格:
>> [gridOUTPUT] = VOXELISE(gridX,gridY,gridZ,meshFV) / /输出

要对x、y、z坐标由三个3xN阵列定义的网格进行体素化,请执行以下操作:
>>[gridOUTPUT]=体素化(gridX、gridY、gridZ、meshX、meshY、meshZ)

对Voxelise由单个NX3X3阵列定义的网格:
>> [gridOUTPUT] = VOXELISE(gridX,gridY,gridZ,meshXYZ)

也可以输出X,Y,Z坐标列表:
>> [gridOUTPUT,gridCOx,gridCOy,gridCOz] = VOXELISE(gridX,gridY,gridZ,STLin) / /输出

只在z方向使用光线追踪:
>> [GridOutput] =体素(Gridx,Gridy,Gridz,Stlin,'Z')


笔记
=====

-定义射线方向='xyz'意味着网格在每个x,y,z方向都被射线追踪,整体结果是每个方向的结果的组合。这以计算时间为代价得到了最可靠的结果。
-仅沿一个方向(例如,光线方向='z')进行跟踪速度更快,但如果光线正好穿过镶嵌面边缘,则可能会产生伪影。


参考文献
==========

-这段代码使用了类似于下面描述的射线相交方法:
基于体素的复杂形状表示、显示和厚度分析。第九届计算机辅助设计与计算机图形学国际会议(CAD/CG 2005)

引用为

亚当(2021)。网格血管素化(//www.tatmou.com/matlabcentral/fileexchange/27390-mesh-voxelisation),Matlab中央文件交换。检索到

评论和评级(69

方程沈

Ansuman Sahu

谢谢你!这是一个非常有用的代码开发基于体素的有限元模型。
我有一个关于文件VOXELISE中的第208、221和234行的小查询。M,计算体素宽度。
我无法理解为什么voxwidth=(meshYmax meshYmin)/(gridY+1/2)。
它不应该是voxwidth=(meshYmax meshYmin)/(gridY)吗?
(X和Z也有同样的疑问)。

Zehra Ese

非常感谢您的贡献!!如何在3D中绘制体素化模型?

威特邓

阿兰Ndjomo tamou

伟大的贡献。但我有一个问题:我如何保存输出用于另一个模拟器?
谢谢提前

Naveen B

谢谢你,先生,这对我很有用,你方的巨大贡献

胡安-帕布鲁Capossio

你好,伟大的应用!这似乎是有效的,但我从它得到的结果有许多缺失的体素。我的3d图像有气泡,我需要执行一个形态接近的操作,以得到一个像样的气泡。还有,我没法让w·Warriner的文件生效。任何帮助都将不胜感激。

约里·博因克

威廉Warriner

我想我在之前的评论中发现了同一个函数中的另一个bug。如果一条边是垂直的,并且一条射线通过那条边,那么由于0/0的除法,边检值是NaN。这种检测不足以发现这些病例。这些情况很有可能被插值误差修正所捕获。也就是说,针对这些情况进行特别检查,可以实现更健壮的单线或单面体素化,从而实现更快、更密集的3D几何图形栅格化切片。

威廉Warriner

可能有一个关于边缘检查的错误。如果一条射线恰好到达一条边,它就不被认为是相关联面的一部分。这可能会产生意想不到的体素缺失,例如,以原点为中心的立方体的“典型”三角剖分,每个轴向上都有奇数个等长体素。在这种情况下,一个体素恰好以原点为中心。光线在每个面的三角形之间“潜行”,而体素被忽略了。错误出现在第491、497和503行。比较是严格的(>)。将它们更改为(>=)似乎可以修复这个问题。我不确定这是否会导致其他意想不到的问题,但考虑到双精度算术的工作方式,这似乎不太可能。我在github repo修复了这个问题:https://github.com/wwarriner/mesh_voxelization

里卡多

如何保存生成的数据以用作有限元网格?

长哈王

美华住屋

阿米尔Ziabari

Nicosahedron

你好

谢谢你的贡献。当我尝试运行:[gridOUTPUT] = VOXELISE(gridX,gridY,gridZ,STLin)在我的网格模型有~ 15000个顶点和~ 30000个面,我得到一个大的Matlab内存错误:error using false
请求的14961x14960x14960x3(9355.0GB)阵列超出了最大阵列大小首选项。创造
大于此限制的阵列数量可能需要很长时间,并导致MATLAB变得
无响应。有关详细信息,请参阅数组大小限制或首选项面板。

体素化错误(第281行)
gridOUTPUT = false(voxcountX,voxcountY,voxcountZ,numel(射线方向));

compute_raw_skeleton错误(第23行)
vox_mesh =
VOXELISE (V (: 1), V (:, 2), 3 V (:, )','..\..\ 数据\ Avatars_complets \ 351844 _octobre_23_2018_03_21.stl”

这正常吗?您的代码能够管理这么多的顶点和面吗?(对我来说没有那么大)。还是我做错了什么?谢谢你的回答。

尼古拉。

杨惠林

很有帮助,非常感谢。

威廉Warriner

贾维德是

谢谢你的工作,我真的很感激。

尼克KASSOTAKIS

Adam你好,非常感谢你提供的这个很棒的工具。请原谅我可能的无知,我需要提取完整的3D体素化网格的坐标。在尝试这样做的过程中,我假设应该绘制gridCOx,y和z坐标。在绘制这个网格时,不是绘制整个网格,而是绘制一条点线。我是不是漏掉了什么?

Rainmar Leguarda

你好亚当,

这个功能对我帮助很大。我只是有一个问题,当我输入这个命令“[gridOUTPUT,gridCOx,gridCOy,gridCOz] = VOXELISE(gridX,gridY,gridZ,STLin,raydirection)”它给我网格x, y和z坐标,但不知怎么的,它不是从0或原点开始。

徐辰

乔治•杨

嗨,似乎在创建体素之后比例发生了变化?

兰扬·梅尔帕尔

嗨,亚当,
感谢上传!这个工具箱是否基于任何论文/参考文献?你能分享一下吗?

goldenleaf

你好

我也试过这个并得到我得到的结果,完全错了。
我试过这个:
meshx = [3; 0; 0];
网式=(0;3。0);
meshZ=[0;0;3];
[OutputGrid] =体纤维化(3,3,3,Meshx,Meshy,Meshz);

在变量[Output grid]中,我只能看到零:(:(.Plz help!)!

你好

我尝试使用以下方法运行代码:
meshX =[0、5、3);
网状= [0; 0; 3];
meshZ = (0, 0, 0);
[OUTPUTgrid]=体素化(6,6,6,meshX,meshY,meshZ);

我没有看到任何输出。我有一个面,它只存在于2D平面中。你能帮我使用一下你的功能吗

约翰内斯

可能将VOXELISE.m中的第301行更改为:

gridOUTPUT=sum(gridOUTPUT,4)>=1;

这似乎解决了我的角体素(位于网格的角)未被检测到的问题。

ntsh kr

如何找到体素的维数(我需要找到体素的体积)

保罗D

paulygon

在旭南

Olabanji Shonibare

艾德里安·贝克尔

里克

非常感谢您提供的代码。它真的帮了我很大的忙。

我遇到了一件奇怪的事,我想让你知道。
我有划定的.wrl格式,它被读到了三角形网格。顶点的Z坐标是分开的,因为它们遵循来自CT的切片厚度。当我使用此脚本时,可能会发生在Gridz中的值碰巧等于z值之一时返回切片。这并非总是如此。
我所使用的修复只是在z方向上使用了一个很小的偏移量,但是工件让我大吃一惊。

迈克尔·C。

我用这个函数对stl.file进行了体素化。

如何在matlab中使用切片函数的输出?这可能吗?

请帮忙。

沉杜

你好,我想说这是一部非常出色的作品。这对我破案很有帮助。
我想知道在我得到OUTPUTgrid后,我如何访问体素在表面的法向量?

非常感谢你

阿西夫Arain

安德烈

首先,感谢你的提交,因为它证明对我的事业非常有用。

这个功能运行得很好。我唯一的问题是在gridOUTPUT中输出的体素化矩阵沿X维翻转。有人能告诉我为什么会这样吗?

我使用的代码如下:
%体素化STL模型(面和顶点)
fv=stlread(data.stlList(l).name);

%从顶点数据获取点云
data.stlptcld {l} = pointcloud(fv.vertices);

%获取STL模型的尺寸
sz(1) = cel (data. stlptld {l}.XLimits(2) - data. stlptld {l}.XLimits(1));
SZ(2)= CEIL(data.stlptcld {l} .ytimits(2) - data.stlptcld {l} .ylimits(1));
sz(3) = cel (data. stlptld {l}.ZLimits(2) - data. stlptld {l}.ZLimits(1));

%体素化STL模型
数据。stlMask{l} = VOXELISE(sz(1), sz(2), sz(3), fv, 'xyz');

% Flip Voxelised stlMask,因为从|VOXELISE|输出沿x维翻转
data.stlMask{l}=flip(data.stlMask{l},1);

非常感谢任何帮助!

安德烈

当尝试体素化时,我得到以下错误:

| |和&&运算符的操作数必须可转换为逻辑标量值。

VOXELISE错误(第239行)
if ~isempty(strfind(raydirection,'x')) && (min(gridCOx)>meshXmin || max(gridCOx)

有什么帮助吗?:)

谢谢!

安德鲁Hundt

这个方法对于读取STL文件非常有效。其他STL读取matlab脚本要么被二进制或ascii格式限制,要么根本无法工作。谢谢!

莱西玛·Bhat

Sicong王

Ci

帕维尔Mazniker

如何显示结果[OUTPUTgrid]=体素化(网格、网格、网格、'sample.stl'、'xyz');在3D(体积图)中。。。

克里斯汀

有人尝试过用这个函数返回体素化固体的体积吗?

约翰

MATLAB新手在这里……

我有一个STL文件,导入到ML后,它转储数据到一个结构与面和顶点。

我遇到的问题是如何用函数来处理我有的面和顶点数据。

有什么建议吗?

斯文

@Jerome,如果你能进行一点交叉推广……看看inpolyhedron()……它用不同的方法执行类似的工作,我一直在寻找一些实际的例子,这些例子占用了大量的内存。它可能(没有承诺!)做得很好你的输入。

@Adam,干得好:)

杰罗姆·克罗克

干得好,很高兴用这个。

花了大约一个小时做一个3200 x 400 x 400阵列。有时内存有时存在问题。

整体效果很好。

杰罗姆·克罗克

像这样的节目让我喜欢Matlab。

很棒的工作,当我需要的时候。

干杯,

Abishek Balsamy Kamaraj.

Anusha

不,我知道如何仅使用曲面上的3D点(x、y、z)创建体素化。3D点应该是顶点。但是如何获得法线。希望得到一些帮助

云浩杰

你好亚当,

谢谢。我可以根据你的评论得到一个大尺寸的二进制掩码。

亚当一个

嗨,Yun Ho Jang,

是的,该代码可以通过指定所需的z-depth作为输入gridZ来获得指定z-depth的二进制掩码。只要gridZ不是整数值,此方法就有效。(整数不是指数据类型(int16, int32, int64等),我只是指作为一个整数。)

但是,如果gridZ是一个整数值,则代码假定它定义了z方向栅格中的体素数。为了解决这个问题,您可以在gridZ中定义的两个z深度处(作为两个元素向量)进行体素化,然后丢弃不想留下单个二进制层的切片。不幸的是,这不是一种优雅的方式,但在设计代码时,这并不是预期的用例。

希望这可以帮助,
亚当

云浩杰

你好亚当,

你的代码很好,但是当我尝试用大量的网格进行体素化时(例如。1000x1000x100),则生成内存不足错误。有没有办法得到特定z深度的二进制掩码?

先谢谢你。

云浩杰

我正在寻找一种方法来将3D STL数据转换为卷,这个功能很棒!

咸枣

亚当一个

嗨,滚开,
这段代码是专为三角形多边形网格设计的,但您的示例网格由四边形面组成。
希望这可以帮助,
亚当

eff.

嗨,亚当,

我想用你的代码创建一个由顶点和面定义的等值面作为补丁使用的体积。然而,VOXELISE方法并没有返回预期的结果。为了重现这个问题,我创建了一个简单的示例:
http://pastebin.com/PkWRuyyZ

我是做错了什么,还是这是代码中的错误?

谢谢,
eff.

亚当一个

我怀疑最好的方法是在Voxelisation之前旋转STL,就像你建议一样。如果您尝试通过旋转3D网格,请尝试通过旋转VoxisIzation,那么您需要做很多插值,这将是缓慢的并且可以引入错误或伪影。至于并行处理 - 我没有看到它应该不起作用的任何原因,但我没有看过它。

瑞安W

这是一个伟大的程序转换3D stl到体素。
是否有一种有效的方法来旋转体素模型为任意角度?我想到的一种方法是旋转3D stl模型(计算facet的每个顶点的新坐标)并对旋转后的3D模型进行体素化。但是“体素化”本身相当缓慢。有办法旋转体素模型本身吗?体素化中并行处理是否可能?

亚当一个

你好,亚历山大。如果你只想获得表面体素而不是整个体积,在体素化之后尝试下面一行。希望这个有帮助。亚当
GridShell = GridOutput&Imdilate(1-GridOutput,(3,3,3),'相同');

亚历山大Zuquete Guarato

我很喜欢你的网格体素化代码。我想知道如何在gridOUTPUT中插入所有表面体素,而不是仅仅插入网格体素。谢谢! !

普拉卡什Manandhar

艾伦阿弗

詹姆斯

伟大的体兴剧本,我发现它非常有用。有一件事我想看看是否可能 - 如果我尝试复制多个体重叠的体,那么它们与脚本重叠返回'void'voxels而不是'solid'。最好是我也希望看到这些恢复为稳健。干杯!

K B

亚当一个

你好阿米尔,
我刚刚上传了一个新版本的代码,它将使用以下两行代码提供唯一顶点坐标列表。希望它将在不久将可供下载。
亚当

[coordVERTICES] = READ_stl(“filename.stl”);
(脸,顶点)= CONVERT_meshformat (coordVERTICES);

嗨,亚当,我怎么能得到三角形点的xyz坐标而不重复呢?

我只是想要一些便于分析的要点。

谢谢

MATLAB版本兼容性
使用R2010a创建
兼容任何释放
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!