在图像几何变换时,无法给有些像素点直接赋值,例如,将图像放大两倍,必然会多出一些无法被直接映射的像素点,对于这些像素点,通过插值决定它们的值。于是,产生了图像插值算法。
图像插值算法分类
主要可以分为两类,一类是线性图像插值方法,另一类是非线性图像插值方法,如上图所示。
传统的插值方法如最近邻插值,双线性插值以及双三次插值等都属于线性插值方法。这类插值方法在图像插值过程中采用同一种插值内核,不用考虑待插像素点所处的位置,这种做法会使图像中的边缘变得模糊不清,达不到高清图像的视觉效果。
非线性插值方法主要包括:基于小波系数的方法基于边缘信息的方法。其中,基于边缘信息的方法又可分为隐式方法和显式方法两种。隐式方法包含边缘导向插值(New edge directive interpolation,NEDI),最小均方误差估计插值(Linear minimum mean square-error estimation,LMMSE)、软判决自适应插值(Soft-decision adaptive interpolation interpolation,SAI),提出的边缘对比度引导的图像插值(Contrast-guideed image interpolation,CGI)等都是隐式的基于图像边缘的插值方法。
最新发展的话有基于决策树,深度学习,字典学习的图像插值算法。
线性插值算法
线性插值算法常用有五种,在OpenCV中设置可以通过相关参数很方便地进行设置。
线性插值:使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值。线性插值形式:
如下图所示:
线性插值多项式:
其实,即使x不在x0到x1之间,这个公式也是成立的。在这种情况下,这种方法叫作线性外插。
线性插值的误差:线性插值其实就是拉格朗日插值有2个结点时的情况。插值余项为:
从插值余项可以看出,随着二阶导数的增大,线性插值的误差增大。即函数的曲率越大,线性插值近似的误差也越大。
举个例子。下图中,左边为原图像,拉伸后,理想的输出图像的像素分布应该为绿色箭头指向的,但是按照线性插值,会得到红色箭头指向的结果。
一、最近邻插值算法 INTER_NEAREST
在一维空间中,最近点插值就相当于四舍五入取整。在二维图像中,像素点的坐标都是整数,该方法就是选取离目标点最近的点。会在一定程度上损失空间对称性(Alignment),在RoI Pooling中使用。
具体来说,将目标图像中的点,对应到原图像中后,找到最相邻的整数坐标点的像素值,作为该点的像素值输出。
如上图所示双三次插值,目标图像中的某点投影到原图像中的位置为点P,与P距离最近的点为Q11,此时易知,f(P)=f(Q11)。
如果距离四个点都相等(中心处)要如何处理?
由最邻近插值法,放大后的图像有很严重的马赛克,会出现明显的块状效应;缩小后的图像有很严重的失真。
这是一种最基本、最简单的图像缩放方式。变换后的每个像素点的像素值,只由原图像中的一个像素点确定。例如上面,点(0,0.75)的像素只由(0,1)确定,这样的效果显然不好。点(0,0.75)的像素不止和(0,1)有关,和(0,0)也有关,只是(0,1)的影响更大。如果可以用附近的几个像素点按权重分配,共同确定目标图像某点的像素,效果会更好。下面的双线性插值就解决了这个问题。
二、双线性插值算法(默认) INTER_LINEAR
双线性插值形式:
双线性插值是线性插值在二维时的推广,在两个方向上共做了三次线性插值。定义了一个双曲抛物面与四个已知点拟合。
具体操作为在X方向上进行两次线性插值计算,然后在Y方向上进行一次插值计算。如下图所示:
首先,f(x,y)为二元函数,假设我们知道f(x0,y0),f(x1,y1),f(x0,y1),f(x1,y0)四个点的值。这四个点确定一个矩形,我们希望通过插值得到矩形内任意点的函数值。
先在x方向上进行两次线性插值,得到:
再在y方向上进行一次线性插值,得到:
综合起来双三次插值,就是双线性插值的结果:
如果选择一个坐标系统,使f(x)已知的四个点的坐标分别为(0,0),(0,1),(1,0),(1,1),那么确定一个单位正方形,四个点分别为正方形的四个顶点:
原图像和目标图像的几何中心对齐
在计算目标图像中,对应原图像的虚拟坐标点时,一般的变换是:
这种变换下,原图像的有些点没有参与计算。举个例子,把9∗9的原图像缩小成3∗3,原图像的原点(0,0)和目标图像的原点(0,0)都为左上角,目标图像右上角的坐标为(0,2),对应原图像的坐标为(0∗(9/3),2∗(9/3))=(0,6)。目标图像右边已经没有点了,(0,6)右边的像素点也就用不到了。
原图像和目标图像的像素之间的对应关系如下:
从图片可以看出,只有圈出来的红色部分参与运算了。目标图像的每个像素点的灰度值相对于原图像偏左上方,右下角的元素实际上没有参与运算。
为了让原图像和目标图像的中心对齐,我们规定另外一种变换方式:
就是在原来的变换后面加了调节因子:
0.5(src_width/dst_width−1)
这种变换下,目标图像的中心点(1,1),对应了原图像的中心点(4,4),两个图像的几何中心重合,能充分利用原图像的点,并且目标图像的每个像素点之间都是等间隔的,也都和两边有一定的边距。实际上,在openCv中也是这种变换方式。
cv.resize()的计算过程
对于缩小图像,目标图像中每个点都能找到原图像中包围它的四个临近点,每个点都进行双线性插值即可。
对于放大图像,边界附近的点经过坐标变换可能超出了原图像的范围。举个例子,把3∗3的原图像放大成4∗4。
中间的点都能在原图像中找到包围它的四个临近点,做双线性插值即可。
例如,目标图像中的点(1,3),对应原图像的点为(0.625,2.125),原图像的纵坐标最大为2,找不到包围(0.625,2.125)四个点,所以用它最邻近的两个点(0,2)和(1,2)做线性插值(外插),得到目标图像中(1,3)的像素值。
例如,目标图像右上角的顶点(0,3),对于原图像的点为(0,2.125),直接用原图像右上角的顶点(0,2)作为它的值即可。
计算过程:
用h(x,y)表示目标图像,f(x,y)表示原图像
三、三次样条插值算法INTER_CUBIC
给定n+1个点,a=x_0三次多项式:
每个三次多项式中有四个未知参数,有n个区间,n个多项式,共4n个未知参数。我们知道“n个未知数需要n个已知条件确定唯一解”,所以要确定这4n个未知参数,共需要4n个已知条件。
限时特惠:本站每日持续更新海量展厅资源,一年会员只需29.9元,全站资源免费下载
站长微信:zhanting688