【发布时间】:2016-01-02 16:33:31
【问题描述】:
我在 Matlab 中有一个颗粒的二进制图像。我可以通过以下函数找到颗粒的凸包:
[K, V] = convhull(granule);
如何找到原始图像中属于凸包但不属于颗粒的所有像素?我的意思是我想做这样的事情:
granule2 = zeros(size(granule));
granule2(K == 1 & granule == 0) = 2;
它不起作用,因为 K 的大小是 x 乘 3,其中 x 是凸包中三角形的数量。
编辑:根据文档,凸包应该是一个数组,其中点的索引构成每行中的凸包。那么如何找到由这些点确定的体积内的所有点。
Edit2:让我换句话说:我有一个图像,它是一个 3D 点数组。它不是一个球体,它有一些凹痕(所以凸包不会位于我的图像表面上)。
我想找到凸包,然后找到所有在凸包内但在颗粒之外的点。这是它在 2D 中的样子(我想找到红色像素):
Edit3:NicolaSysnet,您的算法应该返回我图片中所有红色的像素(它们的索引)(图片是二维的,因为它更容易绘制)。
【问题讨论】:
-
granule的大小是多少? -
您使用的
[K,V]与 documentation 所说的完全相反。我认为这在您的代码中也是错误的,因为K==1在这里是一个相当晦涩的分配 -
@user2738748 你的问题很混乱。您似乎想要凸包和原始形状之间的像素?答案完全取决于图形的屏幕分辨率、仰角和方位角等因素。由于像素始终是 2D,因此您对 3D 的要求毫无意义。如果您实际上想要船体和您的形状之间的 3D 点,答案是
inf。如果您指定点之间的最小间隙,即 3D 网格大小,则答案是有界的。 -
@user2738748 你没有澄清任何事情。在凸包包围的表面和实际表面之间有无数个点。你要求一个无限的答案。以您的 edit3 为例。有哪些指标?这些点不在颗粒上,所以它们没有索引。它们是船体和空地中的颗粒之间的点。您是否要询问颗粒上不在船体上的所有点?您需要进一步澄清。
-
@Matt,我的输入是一个 3D 数组,比方说,大小为 1024 x 1024 x 1024。每个点都有三个索引:x、y、z。索引的范围从 1 到 1024。每个点也有一个值 - 如果它是 0,它不属于颗粒,如果它是 1,它。所有点都有三个索引,不仅是颗粒上(或内部)的那些。当我说“点”时,我指的不是平面上的点(数学点),而是原始数组中的一个点(我有超过十亿个这样的点——这是一个有限的数字)。我认为这对任何了解 Matlab 的人来说都是清楚的。
标签: matlab convex-hull