如何从索引图像 (Python) 中找到椭圆坐标?

How to find ellipse coordinates from indexed image (Python)?

我有这样一张图:

表示同心椭圆。此图像包含在一个 numpy 矩阵中,其中一个在不同椭圆周长的索引中,其他地方为零。

因为我想找到每个椭圆的中心,所以我找到了这两个函数:

def fitEllipse(x,y):
   x = x[:,np.newaxis]
   y = y[:,np.newaxis]
   D =  np.hstack((x*x, x*y, y*y, x, y, np.ones_like(x)))
   S = np.dot(D.T,D)
   C = np.zeros([6,6])
   C[0,2] = C[2,0] = 2; C[1,1] = -1
   E, V =  eig(np.dot(inv(S), C))
   n = np.argmax(np.abs(E))
   a = V[:,n]
return a

def ellipse_center(a):
   b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0]
   num = b*b-a*c
   x0=(c*d-b*f)/num
   y0=(a*f-b*d)/num
return np.array([x0,y0])

可以分别拟合椭圆曲线和找到给定椭圆的中心。 问题是,如果我能够自己绘制不同的椭圆“对象”,我就能知道不同点的坐标是什么。 但在我的例子中,我只能访问值为 1 的索引,而不知道哪些索引属于某个椭圆,哪些索引属于另一个..

那么有没有一种方法可以分离这些不同的椭圆,分别存储它们的索引坐标?

最后,我们的想法是为所有这些椭圆对象拟合一个椭圆并找到它们的中心。 提前致谢:)

So is there a way I can separate those different ellipses, individually storing their index coordinates?

您可以使用 scikit-image label 来标记您的省略号,如下所示:

import skimage.io
import skimage.measure
import numpy as np

im = (skimage.io.imread("so67279689.png", as_gray=True)>.3).astype(int)
labeled_im, n = skimage.measure.label(im, return_num=True)

然后访问 6 号椭圆,例如:

el6 = np.where(labeled_im==6, im, 0)

总共你会得到标签 1 ... n,标签 0 是背景。

(这是我从你的测试问题中复制的图片:

)

可视化标记的椭圆:

import matplotlib.pyplot as plt
fig,ax=plt.subplots(3,5)
for i in range(n):
    ax.flat[i].imshow(np.where(labeled_im==i+1, im, 0))
    ax.flat[i].set_title(f"{i+1}")
    ax.flat[i].axis("off")
ax.flat[13].axis("off")
ax.flat[14].axis("off")