Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中检查随机3d对象曲面是否平坦_Python_Image_3d_Transform - Fatal编程技术网

如何在python中检查随机3d对象曲面是否平坦

如何在python中检查随机3d对象曲面是否平坦,python,image,3d,transform,Python,Image,3d,Transform,我使用micro CT(它生成一种3D图像对象)来评估我的样本,这些样本的形状像一个圆锥体。然而,主表面应该是平坦的,不能总是与图像堆栈的表面平行放置。要执行转换,首先,我必须找到一种识别平面的方法。因此,我学习了python将图像数据读入numpy数组 然后我意识到我完全不知道如何用数学的方法来实现这个想法。 如果您有任何想法或任何建议,甚至包裹将不胜感激 首先,3d中的所有线条对应一个方程式;第二,3d中位于特定平面上的所有线的部分长度对应于属于一组线性方程组的方程,这些线性方程组共享某些特

我使用micro CT(它生成一种3D图像对象)来评估我的样本,这些样本的形状像一个圆锥体。然而,主表面应该是平坦的,不能总是与图像堆栈的表面平行放置。要执行转换,首先,我必须找到一种识别平面的方法。因此,我学习了python将图像数据读入numpy数组

然后我意识到我完全不知道如何用数学的方法来实现这个想法。
如果您有任何想法或任何建议,甚至包裹将不胜感激

首先,3d中的所有线条对应一个方程式;第二,3d中位于特定平面上的所有线的部分长度对应于属于一组线性方程组的方程,这些线性方程组共享某些特征,您需要确定这些特征。你应该做的第一件事是确定假定平面的四个角-它们的x、y或z值比其他点更极端。然后检查角点之间的线是否在集合中具有方程式-三维中的三个点始终定义一个平面,四个点可能不定义。然后,您应该使用适当的线性方程“绘制”两条平行边的点。假设平面中的所有其他点都将是两条平行边之间垂直的“在线”(其方程也在集合中)。两侧垂直线的两个端点将定义每个方程式。在确定一个点是否“在”一条线上时,要记住的关键一点是,即使假定的平面被输入为平面,该点也可能不是。这是因为方程式生成的x、y和z值将被舍入,以便与图形程序允许的分辨率定义的“真实”点相对应。因此,您必须考虑点“应该”的位置与实际位置之间的差异(非常小)-这可能只是一个像素(或使用的任何分辨率单位)。从另一个角度来看——一个点可能位于两条边之间的垂线上,但不在其他两条边之间的垂线上,这仅仅是因为两个方程之一存在舍入误差。如果你想测试一个“颠簸”的飞机,不管出于什么原因,只要增加允许的差异。如果您在math.stackexchange.com上发布了一个关于平面直线方程组的措辞谨慎的问题,有人可能会对此了解更多。

您可以使用主成分分析(PCA)检查3D曲面是否平坦(如果是平面/直线),您可以尝试以下代码:

from sklearn import decomposition

def isPlaneLine(XYZ):
''' 
    XYZ is n x 3 metrix storing xyz coordinates of n points
    It uses PCA to check the dimensionality of the XYZ
    th is the threshold, the smaller, the more strict for being 
    planar/linearity

    return 0 ==> randomly distributed
    return 1 ==> plane
    return 2 ==> line

'''
    th = 1e-3

    pca = decomposition.PCA()
    pca.fit(XYZ)
    pca_r = pca.explained_variance_ratio_
    t = np.where(pca_r < th)

    return t[0].shape[0]
从sklearn导入分解
def isPlaneLine(XYZ):
''' 
XYZ是存储n个点的XYZ坐标的nx3矩阵
它使用PCA检查XYZ的维数
这是门槛,门槛越小,要求越严格
平面/线性
返回0==>随机分布
返回1==>平面
返回2==>行
'''
th=1e-3
pca=分解。pca()
pca.fit(XYZ)
pca\u r=pca.方差比_
t=np.式中(pca\u r
谢谢,我试图避免手动转换。这工作真的没有我想象的那么容易。我将按照您的建议查看math.stackexchange站点。