Opencv学习笔记(七)图像尺寸改变及插值方法介绍

本文深入解析了OpenCV中resize()函数的使用方法及其背后的插值原理。从最近邻插值到双线性插值,再到双三次插值,详细阐述了每种插值方式的计算过程,帮助读者理解如何调整图像大小。

一、resize()函数介绍

resize()函数是专门用来调整图片的大小的,其原理就是通过不同的插值方式对图像进行处理,这些插值方式将在后续介绍到,首先介绍resize()函数的原型:

resize( InputArray src, OutputArray dst,Size dsize, double fx = 0, double fy = 0,int interpolation = INTER_LINEAR );

第一个参数为输入图像;
第二个参数为输出图像,通常情况下我们并不对其进行初始化,而是利用后续的dsize参数在程序中自动计算其尺寸;
第三个参数为输出图像希望的大小,如果它设置为0,将通过后续的fx,fy参数经由下述公式计算得来:

dsize=Size(round(fx*src.cols),round(fy*src.rows))

第四个参数为沿水平方向的缩放系数,有默认值0,取零的话则通过dsize参数经由下列公式计算得来:

fx=(double)dsize.width/src.cols

第五个参数为沿竖直方向的缩放系数,有默认值0,取零的话则通过dsize参数经由下列公式计算得来:

fy=(double)dsize.height/src.rows

第六个参数为插值类型的选择,可选方案有INTER_NEAREST 、INTER_LINEAR、INTER_CUBIC、INTER_AREA 、INTER_LANCZOS4。默认值INTER_LINEAR,一般也推荐选用INTER_LINEAR。后续将介绍这就这几种插值方法的原理。

二、插值方法介绍

(具体每个插值的实现方法可参见参考文献中其他博主的思路)

1.最近邻插值

最近邻插值的原理就是将放大或者缩小后的图片相应像素点直接乘以比例系数(应该为缩放系数的倒数)对应到原图中的相应像素点,如果存在小数的话则采用四舍五入或者直接舍去小数的方法。
假设resize后的图片某像素位置为 ( i ′ , j ′ ) (i',j') (i,j),分别乘以比例系数之后再分成整数部分和小数部分(i、j整数,u、v小数)为 ( i + u , j + v ) (i+u,j+v) (i+u,j+v),那如果采用四舍五入的方式,则按下图判断其对应原图像素值,落在A区取 ( i , j ) (i,j) (i,j),B区取 ( i + 1 , j ) (i+1,j) (i+1,j)
在这里插入图片描述
如果采用直接舍去的方式则不论u、v的值,直接对应原图 ( i , j ) (i,j) (i,j),这也是opencv中采用的最近邻插值方法。

2.双线性插值

双线性插值是使用映射回原图的像素点周围4个点来对待求像素点进行拟合,距离像素点越近的权重值越大。假设resize后的图片某像素位置为 ( i ′ , j ′ ) (i',j') (i,j),分别乘以比例系数之后再分成整数部分和小数部分(i、j整数,u、v小数)为 ( i + u , j + v ) (i+u,j+v) (i+u,j+v),那么实际拟合出的该像素值应该满足如下关系:
f ′ ( i ′ , j ′ ) = ( 1 − u ) ( 1 − v ) f ( i , j ) + u ( 1 − v ) f ( i + 1 , j ) + ( 1 − u ) v f ( i , j + 1 ) + u v f ( i + 1 , j + 1 ) ; f'(i',j')=(1-u)(1-v)f(i,j)+u(1-v)f(i+1,j)+(1-u)vf(i,j+1)+uvf(i+1,j+1); f(i,j)=(1u)(1v)f(i,j)+u(1v)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值