Skip to content

Instantly share code, notes, and snippets.

@lorenzoriano
Last active April 5, 2020 10:51
Show Gist options
  • Save lorenzoriano/6799568 to your computer and use it in GitHub Desktop.
Save lorenzoriano/6799568 to your computer and use it in GitHub Desktop.
Least square circle fitting. Adapted from http://wiki.scipy.org/Cookbook/Least_Squares_Circle
import numpy as np
from scipy import optimize
from matplotlib import pyplot as plt, cm, colors
def calc_R(x,y, xc, yc):
""" calculate the distance of each 2D points from the center (xc, yc) """
return np.sqrt((x-xc)**2 + (y-yc)**2)
def f(c, x, y):
""" calculate the algebraic distance between the data points and the mean circle centered at c=(xc, yc) """
Ri = calc_R(x, y, *c)
return Ri - Ri.mean()
def leastsq_circle(x,y):
# coordinates of the barycenter
x_m = np.mean(x)
y_m = np.mean(y)
center_estimate = x_m, y_m
center, ier = optimize.leastsq(f, center_estimate, args=(x,y))
xc, yc = center
Ri = calc_R(x, y, *center)
R = Ri.mean()
residu = np.sum((Ri - R)**2)
return xc, yc, R, residu
def plot_data_circle(x,y, xc, yc, R):
f = plt.figure( facecolor='white') #figsize=(7, 5.4), dpi=72,
plt.axis('equal')
theta_fit = np.linspace(-pi, pi, 180)
x_fit = xc + R*np.cos(theta_fit)
y_fit = yc + R*np.sin(theta_fit)
plt.plot(x_fit, y_fit, 'b-' , label="fitted circle", lw=2)
plt.plot([xc], [yc], 'bD', mec='y', mew=1)
plt.xlabel('x')
plt.ylabel('y')
# plot data
plt.plot(x, y, 'r-.', label='data', mew=1)
plt.legend(loc='best',labelspacing=0.1 )
plt.grid()
plt.title('Least Squares Circle')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment