【问题标题】:python: Noiseless 3-D rotation?python: 无噪音的 3-D 旋转?
【发布时间】:2018-12-19 20:35:45
【问题描述】:

背景:

用例:我想从几张图片构建一个人体的 3D 网格。 更具体地说,现在我正在尝试旋转一个 3-D numpy 数组,这样我就可以应用人体的下一个“蒙版”,这样我就可以获得皮肤的体素表示,从中可以制作网格 最具体地说,问题是scipy.ndimage.rotate() 没有做我需要的 3 维(尽管它适用于 2 维)。对于任意旋转角度(即 72.9 度而不是 90.0 度),它也会失败。它要么在应该有“开启”体素的地方留下“关闭”体素,要么(如果我使用连续数字而不是布尔值)它会在应该关闭体素的地方留下很多“开启”体素。有没有更好的rotate() 函数可以解决这个噪音问题?

版本信息:

版本细节: python 2.7.15: Anaconda, Inc. numpy 1.11.3 py27h3dfced4_4 numpy-base 1.14.5 py27hdbf6ddf_4 scipy 1.1.0 py27hc49cb51_0 uname -a 的输出: Linux elon-eats-my-shorts 4.15.0-42-generic #45~16.04.1-Ubuntu SMP Mon Nov 19 13:02:27 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

代码:

#====================================================

def rot8(model, angle):
  xy=(1,0); return uint_mids(   scipy.ndimage.rotate(model, angle, axes=xy, reshape=False, mode='constant'))

#====================================================

def uint_mids(arr):
  # NOTE:  do we want this to run on floats?  TODO:   try multiple ways (first on uint8, then float, etc.)
  UINT8_MAX=np.iinfo('uint8').max; MID=int(round(UINT8_MAX/2.))
  arr[np.greater(arr, 0)]=MID; return arr

#====================================================

结果:

我希望这些 plt.show() 结果看起来像人体的二维视图,噪音最小。相反,我要么得到 A) 人体内部的洞,要么得到 B) 应该在外部的“身体”:

一)

B)

有关scipy.ndimage.rotate() 不精确的最小示例,请使用this link 的代码。回复:约翰

之前轮换:

之后轮换:

rotate() 方法创建了新的体素!我正在寻找不这样做的rotate_in_3D() 方法

【问题讨论】:

  • 您的图片已损坏。
  • @user2357112 我正在修复中。感谢您让我知道您也看不到它们
  • 图像是你的输出,但模型是什么样的?
  • 是的,但是如果没有看到您要旋转的东西,就很难确定错误的来源。您能否制作一个分辨率非常低的最小示例来演示该问题?
  • 注意:我已经解决了这个问题。如果您需要解决方案,请通过通知与我联系;除了@John之外,似乎没有多少人真正解决了这个问题。如果有更多的兴趣,我会发布一个解决方案

标签: python numpy scipy mesh voxel


【解决方案1】:

如果我的理解正确,您有一系列从不同方向拍摄的 3D 形状的 2D 图像,并且您正在尝试重新创建该形状的 3D 轮廓。

这样的算法能否完成您想要完成的任务(伪代码)?

Initialize all of your voxels to 1
for (mask,angle) in zip(images,directions):
    for pixel in mask:
        if pixel_value < threshold:
            # Nothing there
            draw line along angle offset by pixel location
            set value of every voxel intersected by this line to 0

我基本上认为旋转 2D 图像可能比旋转 3D 模型更简单。

您可能会很快提出一个快速而简单的实现,并且应该适用于凸面对象。您可能还可以做一些更漂亮的事情来平滑边缘。

【讨论】:

  • 所以对于遮罩部分,我有一个非常简单的功能,我只需 np.logical_and() 复制遮罩和以前的模型。但是如果我旋转面具,我认为这不起作用?我得考虑一下
  • 您可以创建第二个体素数据结构以用作掩码并使用 np.logical_and() 将模型归零,但我认为这可能会比修改现有模型的效率低......不过,似乎应该有一种更有效的方法来创建面具。如果性能不是什么大问题,那么暴力破解也没有什么坏处。
  • 我发现这个不同算法的总结(没有实现细节)cs.cmu.edu/~seitz/course/Sigg00/slides/seitz-voxel.pdf 可能有用。
  • 部分问题是我知道如何使用 for 循环编写无噪音旋转,但它很慢并且需要大量调试。我真的在寻找已经优化的任何语言的模块。如果我必须将我的 np 数组转换为 C++,这对我来说很好,只要它可以快速完成。不过,我查看了您发布的内容,如果我决定自己实现它,似乎有一些有希望的方法可以加快我的实现速度
  • 您研究过并行性吗?这似乎是一种非常容易并行化的任务,如果您可以访问计算能力,您可能会看到“未优化”并行实现比优化串行或轻线程实现更好的性能。无论如何都值得考虑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2017-03-28
相关资源
最近更新 更多