算法原理简介

双线性插值是一阶插值,常用于图像的旋转、缩放处理。

它利用原图中对应的四个点的像素值来确定目标图像中的像素值。

为了便于理解,我们来看两张尺寸不一样的图片:

原图

变换图

假设原图图片的宽度为yw,高度为xh

变换图的宽度为jw,高度为ih

于是对于变换图中任意一个像素点(j’, i’)我们可以用以下的方法映射到原图中去:

y' = yw/jw * j'
x' = xh/ih * i'

通常情况下,y’和x’不为整数。

例如,原图尺寸:

yw = 1000
xh = 800

变换图尺寸:

jw = 700
ih = 700

对于变换图中的(400, 400)像素点:

y' = 1000/700 * 400 = 571.42857
x' = 800/700 * 400 = 457.14286

我们将变换图中的(400, 400)像素点映射到原图中的(571.42857, 457.14286)。

于是我们就用原图中对应的4点(571,457),(572,457),(571,458),(572,458)来确定变换图像中的(400,400)点像素值。

t = 571.42857 - 571 = 0.42857
u = 457.14286 - 457 = 0.14286

我们认为距离(y’, x’)点距离越近,其对目标像素影响的权重应该越大,距离越远,影响权重越小。

(571,457)点权重为s4面积,(572,457)点权重为s3面积,(571,458)点权重为s2面积,(572,458)点权重为s1面积。

于是我们得到:

(400,400)目标图 = (571,457)xs4 + (572,457)xs3 + (571,458)xs2 + (572,458)xs1

其中,s1+s2+s3+s4 = 1

以上就是双线性插值法目标像素计算公式。

算法的c代码实现

/** param: * Mat src 原始图片* Mat dst 目标图片*/
void BGRBilinearScale(const Mat src, Mat dst) {double dstH = dst.rows;  //目标图片高度double dstW = dst.cols;  //目标图片宽度double srcW = src.cols;  //原始图片宽度,如果用int可能会导致(srcH - 1)/(dstH - 1)恒为零double srcH = src.rows;  //原始图片高度double xm = 0;      //映射的xdouble ym = 0;      //映射的yint xi = 0;         //映射x整数部分int yi = 0;         //映射y整数部分int xl = 0;         //xi + 1int yl = 0;         //yi + 1double xs = 0;   double ys = 0;/* 为目标图片每个像素点赋值 */for(int i = 0; i < dstH; i ++) {for(int j = 0; j < dstW; j ++) {//求出目标图像(i,j)点到原图像中的映射坐标(mapx,mapy)xm = (srcH - 1)/(dstH - 1) * i;ym = (srcW - 1)/(dstW - 1) * j;/* 取映射到原图的xm的整数部分 */xi = (int)xm;yi = (int)ym;/* 取偏移量 */xs = xm - xi;ys = ym - yi;xl = xi + 1;yl = yi + 1;//边缘点if((xi+1) > (srcH-1)) xl = xi-1;if((yi+1) > (srcW-1)) yl = yi-1;//bdst.at<Vec3b>(i,j)[0] = (int)(src.at<Vec3b>(xi,yi)[0]*(1-xs)*(1-ys) + src.at<Vec3b>(xi,yl)[0]*(1-xs)*ys +src.at<Vec3b>(xl,yi)[0]*xs*(1-ys) +src.at<Vec3b>(xl,yl)[0]*xs*ys);//gdst.at<Vec3b>(i,j)[1] = (int)(src.at<Vec3b>(xi,yi)[1]*(1-xs)*(1-ys) + src.at<Vec3b>(xi,yl)[1]*(1-xs)*ys +src.at<Vec3b>(xl,yi)[1]*xs*(1-ys) +src.at<Vec3b>(xl,yl)[1]*xs*ys);//rdst.at<Vec3b>(i,j)[2] = (int)(src.at<Vec3b>(xi,yi)[2]*(1-xs)*(1-ys) + src.at<Vec3b>(xi,yl)[2]*(1-xs)*ys +src.at<Vec3b>(xl,yi)[2]*xs*(1-ys) +src.at<Vec3b>(xl,yl)[2]*xs*ys);}}
}

放缩效果预览

原图为1024 x 640图片,变换目标图片为800 x 800图片

双线性插值法图像放缩示例相关推荐

  1. Opencv下双线性插值法进行图像放缩

    关于图像放缩的算法有很多,本文主要介绍双线性插值法进行图像放缩,本文参考了: http://www.cnblogs.com/funny-world/p/3162003.html 我们设源图像src的大 ...

  2. “双线性插值法”实现图像的缩放

    本学期修读"数学实验"相关课程,课程设计以"双线性插值法实现图像缩放"为研究方向,写篇博文记录一下自己的心路历程– 文章目录 前言 一.图像基础知识 二.双线性 ...

  3. 【图像处理】双线性插值法扩展图像像素及其代码实现(亚像素)

    亚像素图像 大家有没有你想过,在软件层面,如何提高图像处理的精度?比如,我们要用图像处理测量工业零件的周长,怎么在不改变硬件条件的情况下尽可能得到更高的精度? 我们平时看到的图像都是由像素点组成的,不 ...

  4. bmp 双线性插值_基于双线性插值算法的图像放缩技术与实现_冯慧君

    九江 332000) 2 ( 闽发证券有限责任公司 上海 200031) 3 ( 华为技术有限公司 上海 200121) 摘 要 本文介绍了双线性插值算法在图像放缩领域的应用和具体实现的方法 , 并通 ...

  5. python双线性插值函数_双线性插值法原理 python实现

    码字不易,如果此文对你有所帮助,请帮忙点赞,感谢! 一. 双线性插值法原理: ① 何为线性插值? 插值就是在两个数之间插入一个数,线性插值原理图如下: 在位置 x 进行线性插值,插入的值为f(x) ↑ ...

  6. 图像插值(最近邻插值法 和 双线性插值法)

    所谓近朱者赤近墨者黑,无论什么插值方法根本思想都是一样的. 先讲一下最近邻插值法,就是找到未知像素点相邻的4个已知像素点,然后判断哪一个像素离着未知像素点近,就让那个点同化未知像素点,赋予未知点同样的 ...

  7. 学无疑物-上采样之双线性插值法详解

    什么是插值 Interpolation is a method of constructing new data points within the range of a discrete set o ...

  8. 双线性插值法(Bilinear Interpolation)

    1.单线性插值 先讲一下单线性插值:已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值.因为直线上的函数值是线性变化的,我们只需通过计算x0 ...

  9. 上采样之双线性插值法

    上采样之双线性插值法 One:上采样的定义 上采样的类型: 一.双线性插值: 二.转置卷积 : 三.上采样(unsampling) 四.上池化(unpooling) 总结: tow:具体的讲解双线性插 ...

最新文章

  1. 自然科学期刊能发表计算机论文吗,自然科学专业论文好发表吗?
  2. 一些改进模型速度/精度的工程方法
  3. 011_JavaScript数据类型
  4. python requests post提交数据报错
  5. Acwing 1083. Windy数
  6. 在网页中嵌入任意字体(特殊字体/自定义字体)的解决方案
  7. tenda无线网卡Linux驱动,Ubuntu 10.04上腾达W541U V2.0 无线网卡驱动的使用
  8. matlab程序阻尼牛顿法,matlab阻尼牛顿法
  9. Allegro导出dxf
  10. Awesome Crowd Counting
  11. 【风马一族_php】常用的语句
  12. 双软认证企业税收优惠政策
  13. C# 模拟POST上传图片
  14. SAP那些事-理论篇-14-SAP中的财务管理理念
  15. 忍者X3插件App计划,缔造属于自己的Web营销App
  16. MySQL从删库到跑路(9):group by——给漂亮小姐姐分个组
  17. js如何转换json字符串,js如何转换为数值型
  18. Rust - 过程宏
  19. IDEA中导入项目运行失败提示Illeagle Arguement,访问404解决方法(Idea的Modules设置)
  20. Android实现app启动页面设计

热门文章

  1. uni-app项目配置UrlSchemes在外部打开APP
  2. css3中3D变换的景深和灭点
  3. java中的消息提示框
  4. oracle Net manger配置网络服务
  5. javafx 教程_用JavaFX编写图块引擎
  6. 最终幻想7php攻略,最终幻想7图文攻略 PS版FF7全剧情任务攻略(CD1)(6)
  7. Linux——man命令
  8. 有助于理解分辨率、帧率、压缩率、码率和视频大小的关系式
  9. 小米Recovery线刷精灵 v1.0.0 破解版
  10. 三维数据可视化软件html5,基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型 | 3D组态|图扑软件|数据可视化|blog...