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)

在这里插入图片描述
在这里插入图片描述
代码

//双线性差值
int InterpBilinear(const QImage &image,double x,double y)
{
    int width = image.width();
    int height = image.height();

    //四个临近点的坐标 (x1,y1)、(x1,y2),(x2,y1),(x2,y2)
    int x1,x2;
    int y1,y2;

    //两个差值的中值
    double f12,f34;
    double	epsilon = 0.0001;

    //四个临近像素坐标x像素值
    double f1,f2,f3,f4;

    //计算四个临近坐标
    x1 = (int)x;
    x2 = x1 + 1;
    y1 = (int)y;
    y2 = y1+1;

    //不在图片的范围内
    if((x < 0) || (x > width - 1) || (y < 0) || (y > height - 1))
    {
        return -1;
    }else{
        if(fabs(x - width+1)<=epsilon) //如果计算点在右测边缘
        {
            //如果差值点在图像的最右下角
            if(fabs(y - height+1)<=epsilon)
            {
                f1 = qGray(image.pixel(x1,y1));
                return f1;
            }else {
                f1 = qGray(image.pixel(x1,y1));
                f3 = qGray(image.pixel(x1,y2));

                //图像右方的插值
                return ((int) (f1 + (y-y1)*(f3-f1)));
            }
        }
        //如果插入点在图像的下方
        else if(fabs(y - height+1)<=epsilon){
           f1 = qGray(image.pixel(x1,y1));
           f2 = qGray(image.pixel(x2,y1));

           //图像下方的插值
           return ((int) (f1 + (x-x1)*(f2-f1)));
        }
        else {
            //得计算四个临近点像素值
            f1 = qGray(image.pixel(x1,y1));
            f2 = qGray(image.pixel(x2,y1));
            f3 = qGray(image.pixel(x1,y2));
            f4 = qGray(image.pixel(x2,y2));

            //第一次插值
            f12 = f1 + (x-x1)*(f2-f1); //f(x,0)

            //第二次插值
            f34 = f3 + (x-x1)*(f4-f3); //f(x,1)

            //最终插值
            return ((int) (f12 + (y-y1)*(f34-f12)));
        }
    }

}
  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值