雙線性插值
原理:
那么對於浮點數的坐標(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)
代碼:
1 //雙線性差值
2 int InterpBilinear(const QImage &image,double x,double y) 3 { 4 int width = image.width(); 5 int height = image.height(); 6
7 //四個臨近點的坐標 (x1,y1)、(x1,y2),(x2,y1),(x2,y2)
8 int x1,x2; 9 int y1,y2; 10
11 //兩個差值的中值
12 double f12,f34; 13 double epsilon = 0.0001; 14
15 //四個臨近像素坐標x像素值
16 double f1,f2,f3,f4; 17
18 //計算四個臨近坐標
19 x1 = (int)x; 20 x2 = x1 + 1; 21 y1 = (int)y; 22 y2 = y1+1; 23
24 //不在圖片的范圍內
25 if((x < 0) || (x > width - 1) || (y < 0) || (y > height - 1)) 26 { 27 return -1; 28 }else{ 29 if(fabs(x - width+1)<=epsilon) //如果計算點在右測邊緣
30 { 31 //如果差值點在圖像的最右下角
32 if(fabs(y - height+1)<=epsilon) 33 { 34 f1 = qGray(image.pixel(x1,y1)); 35 return f1; 36 }else { 37 f1 = qGray(image.pixel(x1,y1)); 38 f3 = qGray(image.pixel(x1,y2)); 39
40 //圖像右方的插值
41 return ((int) (f1 + (y-y1)*(f3-f1))); 42 } 43 } 44 //如果插入點在圖像的下方
45 else if(fabs(y - height+1)<=epsilon){ 46 f1 = qGray(image.pixel(x1,y1)); 47 f2 = qGray(image.pixel(x2,y1)); 48
49 //圖像下方的插值
50 return ((int) (f1 + (x-x1)*(f2-f1))); 51 } 52 else { 53 //得計算四個臨近點像素值
54 f1 = qGray(image.pixel(x1,y1)); 55 f2 = qGray(image.pixel(x2,y1)); 56 f3 = qGray(image.pixel(x1,y2)); 57 f4 = qGray(image.pixel(x2,y2)); 58
59 //第一次插值
60 f12 = f1 + (x-x1)*(f2-f1); //f(x,0) 61
62 //第二次插值
63 f34 = f3 + (x-x1)*(f4-f3); //f(x,1) 64
65 //最終插值
66 return ((int) (f12 + (y-y1)*(f34-f12))); 67 } 68 } 69 }