如何从索引图像 (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")
我有这样一张图:
表示同心椭圆。此图像包含在一个 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")