圖像縮放算法(2雙線性差值算法)




雙線性插值,又稱爲雙線性內插。在數學上,雙線性插值是有兩個變量的插值函數的線性插值擴展,其核心思想是在兩個方向分別進行一次線性插值。(摘自)

公式如見百度百科

由圖可以看出,放大的圖像之後,當出現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;
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章