从含噪数据插值连续曲线

8dtrkrch  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(407)

我试图从嘈杂的数据(如示例中的圆)估算/插值曲线。我的数据包含不止一个圆,但这应该是解决其他结构的良好起点。
我有一个有噪声的二值图像,我正试图将一个连续的曲线/ backbone 拟合到它(每个像素有两个邻居,如果形状不是圆形的话,除了起始像素和结束像素)。我成功地分别拟合了x,y坐标,使用到起点的距离作为x值,坐标作为y值,然后用小步插值距离。然后我检查了坐标是否都连接好了。在某些极端情况下,新的插值点没有连接,我必须使用较小的步骤进行插值。这通常也会导致像素有两个以上的邻居和其他奇怪的伪影。
是否有更简单的方法将这些值拟合到曲线并获得连续曲线?

  1. import numpy as np
  2. from skimage import draw
  3. from matplotlib import pyplot as plt
  4. image = np.zeros((200,200), dtype=np.uint8)
  5. coords = np.array(draw.circle_perimeter(100,100,50))
  6. noise = np.random.normal(0,2,coords.shape).astype(np.int64)
  7. coords += noise
  8. image[coords[0], coords[1]] = 1
  9. plt.imshow(image, cmap="gray")
  10. plt.show()

blmhpbnm

blmhpbnm1#

要拟合数据,您需要一个模型。拟合圆的方法有很多种。我最成功的一个是ian coope的线性化解。该文件可在以下网址查阅:https://ir.canterbury.ac.nz/handle/10092/11104
我已经在一个称为scikit guess的线性化拟合库中对其进行了python实现。功能是 skg.nsphere_fit . 考虑到你的 (2, n) 排列 coords ,您可以这样使用它:

  1. from skg import nsphere_fit
  2. radius, center = nsphere_fit(coords, axis=0)

要在图像上绘图,可以使用 matplotlib.patches.Circle :

  1. from matplotlib.patches import Circle
  2. fig, ax = plt.subplots()
  3. ax.imshow(image, cmap='gray')
  4. ax.add_patch(Circle(center[::-1], radius, edgecolor='red', facecolor='none'))

你需要倒车 center 因为你的输入坐标是 (row, col) 虽然 Circle 期望 (x, y) ,即 (col, row) .

要适应不同的模型,您需要不同的方法。对于任意模型,您可能需要研究 scipy.optimizelmfit .

展开查看全部
gopyfrb3

gopyfrb32#

将圆拟合到噪声数据非常简单:

这种方法来源于https://fr.scribd.com/doc/14819165/regressions-coniques-quadriques-circulaire-spherique

相关问题