|
发表于 2024-12-11 22:33:54
|
显示全部楼层
当然可以,霍夫变换不仅可以用于图像处理中的圆检测,还可以用于从二维点云数据拟合圆。以下是一个简单的示例代码,用于拟合给定的二维点集的圆:
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy.optimize import leastsq
- # 定义误差函数
- def calc_R(xc, yc):
- """计算距圆心(xc, yc)的距离"""
- return np.sqrt((x - xc) ** 2 + (y - yc) ** 2)
- def f_2(beta):
- """计算所有点的误差"""
- return calc_R(*beta) - calc_R(*beta).mean()
- # 二维点数据
- points = np.array([
- (1, 7),
- (2, 6),
- (3, 5),
- (4, 4),
- (5, 3),
- # 添加更多点
- ])
- # 将点拆分为 x 和 y 坐标
- x, y = points[:, 0], points[:, 1]
- # 初始猜测为质心
- x_m, y_m = np.mean(x), np.mean(y)
- # 拟合圆
- center_estimate = x_m, y_m
- center, ier = leastsq(f_2, center_estimate)
- # 计算半径
- xc, yc = center
- radii = calc_R(xc, yc)
- radius = radii.mean()
- print(f'拟合圆的圆心: ({xc}, {yc})')
- print(f'拟合圆的半径: {radius}')
- # 绘图
- fig, ax = plt.subplots()
- circle_fit = plt.Circle(center, radius, color='b', fill=False, linestyle='--')
- ax.add_artist(circle_fit)
- ax.scatter(points[:, 0], points[:, 1], color='r', label='点云')
- ax.set_aspect('equal', 'datalim')
- plt.plot(xc, yc, 'go', label='圆心')
- plt.legend()
- plt.xlabel('X')
- plt.ylabel('Y')
- plt.title('圆拟合')
- plt.grid(True)
- plt.show()
复制代码
这里,我们使用了`scipy.optimize.leastsq`来最小化误差函数,从而找到最佳拟合圆。此代码假定给定的点云在`points`数组中。请根据您的需求调整这些值。希望这对您有所帮助!如果您还有其他问题,请随时告诉我。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|