雙線性插值,又稱爲雙線性內插。在數學上,雙線性插值是有兩個變量的插值函數的線性插值擴展,其核心思想是在兩個方向分別進行一次線性插值。(摘自)
公式如見百度百科
由圖可以看出,放大的圖像之後,當出現x、y方向都放大一倍時,x、y位於x1、x2、y1、y2的中心點。
當放大倍數不爲1時,那麼就會出現即將繪製的像素偏向於哪個像素,因此需要求得這個像素的值就需要按比例對相鄰的像素進行計算。
由圖可以看出更偏向於x1,y1
首先求縮放倍率:
wscale =src.width/dst.width;
hscale = src.height/dst.height;
求源圖對應像素
sx = dx*wscale;
sy = dy*hscale;
獲得左一、上一像素:
X1= int(sx);
Y1= int(sy);
X2=X1 + 1
Y2= Y1 + 1
求權重:
weightx= sx – X1
weighty= sy – Y1;
求(x,y)點的像素值
tlx= (1-weightx)*F(X1,X1); //左上
trx= weightx*F(X2, Y1); //右上
blx= (1 – weightx)*F(X1, Y2); //左下
brx= weightx * F(X2,Y2); //右下
ty= (1 - weighty) * (tlx + trx);
by= weighty * (blx + brx);
F(X,Y)= ty + by;
僞代碼
bilinear(src, dst)
{
//求比例
wscale = src.width / dst.width;
hscale = src.height / dst.height;
for(dy = 0; dy < dst.height; dy++){
//得到源圖像Y方向最近的像素點
sy = dy * hscale;
Y1 = int(sy);
Y2 = Y1 + 1;
//求權重
weighty = sy - Y1;
for(dx = 0; dx < dst.width; dx++){
//得到源圖像X方向最近的像素點
sx = dx * wscale;
X1 = int(sx);
X2 = X1 + 1;
weightx = sx - X1;
//計算與最近像素的值
tlx = (1 - weightx) * src.data[X1 + Y1 * src.width];
trx = weightx * src.data[X2 + Y1 * src.width];
blx = (1 - weightx) * src.data[X1 + Y2 * src.width];
brx = weightx * src.data[X2 + Y2 * src.width];
ty = (1 - weighty) * (tlx + trx);
by = weighty * (blx + brx);
dst.data[dx + dy * dst.width]= ty + by;
}
}
}