Python 寻找轮廓的中心

Python 寻找轮廓的中心,python,matplotlib,Python,Matplotlib,我有一个生成图像轮廓的代码。计算最后一个轮廓的中心像素的最佳方法是什么 import numpy as np import matplotlib.pyplot as plt levels = [] for i in np.arange(0.1,0.9, 0.1): levels.append(i*40) s = plt.contour(Y, X, twhole, levels, linewidths=1, colors=('k','#0000ff', '#0033ff', '#0066f

我有一个生成图像轮廓的代码。计算最后一个轮廓的中心像素的最佳方法是什么

import numpy as np
import matplotlib.pyplot as plt
levels = []
for i in np.arange(0.1,0.9, 0.1):
    levels.append(i*40)
s = plt.contour(Y, X, twhole, levels, linewidths=1, colors=('k','#0000ff', '#0033ff', '#0066ff', '#0099ff','#00ccff','#00ffff', '#660000' ))#'k','0.5','0.75','0.8','0.9', 'g','c','b','m','y','r', '0.2', '0.3', '0.4', ))#colors='k')
plt.show()
如果
s=ax.contour(…)
,则通过
s.allsegs[-1][0]

您可以使用这些工具以通常的方式计算点的质心,如wikipedia

例如:

import numpy as np
import matplotlib.pyplot as plt

def center_of_mass(X):
    # calculate center of mass of a closed polygon
    x = X[:,0]
    y = X[:,1]
    g = (x[:-1]*y[1:] - x[1:]*y[:-1])
    A = 0.5*g.sum()
    cx = ((x[:-1] + x[1:])*g).sum()
    cy = ((y[:-1] + y[1:])*g).sum()
    return 1./(6*A)*np.array([cx,cy])


X,Y = np.meshgrid(np.linspace(-2,2),np.linspace(-1,4))
f = lambda x,y: np.exp(-x**2-y**2)+np.sin(np.arctan2(y,x))
Z = f(X,Y)


fig, ax = plt.subplots()
ax.pcolormesh(X,Y,Z, cmap="Reds", vmax=10)

contour = ax.contour(X,Y,Z,levels=[1.01,1.1,1.2], colors="k")

c =  center_of_mass(contour.allsegs[-1][0])
ax.plot(c[0],c[1], marker="o", markersize=12, color="red")
plt.show()

如果轮廓是不规则形状,您如何定义“中心像素”?我想应该尽量减少与边缘的平均距离,那么您到目前为止做了哪些尝试?请注意,您可以从
s.allsegs
中获得每条等高线的坐标列表。所以您要查找的是一个?即使它意味着在C形的情况下,它位于多边形之外?