计算机视觉(五)双三次插值(Bicubic Interpolation)算法介绍及opencv和matlab的代码实现及区别
超分辨率基础_插值算法简介
1.插值算法
数学的数值分析领域中,内插或称插值(英语:interpolation)是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法。常见的三种插值算法为最近邻插值、双线性插值和双三次插值。
一组离散数据点在一个外延的插值。曲线中实际已知数据点是红色的;连接它们的蓝色曲线即为插值。
2.最近邻插值算法
最邻插值算法(Nearest Neighbor interpolation)是最简单的一种插值算法,当图片放大时,缺少的像素通过直接使用与之最近原有像素生成,原理就是选取距离插入的像素点(x+u, y+v)【注:x,y为整数, u,v为小数】最近的一个像素点,用它的像素点的灰度值代替插入的像素点。
i+u, j+v为待求像素坐标,如果 i+u, j+v落在A区,即 u<0.5,v<0.5,则将左上角像素的灰度值赋给待求像素,同理落在B区则赋予右上角的像素灰度值,落在C区则赋予左下角像素的灰度值,落在D区则赋予右下角像素的灰度值。
最近邻插值法计算量较小,但可能会造成生的图像灰度上的不连续,在变化地方可能出现明显锯齿状。
3.双线性插值算法
在数学上,双线性插值是有两个变量的插值函数的线形插值扩展,其核心思想是在两个方向分别进行一次线性插值。
以上是一维的,接下来看看二维中的双线性插值
首先在x方向上面线性插值,得到R2、R1
然后以R2,R1在y方向上面再次线性插值
如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为
用矩阵表示
双线性内插法的计算比最邻近点法复杂,计算量较大但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。
4.双三次插值算法(bicubic interpolation)
在数值分析这个数学分支中,双三次插值(英语:Bicubic interpolation)是二维空间中最常用的插值方法。在这种方法中,函数 f 在点 (x, y) 的值可以通过矩形网格中最近的十六个采样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个
双三次插值计算公式
即
那么这个a(i, j)便是介绍里面所说的加权系数了,所以关键是要把它求解出来。
求解加权系数的公式如下
相关论文
有适当的边界条件(boundary condition)和约束插值内核(constrains on the interpolation kernel)的时候,立方卷积是更好方式,并给出了这个式子:
当a=-0.5时比较合适
keys说rifman和bernstein给了他用这个模型的勇气,
bernstein说是riffman提出用sinx/x近似,啊哈就算这是源头吧。。但是还差个pi
keys又说hou那他得到了启发,嗯,搜了一下果然。。难道说这个欧米茄就是pi?
额,它不是。那大概认为大家都觉得乘上pi比较合适吧。
效果是这样的。
双三次曲线插值方法计算量较大,但后的图像效果最好。
5.代码实现
opencv
import cv2 as cv
img = cv.imread('automobile.png')
# 放大图像,双三次插值
enlarge = cv.resize(img, (0, 0), fx=4, fy=4, interpolation=cv.INTER_CUBIC)
cv.imshow("Image", enlarge)
cv.waitKey (0)
cv.destroyAllWindows()
matlab
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('yosemeti.jpg',0)
plt.imshow(img,cmap='gray', interpolation='bicubic')
plt.show()
6.区别
opencv和matlab的bicubic算法有什么区别?
来自Matlab的文档:
'bicubic':双立方插值(默认值);输出像素值是最近的4乘4邻域中像素的加权平均值。
来自OpenCV的文档:
INTER_CUBIC - 4x4像素邻域的双三次插值。
所以对此的唯一解释是他们使用不同的加权策略来获得平均值。
来自Matlab imresize.m source,您可以找到内核常量A (请参阅维基百科上的双立方插值)设置为 -0.5 ,而在OpenCV中设置为 -0.75 (请参阅imgproc/src/imgwarp.cpp,函数interpolateCubic()在github上)。这为卷积提供了不同的内核形状,因此最终插值图像的结果会略有不同。
参考
https://blog.csdn.net/nandina179/article/details/85330552