如果在python中是平的,如何检查随机的3d对象表面

时间:2014-08-05 12:11:12

标签: python image 3d transform

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

然后我意识到我完全不知道如何以数学方式实现这个想法。 如果您有任何想法或任何建议,甚至包装将非常感激。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用主成分分析(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]