C++ 双线性插值

双线性插值

原理:
那么对于浮点数的坐标(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 }
原文地址:https://www.cnblogs.com/ybqjymy/p/14249958.html