1. 程式人生 > >影象處理九:擬合曲線

影象處理九:擬合曲線

一、最小二乘法擬合曲線

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

#自定義函式 e指數形式
def func(x, a, b,c):
    return a*np.sqrt(x)*(b*np.square(x)+c)

#定義x、y散點座標
x = [10,20,30,40,50,60,70,80]
x = np.array(x)
y = [158,455,265,152,263,813,562,126]
y = np.array(y)

#非線性最小二乘法擬合
popt, pcov = curve_fit(func, x, y)
#獲取popt裡面是擬合係數
print(popt)
a = popt[0]
b = popt[1]
c = popt[2]
yvals = func(x,a,b,c) #擬合y值
print('popt:', popt)
print('係數a:', a)
print('係數b:', b)
print('係數c:', c)
print('係數pcov:', pcov)
print('係數yvals:', yvals)
#繪圖
plot1 = plt.plot(x, y, 's',label='original values')
plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('curve_fit')
plt.show()

二、高斯分佈擬合曲線

import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit


#自定義函式 e指數形式
def func(x, a,u, sig):
    return  a*(np.exp(-(x - u) ** 2 /(2* sig **2))/(math.sqrt(2*math.pi)*sig))*(431+(4750/x))


#定義x、y散點座標
x = [10,20,30,40,50,60,70,80]
x=np.array(x)
# x = np.array(range(20))
print('x is :\n',x)
y = [158,455,265,152,263,813,562,126]
y = np.array(y)
print('y is :\n',y)

popt, pcov = curve_fit(func, x, y,p0=[3.1,4.2,3.3])
#獲取popt裡面是擬合係數
a = popt[0]
u = popt[1]
sig = popt[2]


yvals = func(x,a,u,sig) #擬合y值
print(u'係數a:', a)
print(u'係數u:', u)
print(u'係數sig:', sig)

#繪圖
plot1 = plt.plot(x, y, 's',label='original values')
plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('curve_fit')
plt.show()

三、多項式擬合曲線

import numpy as np
import matplotlib.pyplot as plt

#定義x、y散點座標
#x = [10,20,30,40,50,60,70,80]
#y = [158,455,265,152,263,813,562,126]
#x = [16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304]
x = [0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,]
x = np.array(x)
#y = [506,506,506,506,506,506,506,506,506,505,505,505,505,505,505,505,506,505,504]
y = [340,338,345,348,348,349,50,350,350,350,350,350,350,350,350,350,350,349,348,348,348,347,347,348,348,347,347,347,347,348,347,346]
y = np.array(y)
#用3次多項式擬合
f1 = np.polyfit(x, y, 3)
p1 = np.poly1d(f1)
yvals = p1(x)#擬合y值

#x1 = [32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320]
x1 = [16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512]
x1 = np.array(x1)
#y1 = [529,528,528,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,529]
y1 = [370,367,376,378,378,379,379,380,380,380,379,379,379,379,378,378,378,378,377,376,376,375,375,372,372,372,372,375,375,372,372,373]
y1 = np.array(y1)
f2 = np.polyfit(x1,y1,3)
p2 = np.poly1d(f2)
yvals_2 = p2(x1)
#也可使用yvals=np.polyval(f1, x)
#繪圖
plot1 = plt.plot(x, y, 's',label='original values')
plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')

plot3 = plt.plot(x1, y1, 's', label = 'original values')
plot4 = plt.plot(x1, yvals_2, 'r',label='',color='green')

#plt.axis('off')
#plt.legend(loc=4) #指定legend的位置右下角
#plt.title('polyfitting')
#plt.show()
plt.savefig("F:/a.jpg")