更新:我已经修改了Optimize,Eigen和Solve方法来反映变化.所有现在都返回"相同"向量,允许机器精度. 我仍然对Eigen方法感到困惑.具体如何/为什么我选择特征向量切片没有意义.这只是试验和错误,直到正常情况与其他解决方案相匹配.如果有人能够纠正/解释我真正应该做的事情,或者为什么我做了什么工作我会很感激..
感谢 亚历山大克莱默解释为什么我采取切片,只能选择一个正确的答案
我有一个深度图像.我想计算深度图像中像素的粗糙表面法线.我考虑周围像素,在最简单的情况下是3x3矩阵,并将平面拟合到这些点,并计算该平面的法向单位矢量.
听起来很简单,但最好先考虑平面拟合算法.搜索SO和其他各种网站,我看到使用最小二乘法,单值分解,特征向量/值等的方法.
虽然我不完全理解数学,但我已经能够使各种片段/示例起作用.我遇到的问题是,我对每种方法都有不同的答案.我期待各种答案是相似的(不完全),但它们似乎有很大的不同.也许有些方法不适合我的数据,但不确定为什么我会得到不同的结果.有什么想法吗?
这是代码的更新输出:
LTSQ: [ -8.10792259e-17 7.07106781e-01 -7.07106781e-01]
SVD: [ 0. 0.70710678 -0.70710678]
Eigen: [ 0. 0.70710678 -0.70710678]
Solve: [ 0. 0.70710678 0.70710678]
Optim: [ -1.56069661e-09 7.07106781e-01 7.07106782e-01]
Run Code Online (Sandbox Code Playgroud)
以下代码实现了五种不同的方法来计算平面的曲面法线.算法/代码来自互联网上的各种论坛.
import numpy as np
import scipy.optimize
def fitPLaneLTSQ(XYZ):
# Fits a plane to a point cloud,
# Where Z = aX + bY + c ----Eqn #1
# Rearanging Eqn1: aX + bY -Z +c =0
# Gives normal (a,b,-1)
# …Run Code Online (Sandbox Code Playgroud) 以前我一直在使用Mac端口维护的python环境.我有一些使用PyQT,VTK,matplotlib等的基本脚本.我已经能够使用Paraview但对我的用途看起来有点沉重,所以我会尝试MayaVi2(和TVTK).
我下载并尝试手动安装,但事实证明这很麻烦.所以我想我会咬紧牙关并尝试Canopy(学术许可证).基于Mac OS X上的这个VTK/Mayavi,它表明Qt,VTK和MayaVI的世界都很好,我安装了64位Canopy.
我无法让mayavi2在Canopy环境中工作.它运行,但控制台出现很多错误,如果我调出任何对话框/设置框,"按钮"无法正常工作.当我尝试启动mayavi2时,这是第一个错误(几个屏幕已满):
(Canopy 64bit)scratch_pad 501 $ mayavi2 Traceback(最近一次调用最后一次):文件"/Applications/Canopy.app/appdata/canopy-1.0.0.1160.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site -packages/pyface/ui/wx/splash_screen.py",第121行,在_on_paint dc = wx.PaintDC(窗口)中
我实际上对TVTK更感兴趣,所以我尝试了一些来自网站画廊的mayavi演示http://docs.enthought.com/mayavi/mayavi/auto/examples.html 少数我尝试过的 - 一个工作,这是它们显示VTK(?)窗口/场景,我可以与VTK窗口进行交互.一切都很好,直到我打开设置/对话窗口,然后没有对话窗口"按钮"工作,我必须强制退出.这是我在plot3D演示中打开"Setting"按钮时的最后一行错误:
简单的演示:文件"/Users/michael/Library/Enthought/Canopy_64bit/System/lib/python2.7/site-packages/wx/_core.py",第9162行,在DestroyChildren中返回核心 .Window_DestroyChildren(*args,**kwargs)wx._core.PyAssertionError:~wxWindowBase()中的C++断言"GetEventHandler()== this"在/BUILD/wxPython-src-2.9.2.4/src/common/wincmn.cpp(468)失败:任何推送事件必须删除处理程序
我甚至试过了
ipython --gui = wx
(如页面上所示)但在这种情况下它会崩溃,没有窗口.
根据控制台上的错误消息,它们似乎都与wx相关.我的理解是,Canopy环境是"自足的",但是我的旧环境可能会有些冲突吗?我怎么会测试这个?
有没有一种方法,环境变量,mayavi2可以使用Qt而不是wx?我不在任何本地python脚本中使用wx,所以除非在Canopy中需要它,否则我很乐意禁用,如果这是一个选项.
有任何想法吗?
第二个子图是第一个带有叠加图的图像.在第二个图中似乎有白色填充/边界.如何删除此填充/空格?

对于completness,这是执行绘图的代码片段:
fig, ax = plt.subplots(1, 2)
fig.set_size_inches(16, 6, forward=True)
plt.subplots_adjust(0.05, 0.05, 0.95, 0.95, 0.05, 0.05)
ax[0].set_title("Region Labels")
ax[0].imshow(image_labels)
ax[1].set_title("Region Connectivity Graph")
ax[1].imshow(image_labels)
for edge in edges:
ax[1].plot([centers[edge[0]][0],centers[edge[1]][0]],
[centers[edge[0]][1],centers[edge[1]][1]])
for a in ax:
a.set_xticks(())
a.set_yticks(())
plt.show()
Run Code Online (Sandbox Code Playgroud)