如何在python中检查一个随机的三维物体表面是否平坦

2024-05-17 04:04:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 数据对象方法图像numpy堆栈数组micro
2条回答

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

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]

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

相关问题 更多 >