Python樣條插值
Ⅰ 雙線性插值法原理 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.(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')
五. 彩色圖像雙線性插值實驗結果:
六. 最近鄰插值演算法和雙三次插值演算法可參考:
① 最近鄰插值演算法: https://www.cnblogs.com/wojianxin/p/12515061.html
https://blog.csdn.net/Ibelievesunshine/article/details/104936006
② 雙三次插值演算法: https://www.cnblogs.com/wojianxin/p/12516762.html
https://blog.csdn.net/Ibelievesunshine/article/details/104942406
七. 參考內容:
https://www.cnblogs.com/wojianxin/p/12515061.html
https://blog.csdn.net/Ibelievesunshine/article/details/104939936
Ⅱ python的image.nearest代表什麼意思
from PIL import Imageimport os.pathimport globdef convertjpg(jpgfile,outdir,width=1280,height=720): img=Image.open(jpgfile) new_img=img.resize((width,height),Image.BILINEAR) new_img.save(os.path.join(outdir,os.path.basename(jpg...
Ⅲ csaps()函數對應python什麼函數
return 值:只能返回一次,只要執行return函數就終止
返回值:沒有類型限制,也沒有個數限制
沒有return:None
返回一個值
返回多個值:元組
Ⅳ 如何通過python實現三次樣條插值
spline函數可以實現三次樣條插值 x = 0:10; y = sin(x); xx = 0:.25:10; yy = spline(x,y,xx); plot(x,y,'o',xx,yy) 另外fnplt csapi這兩個函數也是三次樣條插值函數,具體你可以help一下!
Ⅳ 在Python程序中的插值誤差問題,怎麼解決
代碼如下所示:import numpy as npfrom matplotlib import pyplot as pltfrom scipy.interpolate import interp1dx=np.linspace(0,10*np.pi,num=20)y=np.sin(x)f1=interp1d(x,y,kind='linear')#線性插值f2=interp1d(x,y,kind='cubic')#三次樣條插值x_pred=np.linspace(0,10*np.pi,num=1000)y1=f1(x_pred)y2=f2(x_pred)plt.figure()plt.plot(x_pred,y1,'r',label='linear')plt.plot(x,f1(x),'b--','origin')plt.legend()plt.show()plt.figure()plt.plot(x_pred,y2,'b--',label='cubic')plt.legend()plt.show()
Ⅵ python 線性插值
不知道有沒有,可能python數學相關的庫里會有吧
不過你寫的也不對啊,取3個值,應該是4均分。
>>>defjunfen(start,end,num):
k=(end-start)/(num+1)
returnset([start+item*kforiteminrange(1,num+1)])
Ⅶ Python數據分析在數學建模中的應用匯總(持續更新中!)
1、Numpy常用方法使用大全(超詳細)
1、Series和DataFrame簡單入門
2、Pandas操作CSV文件的讀寫
3、Pandas處理DataFrame,Series進行作圖
1、Matplotlib繪圖之屬性設置
2、Matplotlib繪制誤差條形圖、餅圖、等高線圖、3D柱形圖
1、層次分析法(AHP)——算數平均值法、幾何平均值法、特徵值法(Python實現,超詳細注釋)
2、Python實現TOPSIS分析法(優劣解距離法)
3、Python實現線性插值和三次樣條插值
4、Python實現線性函數的擬合演算法
5、Python實現統計描述以及計算皮爾遜相關系數
6、Python實現迪傑斯特拉演算法和貝爾曼福特演算法求解最短路徑
Ⅷ 氣象 python 二維線性插值
scipy.interpolate.griddata(points, values, xi, method='linear', fill_value=nan, rescale=False)
官網: https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html?highlight=griddata
一維數組,shape為(n,) ,是需要插值的變數數據
如果需要插值的變數var是一個多維數組,則需要轉換成一維的
方法:var.ravel()
values的坐標,shape為(n,D),第一維需要與values長度相同,
D就是values的坐標軸個數
如果是在地圖上,D為2,分別是lon、lat,是values中對應的每個數據的lat和lon
插值過後的新的坐標,shape為(m, D) ,第二維與points的第二維相同
插值方法,有 『linear』, 『nearest』, 『cubic』
nearest:返回最接近插值點的數據點的值
linear:線性插值
cubic:三次樣條
用於填充輸入點凸包之外的請求點的值。如果未提供,則默認值為 nan 。此選項對『nearest』 方法無效。
在執行插值之前將點重新縮放到單位立方體。如果某些輸入維度具有不可比較的單位並且相差許多數量級,這將很有用。
Ⅸ 「Scipy」樣條插值在數據可視化中的運用
好久沒有更新文章了,學校的教材發下來了,作業一下就變多了。
首先,把最終效果放出來:
運用樣條插值,即 B-Spline ,可以使你在圖表中使用曲線連接離散數據(在插值法中,這些離散數據稱為 節點 )
正如你在上面所看到的那樣,在Python中插值非常簡單, Scipy 中的 interpolate 為你提供了樣條插值所需要的一系列函數。
import部分就不多說了,
這里首先定義了一系列節點,這里數據是隨機的,
接下來,首先使用 linspace 為插值提供所需的x值, splrep 根據節點計算了樣條曲線的參數,最後將其傳遞給 splev 計算插值後的結果。
你可能是抱著想要用曲線連接節點的目的來看這篇文章,但看到這里還沒搞懂插值法是個什麼玩意,那麼接下來的內容就是在講數學中的插值法,與Python和Scipy已無關聯。
插值法,就是在給定的節點中作出合適的函數,使得這條曲線 經過每一個節點 ,這也就是為什麼在數據可視化中使用插值而不是其他方法的原因,因為插值後仍然能夠准確知道每一節點所對應的值。
那麼,是不是節點越多,插值的准確性就越高呢?
貌似是這樣,畢竟節點越多,對曲線的限制條件就越多,那准確性不久越高了。
但是呢,如果你使用多節點直接插值(不是在程序中插值,因為程序會使用分段樣條插值),你就會發現,曲線在兩段有明顯的震盪,並且節點越多,震盪越明顯、越大:
這種現象被稱為 Tolmé Runge 現象( 龍格現象 ),描述的就是這一問題。對此的數學證明在知乎上有, 傳送門 。
通過龍格現象,我們會發現,當節點數量趨向於無窮時,插值的誤差會趨向於無窮大:
那麼,如何避免這一情況呢,可以把我們原先的等距節點替換成Chebyshev節點,但是如果我們的離散數據確實等距,這一方法不好用,那麼就可以才用分段插值,我們的程序對龍格現象也是這樣處理的。
分段插值就是將高次多項式拆分成多個低次多項式,一般都拆分成三次多項式。
由於插值和擬合常常一起出現,所以這里也簡單提一下擬合。
擬合是對你給出的離散數據,作出於數據 差距最小 的函數,另外,按照擬合的結果,擬合也分線性擬合和非線性擬合。
擬合與插值的差別就在於,插值必須過節點,但是擬合不需要,所以擬合曲線的整體效果會更好,也就是更平滑。
擬合一般都用在數據分析里,因為擬合曲線更能夠看出整體的變化趨勢嘛。
這篇文章寫起來難度還是想當大,如果我的描述有問題的話,歡迎評論區留言。
前往我的博客查看本文
Ⅹ 數值分析中的樣條函數:使用scipy.interpolate.splrep函數實現
在 數學 學科 數值分析 中, 樣條 是一種特殊的 函數 ,由 多項式 分段定義。樣條的 英語 單詞spline來源於可變形的樣條工具,那是一種在 造船 和 工程制圖 時用來畫出光滑形狀的工具。在中國大陸,早期曾經被稱做「齒函數」。後來因為工程學術語中「放樣」一詞而得名。
在 插值 問題中,樣條插值通常比 多項式插值 好用。用低階的樣條插值能產生和高階的多項式插值類似的效果,並且可以避免被稱為 龍格現象 的數值不穩定的出現。並且低階的樣條插值還具有「保凸」的重要性質。
在 計算機科學 的 計算機輔助設計 和 計算機圖形學 中,樣條通常是指分段定義的多項式 參數曲線 。由於樣條構造簡單,使用方便,擬合準確,並能近似 曲線擬合 和互動式曲線設計中復雜的形狀,樣條是這些領域中曲線的常用表示方法。
scipy.interpolate.splrep(x,y,w = None,xb = None,xe = None,k = 3,task = 0,s = None,t = None,full_output = 0,per = 0,quiet = 1 )
找到一維曲線的B樣條曲線表示。
給定數據點集,確定區間上度k的平滑樣條近似。(x[i], y[i])xb <= x <= xe
x,y: array_like
定義曲線y = f(x)的數據點。
w: array_like,optional
權重的嚴格正秩1數組,其長度與x和y相同。權重用於計算加權最小二乘樣條擬合。如果y值中的誤差具有矢量d給出的標准偏差,則w應為1 / d。默認值為1(len(x))。
xb, xe:float, optional
適合的間隔。如果為None,則它們分別默認為x [0]和x [-1]。
k: int,optional
花鍵擬合的程度。建議使用三次樣條。甚至應避免使用k值,尤其是在s值小的情況下。1 <= k <= 5
task:{1, 0, -1}, optional
如果task == 0,則在給定的平滑因子s下找到t和c。
如果task == 1,則找到t和c作為平滑因子s的另一個值。對於同一組數據,必須先前有一個task = 0或task = 1的調用(t將存儲為內部使用)
如果task = -1,則找到給定結點t的加權最小二乘樣條曲線。這些應該是內部結,因為兩端的結將自動添加。
s:float, optional
平滑條件。滿足以下條件來確定平滑度:sum((w (y-g)) * 2,axis = 0)<= s其中g(x)是(x,y)的平滑插值。用戶可以使用s來控制貼合度和貼合度之間的權衡。較大的s表示更平滑,而較小的s表示較不平滑。s的推薦值取決於權重w。如果權重代表y的標准偏差的倒數,則應在(m-sqrt(2 * m),m + sqrt(2 * m))范圍內找到一個好的s值,其中m是x,y和w中的數據點。默認值:如果提供了權重,則s = m-sqrt(2 * m)。如果未提供權重,則s = 0.0(內插)。
t:array_like, optional
任務= -1所需的結。如果給出,則任務自動設置為-1。
f:full_outputbool, optional
如果非零,則返回可選輸出。
per:bool, optional
如果非零,則將數據點視為周期為x [m-1]-x [0]的周期,然後返回平滑的周期樣條近似。不使用y [m-1]和w [m-1]的值。
quiet:bool, optional
非零以禁止顯示消息。不推薦使用此參數;請改用標準的Python警告過濾器。
Returns:
tck:tuple
元組(t,c,k),包含結向量,B樣條系數和樣條度。
fp:array, optional
樣條近似值的平方殘差的加權總和。
ier:int, optional
有關splrep成功的整數標志。如果ier <= 0,則表示成功。如果[1,2,3]中的ier發生錯誤,但未引發。否則會引發錯誤。
msg:str, optional
對應於整數標志ier的消息。
下面插值一個函數