本文目錄一覽:
python 拉格朗日插值 不能超過多少個值
拉格朗日插值Python代碼實現
1. 數學原理
對某個多項式函數有已知的k+1個點,假設任意兩個不同的都互不相同,那麼應用拉格朗日插值公式所得到的拉格朗日插值多項式為:
其中每個lj(x)為拉格朗日基本多項式(或稱插值基函數),其表達式為:
2. 輕量級實現
利用
直接編寫程序,可以直接插值,並且得到對應的函數值。但是不能得到係數,也不能對其進行各項運算。
123456789101112
def h(x,y,a): ans=0.0 for i in range(len(y)): t=y[i] for j in range(len(y)): if i !=j: t*=(a-x[j])/(x[i]-x[j]) ans +=t return ansx=[1,0]y=[0,2]print(h(x,y,2))
上述代碼中,h(x,y,a)就是插值函數,直接調用就行。參數說明如下:
x,y分別是對應點的x值和y值。具體詳解下解釋。
a為想要取得的函數的值。
事實上,最簡單的拉格朗日插值就是兩點式得到的一條直線。
例如:
p點(1,0)q點(0,2)
這兩個點決定了一條直線,所以當x=2的時候,y應該是-2
該代碼就是利用這兩個點插值,然後a作為x=2調用函數驗證的。
3. 引用庫
3.1 庫的安裝
主要依賴與 scipy。官方網站見:
安裝的方法很簡單,就是使用pip install scipy 如果失敗,則將whl文件下載到本地再利用命令進行安裝。
可能如果沒有安裝numpy
3.2 庫的使用
from scipy.interplotate import lagrange
直接調用lagrange(x,y)這個函數即可,返回 一個對象。
參數x,y分別是對應各個點的x值和y值。
例如:(1,2) (3,5) (5,9)這三個點,作為函數輸入應該這麼寫:
x=[1,3,5]
y =[2, 5, 9]
a=lagrange(x,y)
直接輸出該對象,就能看到插值的函數。
利用該對象,能得到很多特性。具體參見:
a.order得到階
a[]得到係數
a()得到對應函數值
此外可以對其進行加減乘除運算
3.3 代碼實現
1234567 from scipy.interpolate import lagrangex=[1,2,3,4,7]y=[5,7,10,3,9]a=lagrange(x,y)print(a)print(a(1),a(2),a(3))print(a[0],a[2],a[3])
結果是:
class ‘numpy.lib.polynomial.poly1d’ 4
4 3 2
0.5472 x – 7.306 x + 30.65 x – 47.03 x + 28.13
5.0 7.0 10.0
28.1333333333 30.6527777778 -7.30555555556
解釋:
class ‘numpy.lib.polynomial.poly1d’ 4
這一行是輸出a的類型,以及最高次冪。
4 3 2
0.5472 x – 7.306 x + 30.65 x – 47.03 x + 28.13
第二行和第三行就是插值的結果,顯示出的函數。
第二行的數字是對應下午的x的冪,如果對應不齊,則是排版問題。
5.0 7.0 10.0
第四行是代入的x值,得到的結果。
也就是說,用小括弧f(x)的這種形式,可以直接得到計算結果。
28.1333333333 30.6527777778 -7.30555555556
01-02怎麼用python實現克里金插值
只為了輸出的話倒是還好
1
print ‘[‘+’, ‘.join(map(lambda x: ‘0’+str(x) if len(str(x))==1 else str(x),range(20)))+’]’
克里金插值演算法
根據項目對數據處理的要求,採用了優化的克里金插值演算法,將等值線地化數據插值轉換為格網數據,以便實現地化數據的三維顯示(王家華等,1999)。其主要實現過程如下:
第一步,計算半變異圖,用非線性最小二乘擬合半變異函數係數;
第二步,數據點進行四叉樹存儲;
第三步,對每一格網點搜索鄰近數據點;
第四步,由待預測網格點和鄰近數據點計算克里金演算法中係數矩陣,及右端常數向量;
第五步,對矩陣進行LU分解,回代求解待預測點的預測值。
克里金插值演算法主要包括半變異函數和鄰近點搜索的計算,實現方法如下。
(1)半變異函數計算
半變異函數是地質統計學中區域化變數理論的基礎。地質統計學主要完成2方面的任務:利用半變異函數生成半變異圖來量化研究對象的空間結構;通過插值方法利用半變異圖中擬合模型和研究對象周圍的實測值來對未知值進行預測。
半變異函數是用來描述區域化變數結構性和隨機性並存這一空間特徵而提出的。在滿足假設的條件下,隨機函數z(x)和z(x+h)為某一物理參數測定值的一一對應的2組函數,h為每對數之間的距離。半變異函數γ(h)可用下式來計算:
γ(h)= 1/2E{[z(x)-z(x +h)]2}
4種基本的半變異函數模式(除了這4種基本模式以外,還有很多模式),包括:
1)線形模式(Linear Model)
浙江省農業地質環境GIS設計與實現
2)球面模式(Spherical Model)
浙江省農業地質環境GIS設計與實現
3)指數模式(Exponential Model)
浙江省農業地質環境GIS設計與實現
4)高斯模式(Gaussian Model)
浙江省農業地質環境GIS設計與實現
半變異函數γ(h)會隨距離h增大而增大,並逐漸逼近一定值(C0 +C),稱為基台值(Sill);而逼近基台值所對應的距離,稱為影響範圍(Range),表示空間中兩位置間的距離小於影響範圍時,是空間相關性的。在線性和球面模式中,影響範圍等於a;在指數和高斯模式中,影響範圍則分別等於3a和
。而模式於半變異函數軸的截距(C0)成為塊金係數(Nugget Effect),產生的原因主要是樣本測定的誤差和最小採樣間距內的變異。在應用上,為探討說明空間變異在不同方向上的差距,也可利用非等向性的變異函數模式。半變異圖擬合半變異函數模式的擬合方法可採用非線性最小二乘法擬合。
(2)鄰近點搜索演算法
由於矩陣LU分解求解方程的演算法會隨著矩陣維數的增加計算量增大,所以針對大量採樣數據點時不能採用全部數據進行估計,必須採用插值點的臨近點數據進行計算,即採用局部數據進行克里金演算法進行計算。搜索鄰近點可採用四叉樹結構存儲總數據,以提高搜索鄰近點的速度。
對於選取鄰近點的數目要有所限制,因該值的大小選擇會影響插值的計算結果。若太大,則內插結果過於平滑;太小,則無法反映地表的變化;距離預測點較遠的實測點可能與待估樣點已經不存在自相關關係,也不能參與插值計算。採取以插值點為圓心,以R為半徑的圓來確定取樣的範圍和參加計算的實測樣點數目(如果存在各向異性,則可考慮劃定一橢圓作為研究區域)。為了避免方向上的偏差,將圓平均地分為4個扇區,每個扇區內實測點數目在2~5之間,這樣總共參與每個待估點預測的實測點數目平均達到8個。
區域內臨近點的選擇,存在著兩種策略。
1)以鄰近點的個數為基準。通常情況下,鄰近點的個數以8~12個為宜,並且個數不能少於2個。此時計算出來的圖像較為光滑。
2)以鄰近點的半徑尺度為基準。通常情況下,選擇5~10 倍柵格間距的距離為宜。此時必須定義選擇鄰近點的最小和最大個數,當在一定半徑內查找的鄰近點個數小於最小個數時,應擴大搜索半徑,使之達到最小查找個數;反之在一定半徑內查找的鄰近點個數大於最大個數時,應縮小搜索半徑,使之小於最大查找個數。通常情況下最大最小個數分別可以定為20和4。
克里金演算法的優點在於它基於一些可被驗證的統計假設。根據這些假設,克里金演算法產生的柵格節點估計量是最佳的,所有的估計量都依賴於可獲得的觀測值,並且平均誤差最小。克里金演算法提供了方差誤差分析的表達式,可以表明每一個柵格節點的估計精度。
雙線性插值法原理 python實現
碼字不易,如果此文對你有所幫助,請幫忙點贊,感謝!
一. 雙線性插值法原理:
① 何為線性插值?
插值就是在兩個數之間插入一個數,線性插值原理圖如下:
② 各種插值法:
插值法的第一步都是相同的,計算目標圖(dstImage)的坐標點對應原圖(srcImage)中哪個坐標點來填充,計算公式為:
srcX = dstX * (srcWidth/dstWidth)
srcY = dstY * (srcHeight/dstHeight)
(dstX,dstY)表示目標圖像的某個坐標點,(srcX,srcY)表示與之對應的原圖像的坐標點。srcWidth/dstWidth 和 srcHeight/dstHeight 分別表示寬和高的放縮比。
那麼問題來了,通過這個公式算出來的 srcX, scrY 有可能是小數,但是原圖像坐標點是不存在小數的,都是整數,得想辦法把它轉換成整數才行。
不同插值法的區別就體現在 srcX, scrY 是小數時,怎麼將其變成整數去取原圖像中的像素值。
最近鄰插值(Nearest-neighborInterpolation):看名字就很直白,四捨五入選取最接近的整數。這樣的做法會導致像素變化不連續,在目標圖像中產生鋸齒邊緣。
雙線性插值(Bilinear Interpolation):雙線性就是利用與坐標軸平行的兩條直線去把小數坐標分解到相鄰的四個整數坐標點。權重與距離成反比。
雙三次插值(Bicubic Interpolation):與雙線性插值類似,只不過用了相鄰的16個點。但是需要注意的是,前面兩種方法能保證兩個方向的坐標權重和為1,但是雙三次插值不能保證這點,所以可能出現像素值越界的情況,需要截斷。
③ 雙線性插值演算法原理
假如我們想得到未知函數 f 在點 P = (x, y) 的值,假設我們已知函數 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四個點的值。最常見的情況,f就是一個像素點的像素值。首先在 x 方向進行線性插值,然後再在 y 方向上進行線性插值,最終得到雙線性插值的結果。
④ 舉例說明
二. python實現灰度圖像雙線性插值演算法:
灰度圖像雙線性插值放大縮小
import numpy as np
import math
import cv2
def double_linear(input_signal, zoom_multiples):
”’
雙線性插值
:param input_signal: 輸入圖像
:param zoom_multiples: 放大倍數
:return: 雙線性插值後的圖像
”’
input_signal_cp = np.copy(input_signal) # 輸入圖像的副本
input_row, input_col = input_signal_cp.shape # 輸入圖像的尺寸(行、列)
# 輸出圖像的尺寸
output_row = int(input_row * zoom_multiples)
output_col = int(input_col * zoom_multiples)
output_signal = np.zeros((output_row, output_col)) # 輸出圖片
for i in range(output_row):
for j in range(output_col):
# 輸出圖片中坐標 (i,j)對應至輸入圖片中的最近的四個點點(x1,y1)(x2, y2),(x3, y3),(x4,y4)的均值
temp_x = i / output_row * input_row
temp_y = j / output_col * input_col
x1 = int(temp_x)
y1 = int(temp_y)
x2 = x1
y2 = y1 + 1
x3 = x1 + 1
y3 = y1
x4 = x1 + 1
y4 = y1 + 1
u = temp_x – x1
v = temp_y – y1
# 防止越界
if x4 = input_row:
x4 = input_row – 1
x2 = x4
x1 = x4 – 1
x3 = x4 – 1
if y4 = input_col:
y4 = input_col – 1
y3 = y4
y1 = y4 – 1
y2 = y4 – 1
# 插值
output_signal[i, j] = (1-u)*(1-v)*int(input_signal_cp[x1, y1]) + (1-u)*v*int(input_signal_cp[x2, y2]) + u*(1-v)*int(input_signal_cp[x3, y3]) + u*v*int(input_signal_cp[x4, y4])
return output_signal
# Read image
img = cv2.imread(“../paojie_g.jpg”,0).astype(np.float)
out = double_linear(img,2).astype(np.uint8)
# Save result
cv2.imshow(“result”, out)
cv2.imwrite(“out.jpg”, out)
cv2.waitKey(0)
cv2.destroyAllWindows()
三. 灰度圖像雙線性插值實驗結果:
四. 彩色圖像雙線性插值python實現
def BiLinear_interpolation(img,dstH,dstW):
scrH,scrW,_=img.shape
img=np.pad(img,((0,1),(0,1),(0,0)),’constant’)
retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)
for i in range(dstH-1):
for j in range(dstW-1):
scrx=(i+1)*(scrH/dstH)
scry=(j+1)*(scrW/dstW)
x=math.floor(scrx)
y=math.floor(scry)
u=scrx-x
v=scry-y
retimg[i,j]=(1-u)*(1-v)*img[x,y]+u*(1-v)*img[x+1,y]+(1-u)*v*img[x,y+1]+u*v*img[x+1,y+1]
return retimg
im_path=’../paojie.jpg’
image=np.array(Image.open(im_path))
image2=BiLinear_interpolation(image,image.shape[0]*2,image.shape[1]*2)
image2=Image.fromarray(image2.astype(‘uint8’)).convert(‘RGB’)
image2.save(‘3.png’)
五. 彩色圖像雙線性插值實驗結果:
六. 最近鄰插值演算法和雙三次插值演算法可參考:
① 最近鄰插值演算法:
② 雙三次插值演算法:
七. 參考內容:
原創文章,作者:VT1DH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/129081.html