Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用平滑曲线拟合点_Python_Opencv_Matplotlib_Computer Vision_Scikit Image - Fatal编程技术网

Python 用平滑曲线拟合点

Python 用平滑曲线拟合点,python,opencv,matplotlib,computer-vision,scikit-image,Python,Opencv,Matplotlib,Computer Vision,Scikit Image,我想用python中的平滑曲线拟合图像上的一组点。曲线可以是开放的,也可以是闭合的。此外,我希望得到绘制在图像上的曲线,作为与图像大小相同的遮罩。是否有我可以参考的模块或功能?谢谢。这通常称为参数插值。有一个scipy函数,它只调用这个函数。您请求的步骤包括: 1用有序的点平滑形状,如果不先使用,请检查 注意:有关如何在图像检查上创建形状的详细信息,请参见 2使用平滑形状在图像(比如2D阵列)上构建遮罩 下面的配方可以做到这一点: import numpy as np from scipy.in

我想用python中的平滑曲线拟合图像上的一组点。曲线可以是开放的,也可以是闭合的。此外,我希望得到绘制在图像上的曲线,作为与图像大小相同的遮罩。是否有我可以参考的模块或功能?谢谢。

这通常称为参数插值。有一个scipy函数,它只调用这个函数。您请求的步骤包括:

1用有序的点平滑形状,如果不先使用,请检查

注意:有关如何在图像检查上创建形状的详细信息,请参见

2使用平滑形状在图像(比如2D阵列)上构建遮罩

下面的配方可以做到这一点:

import numpy as np
from scipy.interpolate import splprep, splev
import matplotlib.pyplot as plt
from matplotlib import path

# Building a shape with scattered points.
x = np.array([10, 10, 0, 0, 10, 10, 20, 20, 30, 30, 20, 20, 10]) + 10
y = np.array([0, 10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]) + 10
image = np.random.randint(0, 10, (50, 50))

# Smoothing the shape.
# spline parameters
s = 3.0 # smoothness parameter
k = 2 # spline order
nest = -1 # estimate of number of knots needed (-1 = maximal)
t, u = splprep([x, y], s=s, k=k, nest=-1)
xn, yn = splev(np.linspace(0, 1, 500), t)

# Showing the original shape
plt.imshow(image.T, origin='lower', interpolation='nearest', cmap='gray')
plt.plot(x, y, color='b', linewidth=3)
plt.xlim(0, 50)
plt.ylim(0, 50)
plt.show()

# Showing the original shape vs smooth shape
plt.imshow(image.T, origin='lower', interpolation='nearest', cmap='gray')
plt.plot(x, y, color='b', linewidth=3)
plt.plot(xn, yn, color='r', linewidth=3)
plt.xlim(0, 50)
plt.ylim(0, 50)
plt.show()

# Changing values inside the shape (and outside). Building a boolean mask.
image1 = image.copy()
image2 = image.copy()
mask = np.zeros(image.shape)
xx, yy = np.meshgrid(range(image.shape[0]),range(image.shape[1]))
shapes = np.hstack((xn[:, np.newaxis], yn[:, np.newaxis]))
p = path.Path(shapes)
for i in range(image.shape[0]):
    for j in range(image.shape[1]):
        if not p.contains_point((i, j)):
            image1[i, j] = 0
            mask[i, j] = True
        else:
            image2[i, j] = 0

# Showing changes in image for values outside shape.
plt.imshow(image1.T, origin='lower', interpolation='nearest', cmap='gray')
plt.plot(xn, yn, color='r', linewidth=3)
plt.xlim(0, 50)
plt.ylim(0, 50)
plt.show()

# Showing changes in image for values inside shape.
plt.imshow(image2.T, origin='lower', interpolation='nearest', cmap='gray')
plt.plot(xn, yn, color='r', linewidth=3)
plt.xlim(0, 50)
plt.ylim(0, 50)
plt.show()
对代码进行注释,以便您了解在每个结果图上发生的情况:

1.图像上的简单形状

2.图像上的简单与平滑形状

3.在形状中使用值


4.在我看来,使用形状之外的值

平滑总是意味着平均值。所以,你会得到较少的分数。使用移动平均线时,第一个点的数据将丢失。要解决您的问题,您必须对数据进行高阶多项式拟合?根据数据的外观,然后计算原始曲线中所有点的拟合函数。请参见approxPolyDp函数。或者在必要时看看插值。@Nostrandamus很抱歉把你弄糊涂了。实际上我的意思是用平滑曲线连接一组点。它们不是必需的数据点。