python - 包含许多点的椭球方程

标签 python algorithm scipy

我有大量的像素颜色(96,000 种不同的颜色):

enter image description here

我想得到某种数学定义的概率区域,例如 this question :

enter image description here

我现在看到的主要障碍——谷歌上的所有方法主要是关于可视化和二维空间,但没有找到方程系数的算法,例如:

a1x2 + b1y2 + c1y2 + a2xy + b2xz + c2yz + a 3x + b3y + c3z = 0

this paper在 python 中实现它对我来说太难了。 :(

无论如何,我只想确定某个像素是否或多或少位于我所拥有的音域内。

我尝试使用 scikit 集群来实现它,但由于只有一个而失败了 一组数据,大概。并创建一个数组 2563 元素 表示每个像素颜色的方式似乎是错误的。

不知道有没有简单的方法来确定这个点簇的边界? 或者,也许我只是想得太多了,还有像 OpenCV 这样的东西 cv2.inRange() 函数?

最佳答案

这可以通过椭圆多项式的优化和拟合来解决。然而,我会从更快的几何方法开始:

  1. 找到平均点位置

    那将是你的椭圆体的中心

    p0 = sum (p[i]) / n      // average
    i = { 0,1,2,3,...,n-1 }  // of all points
    

    如果您的点密度不是同质的,那么使用边界框中心会更安全。所以找到 xmin,ymin,zmin,xmax,ymax,zmax,它们之间的中间就是你的中心。

  2. 找到离中心最远的点

    这会给你主要的半轴

    pa = p[j];
    |p[j]-p0| >= |p[i]-p0|   // max
    i = { 0,1,2,3,...,n-1 }  // of all points
    
  3. 找到第二个半轴

    所以向量 pa-p0 垂直于其他半轴所在的平面。因此,从该平面找到到 p0 的最远点:

    pb = p[j];  
    |p[j]-p0| >= |p[i]-p0|   // max
    dot(pa-p0,p[j]-p0) == 0  // but inly if inside plane
    i = { 0,1,2,3,...,n-1 }  // from all points
    

    请注意,点积的结果可能不完全为零,因此最好针对以下内容进行测试:

    |dot(pa-p0,p[j]-p0)| <= 1e-3
    

    您可以使用任何您想要的阈值(应基于椭圆体大小)。

  4. 找到最后一个半轴

    所以我们知道最后一个半轴应该垂直于两者

    (pa-p0) AND (pb-p0)
    

    所以找到这样的点:

    pc = p[j];  
    |p[j]-p0| >= |p[i]-p0|   // max
    dot(pa-p0,p[j]-p0) == 0  // but inly if inside plane
    dot(pb-p0,p[j]-p0) == 0  // and perpendicular also to b semi-axis
    i = { 0,1,2,3,...,n-1 }  // from all points
    
  5. 椭圆体

    现在您拥有了形成椭圆体所需的所有参数。载体

    (pa-p0),(pb-p0),(pc-p0)
    

    是椭圆体的基向量(您可以使用叉积使它们垂直)。它们的大小为您提供了半径。 p0 是中心。您还可以使用此参数方程:

    a=pa-p0;
    b=pb-p0;
    c=pc-p0;
    p(u,v) = p0 + a*cos(u)*cos(v)
                + b*cos(u)*sin(v)
                + c*sin(u);
    u = < -0.5*PI , +0.5*PI >
    v = < 0.0 , 2.0*PI >
    

整个过程只是 O(n),结果可以用作优化和拟合的起点,以在不损失准确性的情况下加快它们的速度。如果想进一步提高准确率见:

子链接向您展示了适合的例子......

你也可以看看这个:

这与您的任务基本相似,但仅在 2D 中仍可能会给您带来一些想法。

关于python - 包含许多点的椭球方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42540785/

相关文章:

c++ - 随机唯一整数的非标准排序算法

python - 如何从(任意)连续概率分布进行模拟?

python - sqlalchemy psycopg2.errors.InsufficientPrivilege : permission denied for relation <<table>>

algorithm - 检查一个数字是否可以写成一些斐波那契数的乘积

algorithm - 快速嵌套在矩阵中绘制圆

numpy - 找到两个矩阵之间的最小余弦距离

Python:从 STFT 重建音频文件

python - 返回 unicode 字符串的前 N ​​个字符

python - 使用 Keras 的 RNN 层的 return_state 输出是什么

python - 从 python 启动 VS2008 构建