1.什么是插值
2.常用的插值算法
3.最近邻法(NearestInterpolation)
4.单线性插值
5.双线性插值
6.双线性插值的优化
7.代码
1.什么是插值Interpolationisamethodofconstructingnewdatapointswithintherangeofadiscretesetofknowndatapoints.Imageinterpolationreferstothe“guess”ofintensityvaluesatmissinglocations.图片放大是图像处理中的一个特别基础的操作。在几乎每一个图片相关的项目中,从传统图像处理到深度学习,都有应用。生活里,和朋友通过微信传张图片,从图片发出,到朋友收到图片,查看图片,都会数次的的改变图像的尺寸,从而用到这个算法。但是大家只是在用这个算法,很少关注这个算法的实现细节:插值算法是如何工作的。简单来说,插值指利用已知的点来“猜”未知的点,图像领域插值常用在修改图像尺寸的过程,由旧的图像矩阵中的点计算新图像矩阵中的点并插入,不同的计算过程就是不同的插值算法。下图是自己实现双线性插值的效果
2.常用的插值算法插值算法有很多种,这里列出关联比较密切的三种:最近邻法(NearestInterpolation):计算速度最快,但是效果最差。双线性插值(BilinearInterpolation):双线性插值是用原图像中4(2*2)个点计算新图像中1个点,效果略逊于双三次插值,速度比双三次插值快,属于一种平衡美,在很多框架中属于默认算法。双三次插值(Bicubicinterpolation):双三次插值是用原图像中16(4*4)个点计算新图像中1个点,效果比较好,但是计算代价过大。
3.最近邻法(NearestInterpolation)双线性插值法由原图中4个点计算新图中的1个点,在介绍计算过程前,需要先了解如何找到这4个点,双线性插值法找寻4个点的方式和最近邻法相似,这里顺带的了解下最近邻法的计算流程。
最近邻法实际上是不需要计算新图像矩阵中点的数值的,直接找到原图像中对应的点,将数值赋值给新图像矩阵中的点,根据对应关系找到原图像中的对应的坐标,这个坐标可能不是整数,这时候找最近的点进行插值。对应关系如下:
3.1总结上图效果是最近邻法的计算过程示意图,由上图可见,最近邻法不需要计算只需要寻找原图中对应的点,所以最近邻法速度最快,但是会破坏原图像中像素的渐变关系,原图像中的像素点的值是渐变的,但是在新图像中局部破坏了这种渐变关系。
3.2双线性插值对应关系双线性插值的对应公式和前面的最近邻法一样,不一样的是根据对应关系不再是找最近的1个点,而是找最近的4个点,如下图所示。
这里可能还会有点小疑问,如果根据对应关系找到原图中的点不是在不同的点之间,而是跟原图像中的点重合,那该如何找4个点?关于这个问题要看一下双线性插值的计算公式,双线性插值实际上是从2个方向一共进行了3次单线性插值,咱们先了解单线性插值的计算方式。
4.单线性插值已知中P1点和P2点,坐标分别为(x1,y1)、(x2,y2),要计算[x1,x2]区间内某一位置x在直线上的y值
这里没有写成经典的AX B的形式,因为这种形式从权重的角度更好理解。首先看分子,分子可以看成x与x1和x2的距离作为权重,这也是很好理解的,P点与P1、P2点符合线性变化关系,所以P离P1近就更接近P1,反之则更接近P2。
现在再把公式中的分式看成一个整体,原式可以理解成y1与y2是加权系数,如何理解这个加权,要返回来思考一下,咱们先要明确一下根本的目的:咱们现在不是在求一个公式,而是在图像中根据2个点的像素值求未知点的像素值。这样一个公式是不满足咱们写代码的要求的。现在根据实际的目的理解,就很好理解这个加权了,y1与y2分别代表原图像中的像素值,上面的公式可以写成如下形式:
5.双线性插值已知Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2),求其中点P(x,y)的值。
前面介绍过双线性插值是分别在两个方向计算了共3次单线性插值,如图所示,先在x方向求2次单线性插值,获得R1(x,y1)、R2(x,y2)两个临时点,再在y方向计算1次单线性插值得出P(x,y)(实际上调换2次轴的方向先y后x也是一样的结果)。1.x方向单线性插值直接带入前一步单线性插值最后的公式
这种权重的表达式也不难理解,观察一下可以发现每个点的权重都和待求点和对角点的距离有关,比如
5.1遗留问题上面遗留了个小问题,就是当对应关系公式带入后跟原图像中的点发生重合后怎么选取剩下3个点,根据上面的公式可以发现,无论我们怎么选取,其实其余3点的权重都至少1项为
0,所以不论我们怎么取剩下的3个点,对最终的结果都不会产生影响。
5.2总结到此双线性插值的计算已经完成了,但是我们现在只能说是勉强的完成双线性插值算法,为什么这么说,现在的计算方式有比较大的问题,看下面的内容。
根据坐标系的不同,产生的结果不同这张图是左上角为坐标系原点的情况,我们可以发现最左边x=0的点都会有概率直接复制到目标图像中(至少原点肯定是这样),而且就算不不和原图像中的点重合,也相当于进行了1次单线性插值(仔细想想为什么,带入到权重公式中会发现结果)
现在这张图是右上角为坐标系原点的情况,我们可以发现最右面的点都会有概率直接复制到目标图像中(至少原点肯定是这样),而且就算不不和原图像中的点重合,也相当于进行了1次单线性插值。这样如果我们采用不用的坐标系产生的结果是不一样的,而且无论我们采用什么坐标系,最左侧和最右侧(最上侧和最下侧)的点是不“公平的”,这是第一个问题。
整体的图像相对位置会发生变化看下面这张图,左侧是原图像(33),右侧是目标图像(55),原图像的几何中心点是(1,1),目标图像的几何中心点是(2,2),根据对应关系,目标图像的几何中心点对应的原图像的位置是(1.2,1.2),如图所示,那么问题来了,目标图像的原点(0,0)点和原始图像的原点是重合的,但是目标图像的几何中心点相对于原始图像的几何中心点偏右下,那么整体图像的位置会发生偏移,为什么这样说,其实图像是由1个个的像素点组成,单纯说1个像素点是没有太大的意义的,1个像素点跟相邻像素点的值的渐变或者突变形成图像颜色的渐变或者边界,所以参与计算的点相对都往右下偏移会产生相对的位置信息损失。这是第二个问题。
6.1计算机视觉中的蝴蝶效应其实对于咱们人眼,上面的2个问题都不会产生太大的结果,但是对于现在的基于学习的学习类算法,计算机通过卷积神经网络提取图像中的深层信息,在这个过程中,我们人眼难以发现的变化也许会发生想象之外的变化,所以不要小看这两个问题
再带入到上面的情况,可以发现问题解决了,到此,才算完成完整的双线性插值法,当然如果这样计算发现结果跟OpenCV的结果不一样,是因为OpenCV还进行了很多速度上的优化,比如用整形计算代替浮点数计算。
7.代码网上代码很多,其实看完上面的内容自己写一个双线性插值十分的简单,这里就不弄代码了。
现面向所有技术发烧友,征集优秀原创技术文章,后厂反应堆为你提供展示平台。期待你的精彩分享哦!(可添加微信投稿)
opencv中的双线性插值是不是这么算的我不知道,但是Pytorch中interpolate这个接口中的双线性插值无论是align_corners=True还是False都不是这么算的
5.双线性插值,“将第一步结果带入第二步”下面的公式,图都没截完。f(R2)里面有f(Q22),合并之后f(Q22)项整体消失了。。。。。。然后下面又冒出来了
卷积神经网络经常要对图像进行上采样。假设现在要将3×6的图象转变为6×12的图象。双线性插值传统实现方法为:上图中,y_{m,n}=(1-a)(1-b)x_{i,j} a(1-b)x_{i 1,j} (1-a)bx_{i,j 1} abx_{…
鉴于视频超分问题中的DNN经常用到双三次插值,而本人不知其所以然,因此从线性插值开始做一个全面的梳理。
1.线性插值线性插值的本质就是初中数学学到的直线方程,已知直线上两点,以直线方…