计算机视觉(五)双三次插值(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

https://www.jianshu.com/p/8118e708b766

opencv和matlab的bicubic算法有什么区别?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章