插值法的公式怎么計算 插值法公式及計算步驟

導讀做圖像處理的同學應該經常都會用到圖像的縮放,我們都知道圖片存儲的時候其實就是一個矩陣,所以在對圖像進行縮放操作的時候,也就是在對矩陣進行操作,如果想要將圖片放大,這里我們就需要用到過采樣算法來擴大矩陣,如果想要縮小圖片就使用欠采樣 。
如上圖所示,左圖是原圖像矩陣,右圖是擴大后的圖像矩陣,右圖中的橙色點表示的是矩陣擴大之后通過插值算法填充的像素值 。所以,這篇文章我們主要探討的就是如何來通過插值算法來填充像素值
相關函數介紹在opencv中提供了一個resize函數用來調整圖像的大小,里面提供了好幾種不同的插值算法,如下圖所示
這里我們主要介紹最常用的前5中插值算法,最后兩種插值算法主要是應用在仿射變換中,cv.WARP_FILL_OUTLIERS在從src到dst變換的時候可能會出現異常值,通過這個設定可以將異常值的像素置0 。而cv.WARP_INVERSE_MAP是應用在仿射變換的逆變換,從dst到src的變換,關于仿射變換的更多資料可以參考我的上篇文章一文搞懂仿射變換
插值算法效果對比
我們通過隨機生成一個5×5的圖片,然后通過不同的插值算法將其放大10倍之后,來對比最終圖片的效果 。

如果大家覺得灰度圖不方便觀察,我們可以通過設置plt.imshow的cmap參數來控制顏色,matplotlib提供了幾種不同的類別的色彩映射方式
cmap的類別Sequential
通常使用單一的色調,逐漸增加亮度和顏色,可以用來表示有序的信息
Diverging
通過改變兩種不同的顏色的亮度和飽和度,在中間以不飽和的顏色相遇,通常來用繪制具有關鍵的中間值或者數據偏離零的信息
Cyclic

改變兩種不同顏色的亮度,在中間和開始/結束以不飽和的顏色相遇,應用于在端點出環繞的信息 。
Qualitative
用于表示沒有關系和排序的信息
Miscellaneous
同上
這里我們為了方便觀察不同插值算法之間的區別,我們可以選用雜色來來觀察,這里我就隨機選用了Set1,只需要將上面代碼中的cmap改成了Set1即可
通過初步觀察不同插值算法后的效果圖片我們可以發現,最近鄰插值和區域插值算法的效果,而線性插值、三次樣條插值、Lanczos插值整體效果看起來差不多,不過細節部分還是有所差別,接下來我們就從這幾種插值算法來分析一下 。

最近鄰插值(Nearest Interpolation)最近鄰插值也稱近端插值,是一種在一維或多維空間上進行多變元插值的簡單方法 。插值是一種通過已知的、離散的數據點,在范圍內推求新數據點的過程或方法 。最近鄰插值算法選擇距離所求數據點最近點的值,并且根本不考慮其他相鄰點的值,從而產生一個分段常數的內插值來作為所求數據點的值 。
如上圖所示,黑色的×表示需要插入的值,它會選擇距離它最近的P(x+1,y)的值來作為它的值 。
如果距離四個點的距離都相等,最近鄰插值會如何選擇?
通過上圖不難發現,當插入的值距離四個點都相等時,會選擇距離最近的左上角的值,這是
因為圖像坐標系的原點位于左上角 。
線性插值(Linear interpolation)這里的線性插值其實是指雙線性插值,這種插值算法也是resize函數中默認使用的插值算法 。
雙線性插值,也被稱為雙線性內插 。雙線插值是對線性插值在二維坐標系上的擴展,用于對雙變量函數進行插值,其核心思想是在兩個方向上分別進行一次線性插值 。為了幫助大家更好的理解雙線性插值算法,我們先來看線性插值
假設我們已知坐標(x0,y0)與(x1,y1),我們想要得到該區間[x0,x1上任意位置x所對應y的值,如下圖所示
我們可以求出直線的方程,然后將x坐標代入到方程就可以求出對應的y值,通過直線方程的兩點式可以得到
然后我們根據已知的x,將其代入上式可得
在了解線性插值以后,我們再來看看雙線性插值
假如我們想得到未知函數fff在點P=(x,y)的值,假設我們已知函數f在Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1)及Q22=(x2,y2)四個點的值
首先在x方向進行線性插值,利用Q11和Q21可以求得R1的y值,利用Q12和Q22可以求得R2的y值
細心的同學也許發現了,這個插值好像與線性插值并不是一模一樣的,所以我們用的是≈而非=,這里其實采用的是一種加權平均算法結合兩點來計算其中一點的y值,主要是根據計算點距離兩個端點在x方向上的距離來計算計算點y值所占的比例 。
接下來,我們再利用已經計算出來的R1和R2來P點的插值,可得

推薦閱讀