插值演算法實現
『壹』 如何用matlab實現插值演算法
實例展示
1
先看一個實例,最後再來說明一維插值在matlab中的用法。實例如下圖,用13個節點作三種插值,並比較結果。
2
首先啟動matlab,選擇編輯器,再新建一個命令文件。
3
然後,在編輯器窗口中輸入本題的代碼。如下圖所示。並保存,此處命名為yiwei。
4
最後再命令行窗口處輸入yiwei,並敲入鍵盤上的enter建。最終得到的結果是插值與原來的13個數據點之間的比較圖,可以看出結果很好。
END
命令解釋
1
通過上面的例子,也知道了matlab進行一維插值的命令是interp1.
該命令的形式為y1=interp1(x0,y0,x1,'method').
功能:根據已知的數據(x0,y0),用method方法進行插值,然後計算x1對應的函數值y1.
2
其中的參數及其注意事項。
x0,y0是已知的數據向量,其中x應以升序或者降序排列,x1是插值點的自變數坐標向量;method是用來選擇插值演算法的,它可以取:『linear』(線性插值)、『cubic』(三次多項式插值)、『nearst』(最近插值)、『spline』(三次樣條插值)。
『貳』 插值法計算公式是什麼
插值法計算公式的核心表達式是:Y = Y1 + (Y2 - Y1) × (X - X1) / (X2 - X1)。這種方法簡單地解釋就是,通過相似三角形的原理,根據兩點已知數據(例如Y1和X1,Y2和X2),來估算在任意點X上的數值Y。
內插法,或稱為插值法,其目的是通過已知函數在特定點的值,構造一個近似的函數,以此估算函數在其他點的值。這種方法根據函數類型可分為線性內插(線性多項式插值,誤差在插值點為零)和非線性內插等,根據自變數數量則有單變數插值、雙變數插值和三變數插值等不同的形式。
特別提到的是線性插值,這種插值方式的優勢在於其構建的是一次多項式的簡單模型。它通過連接兩點(如A點和B點)的直線來近似表示原函數,不僅易於理解和應用,而且在查表需要估算新數值時,效果明顯。總的來說,線性插值是一種實用且直觀的數值近似方法。
『叄』 圖像雙三次插值演算法原理及python實現
一. 圖像雙三次插值演算法原理:
假設源圖像 A 大小為 m*n ,縮放後的目標圖像 B 的大小為 M*N 。那麼根據比例我們可以得到 B(X,Y) 在 A 上的對應坐標為 A(x,y) = A( X*(m/M), Y*(n/N) ) 。在雙線性插值法中,我們選取 A(x,y) 的最近四個點。而在雙立方插值法中,我們選取的是最近的16個像素點作為計算目標圖像 B(X,Y) 處像素值的參數。如圖所示:
如圖所示 P 點就是目標圖像 B 在 (X,Y) 處對應於源圖像中的位置,P 的坐標位置會出現小數部分,所以我們假設 P 的坐標為 P(x+u,y+v),其中 x,y 分別表示整數部分,u,v 分別表示小數部分。那麼我們就可以得到如圖所示的最近 16 個像素的位置,在這里用 a(i,j)(i,j=0,1,2,3) 來表示。
雙立方插值的目的就是通過找到一種關系,或者說系數,可以把這 16 個像素對於 P 處像素值的影響因子找出來,從而根據這個影響因子來獲得目標圖像對應點的像素值,達到圖像縮放的目的。
BiCubic基函數形式如下:
二. python實現雙三次插值演算法
from PIL import Image
import numpy as np
import math
# 產生16個像素點不同的權重
def BiBubic(x):
x=abs(x)
if x<=1:
return 1-2*(x**2)+(x**3)
elif x<2:
return 4-8*x+5*(x**2)-(x**3)
else:
return 0
# 雙三次插值演算法
# dstH為目標圖像的高,dstW為目標圖像的寬
def BiCubic_interpolation(img,dstH,dstW):
scrH,scrW,_=img.shape
#img=np.pad(img,((1,3),(1,3),(0,0)),'constant')
retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)
for i in range(dstH):
for j in range(dstW):
scrx=i*(scrH/dstH)
scry=j*(scrW/dstW)
x=math.floor(scrx)
y=math.floor(scry)
u=scrx-x
v=scry-y
tmp=0
for ii in range(-1,2):
for jj in range(-1,2):
if x+ii<0 or y+jj<0 or x+ii>=scrH or y+jj>=scrW:
continue
tmp+=img[x+ii,y+jj]*BiBubic(ii-u)*BiBubic(jj-v)
retimg[i,j]=np.clip(tmp,0,255)
return retimg
im_path='../paojie.jpg'
image=np.array(Image.open(im_path))
image2=BiCubic_interpolation(image,image.shape[0]*2,image.shape[1]*2)
image2=Image.fromarray(image2.astype('uint8')).convert('RGB')
image2.save('BiCubic_interpolation.jpg')
三. 實驗結果:
四. 參考內容:
https://www.cnblogs.com/wojianxin/p/12516762.html
https://blog.csdn.net/Ibelievesunshine/article/details/104942406