雙線性插值c語言
⑴ 雙線性插值的示例
已知的紅色數據點與待插值得到的綠色點
假如我們想得到未知函數f在點P= (x,y) 的值,假設我們已知函數f在Q11 = (x1,y1)、Q12 = (x1,y2),Q21 = (x2,y1) 以及Q22 = (x2,y2) 四個點的值。
首先在x方向進行線性插值,得到R1和R2,然後在y方向進行線性插值,得到P.
這樣就得到所要的結果f(x,y).
其中紅色點Q11,Q12,Q21,Q22為已知的4個像素點.
第一步:X方向的線性插值,插入藍色 第二步 :做完X方向的插值後再做Y方向的
點R1和R2插值 ,由R1與R2計算P點.
Y方向上插入綠色點P.
線性插值的結果與插值的順序無關。首先進行y方向的插值,然後進行x方向的插值,所得到的結果是一樣的。但雙線性插值插值方法這種方法並不是線性的,首先進行y方向的插值,然後進行x方向的插值,與首先進行 x方向的插值,然後進行 y方向的插值,所得到的R1與R2是不一樣的。
如果選擇一個坐標系統使得 的四個已知點坐標分別為 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那麼插值公式就可以化簡為
f(x,y)=f(0,0)(1-x)(1-y)+f(0,1)(1-x)y+f(1,1)xy+f(1,0)x(1-y) 在x與y方向上,z值成單調性特性的應用中,此種方法可以做外插運算,即可以求解Q1~Q4所構成的正方形以外的點的值。 雙線性插值的一個顯然的三維空間延伸是三線性插值。 三線性插值的方法可參看matlab中的interp3
⑵ 雙線性插值原理的原理
雙線性插值原理,是一種數學原理。
原理
簡單來說
原來的數值序列:0,10,20,30,40
線性插值一次為:0,5,10,15,20,25,30,35,40
即認為其變化(增減)是線形的,可以在坐標圖上畫出一條直線
在數碼相機技術中,這些數值可以代表組成一張照片的不同像素點的色彩、色度等指標。
為了方便理解,先考慮一維情況下的線性插值
對於一個數列c,我們假設c[a]到c[a+1]之間是線性變化的
那麼對於浮點數x(a<=x<a+1),c(x)=c[a+1]*(x-a)+c[a]*(1+a-x);
雙線性插值
雙線性插值作為數值分析中的一種插值演算法,廣泛應用在信號處理,數字圖像和視頻處理等方面。
把這種插值方式擴展到二維情況。
對於一個二維數組c,我們假設對於任意一個浮點數i,c(a,i)到c(a+1,i)之間是線性變化的,c(i,b)到c(i,b+1)之間也是線性變化的(a,b都是整數)
那麼對於浮點數的坐標(x,y)滿足(a<=x<a+1,b<=y<b+1),我們可以先分別求出c(x,b)和c(x,b+1):
c(x,b) = c[a+1][b]*(x-a)+c[a][b]*(1+a-x);
c(x,b+1) = c[a+1][b+1]*(x-a)+c[a][b+1]*(1+a-x);
好,現在已經知道c(x,b)和c(x,b+1)了,而根據假設c(x,b)到c(x,b+1)也是線性變化的,所以:
c(x,y) = c(x,b+1)*(y-b)+c(x,b)*(1+b-y)
這就是雙線性插值。
⑶ 圖像處理中的雙線性插值演算法的原理
何東健的《數字圖像處理》光碟第六章有前兩種的程序
完整程序已發你郵箱
核心代碼如下:
for(y = 0; y < nNewHeight; y++)
{
//指向新圖像第y行
//注意此處寬度和高度是新圖像的寬度和高度
pNewTemp = pNewBits;
pNewTemp += (nNewHeight - 1 - y) * nNewWidthBytes;
//針對圖像每列進行操作
for(x = 0; x < nNewWidth; x++)
{
//計算該像素在源圖像中的坐標
int y0 = (long) (y / fYZoomRatio + 0.5);
int x0 = (long) (x / fXZoomRatio + 0.5);
//判斷是否在源圖范圍內
if( (x0 >= 0) && (x0 < nOldWidth) &&
(y0 >= 0) && (y0 < nOldHeight))
{
//用雙線性插值
if(bBilinear)
{
unsigned char *pTemp = Interpolation (nOldWidth, nOldHeight,
(float)x0, (float)y0,
nOldWidthBytes, nMovedBits, pOldBits);
//復制像素
memcpy(pNewTemp, pTemp, nMovedBits);
delete [] pTemp ;
}
else
//最近鄰插值
{
//指向源圖像第y0行,第x0個像素
//注意此處寬度和高度應該互換
pOldTemp = pOldBits;
pOldTemp += (nOldHeight - 1 - y0) * nOldWidthBytes;
pOldTemp += x0 * nMovedBits;
//復制像素
memcpy(pNewTemp, pOldTemp, nMovedBits);
}
}
pNewTemp += nMovedBits;
}
}
⑷ 求雙線性插值法的C語言程序!幫幫忙!拜託各位了!
ab
t
cd
就是兩次線性插值,先在x方向插出t上下方的_t1、_t2,然後再用它們插出t來
floattest(floatx,floaty)
{
float_t1,_t2,t;
_t1=a+(b-a)*(x-ax)/(bx-ax);
_t2=c+(d-c)*(x-cx)/(dx-cx);
t=_t1+(_t2-_t1)*(y-ay);
returnt;
}
⑸ 求C語言實現圖像縮放的程序,最好是雙線性插值的
directX 3d 和opengl都可實現,對紋理采樣進行設置.
directx3d 9的
IDirect3DDevice9::SetSamplerState
這個方法可實現這個功能.