二維三次卷積插值演算法

2021-06-18 06:50:02 字數 2989 閱讀 4067

看**和提問、討論都更方便。

生產或生活中,我們往往只能得到有限的關於某個物理量的離散點(比如一張,我們只能得到其原大小內每個座標處的顏色資訊),但是很多時候,我們還需要不在已有柵格點的物理量資訊(比如影象縮放時)。此時,就需要某種估計方法,用於得到該座標處的物理量值,此時就需要通過插值得到。常用的插值演算法有很多,從簡單的線性插值,lagrange插值,newton插值,到較複雜的herminate插值,二維三次卷積插值,分段多項式插值以及樣條插值。

那麼在使用時,該如何選擇呢?

一般來說,有兩個準則:第乙個是要滿足精度要求、連續性要求(比如曲面過渡往往要求一階或者二階導數連續);第二個是要滿足具體使用時的演算法複雜度要求。演算法本無優劣,須要結合具體情況靈活選擇。

這裡介紹一種在影象處理和dem(digital elevation model)中應用很廣的一種插值演算法----二維三次卷積插值演算法。

dem資料是二維資料,對於二維資料,經常使用的插值方法有雙線性插值和雙立方插值,它們都是在最鄰近的四個網點之間進行插值。雙線性插值演算法簡單,但是卻無法得到網點處的導數.雙立方herminate插值是四個鄰近網點高度的加權和,且方程連線可微。但是該方法的缺點是網點處的微分被強迫為零,雖保證了插值方程的連續性,但是地形在網點處為平面時和直覺矛盾。

綜合考慮演算法效率和插值精度,二維三次卷積插值是比較理想的插值方法。

在處理地形時, 二維三次插值演算法是以待插值點周圍16個點的高程值來得到它自己的高程值。如下圖所示。

由於該插值方法需要使用未知點周圍16個點的資料,當數字地形風格為有限大小時,如果未知點處於風格國家級,就無法得到風格以下的網點資料,因此,需要研究該演算法的邊界條件。

robert g k在《cubic convolution interpolation for digital image processing》一文中給出了一種較好的邊界條件。設

網點在x方向由0到m,在y方向由0到n,則邊界條件為

下面是用c++寫的二維三次卷積插值的源**。

首先是point.h檔案

#ifndef point_h

#define point_h

typedef struct

point;

#endif

然後是interpolation.h檔案

#ifndef interpolation_h

#define interpolation_h

#include "point.h"

#include #include #include #include using namespace std;

float getinterpolationheight(float**,int,int,float,float);

float funa(float);

float funb(float);

float func(float);

float fund(float);

float getdeminterpolationheight(point**p,float**expandedh,int rownum,int colnum,float delta,float x,float y);

float**getexpandedh(point**p,int rownum,int colnum);

point**interpolation( point**p,const int rownum,const int colnum) //p為傳入的二維矩陣。返回的也是二維矩陣,不過是在函式中用new新建的。加上const是為了讓p對應的值不能改變。interpolatetimes是插值次數。

/對於行號和列號都為偶數的點,它就等於原陣列元素。

for(int i=0;i0&&j=i*delta)&&(x

}for(int j=0;j=j*delta)&&(y

}///最後一行和最後一列要單獨考慮。

if(startrow==100000)//說明是最後一行或者是最後一列。

startrow=rownum-2;

if(startcol==100000)

startcol=colnum-2;

//特別注意下面這個!deltax要由y和startcol得到,而deltay要由x和startrow得到。

deltax=(y-startcol*delta)/delta;

deltay=(x-startrow*delta)/delta;

if((deltax==0)&&(deltay==0))

return p[startrow][startcol].z;

float height;

height=getinterpolationheight(expandedh,startrow,startcol,deltax,deltay);

//在返回之前,記得將不需要的陣列刪除。

return height;}/

///float funa(float delta)

float funb(float delta)

float func(float delta)

float fund(float delta)

#endif

下面兩張圖是插值前後的對比結果(利用圖形介面opengl進行顯示)。

MATLAB二維插值和三維插值

插值問題描述 已知 乙個函式上的若干點,但函式具體表示式未知,現在要利用已知的若干點求在其他點處的函式值,這個過程就是插值的過程.1.一維插值 一維插值就是給出y f x 上的點 x1,y1 x2,y2 xn,yn 由此求出y f x 在點xa處的值ya的值.實現一維插值使用interp1命令,使用...

分段二次插值例題 分段三次插值

摘 要用函式來表示變數間的數量關係廣泛應用於各學科領域,但是在實際 問題中,往往是通過實驗 觀測以及計算等方法,得到的是函式在一些點 上的函式值。如何通過這些離散資料找到函式的乙個滿足精度要求且便於 使用的近似表示式,是經常遇到的問題。對於這類問題我們解決的方法為插值法,而最常用也最簡單的插值方 法...

三次樣條插值

條件 1 輸入 x y f x 0 leq i leq n 2 要求擬合的曲線 s x 滿足 對於任意的 1 leq i leq n 1 在 x 處一階二階導數連續,s x 也連續,且 s x f x s x f x 求解過程 設 s m 對於區間 x x s x 是 x x 上的線性函式,所以設 ...