从含噪数据插值连续曲线

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

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

import numpy as np
from skimage import draw
from matplotlib import pyplot as plt
image = np.zeros((200,200), dtype=np.uint8)

coords = np.array(draw.circle_perimeter(100,100,50))

noise = np.random.normal(0,2,coords.shape).astype(np.int64)

coords += noise
image[coords[0], coords[1]] = 1

plt.imshow(image, cmap="gray")

plt.show()

blmhpbnm

blmhpbnm1#

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

from skg import nsphere_fit

radius, center = nsphere_fit(coords, axis=0)

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

from matplotlib.patches import Circle

fig, ax = plt.subplots()
ax.imshow(image, cmap='gray')
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

相关问题