双线性插值
原理:
那么对于浮点数的坐标(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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/207075
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!