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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM