从Nearest插值到Bilinear插值的分析与python实现

这篇主要是想分析一下Nearest差值和Bilinear差值的计算细节,然后附上对应的Python实现代码,希望对你有帮助:https://github.com/LonglongaaaGo/ComputerVision

效果

先给出实现效果。

首先我们有一张小狗狗:

从Nearest插值到Bilinear插值的分析与python实现_机器学习

然后用Nearest 上采样,能够得到:

从Nearest插值到Bilinear插值的分析与python实现_机器学习_02


可以看到,有很多的锯齿,看起来不是很完美。

然后试试这个实现的Bilinear 上采样:

从Nearest插值到Bilinear插值的分析与python实现_python_03


能够看到整体上柔和很多~虽然有点模糊,但是比Nearest好了很多。

正文

图像在计算机当中进行表示的话,是离散的,形式如下:

从Nearest插值到Bilinear插值的分析与python实现_计算机视觉_04


就是 从Nearest插值到Bilinear插值的分析与python实现_计算机视觉_05能够表示对应在图像中的坐标,而从Nearest插值到Bilinear插值的分析与python实现_插值_06看成对应的函数。从Nearest插值到Bilinear插值的分析与python实现_python_07表示的就是对应的像素信息。为了方便 讨论,就从1通道进行解释。

但是如果我们想做变换的话,如果直接用离散的点进行变换,肯定会丢失很多信息,所以我们就要考虑在连续的空间里进行变换。对应的,表现形式可以如下:

从Nearest插值到Bilinear插值的分析与python实现_缩放_08


如果我们将从Nearest插值到Bilinear插值的分析与python实现_计算机视觉_09的中心点作为坐标从Nearest插值到Bilinear插值的分析与python实现_缩放_10的话,那么对应的左对角的点就是从Nearest插值到Bilinear插值的分析与python实现_缩放_11。这种做法比较常见,也是比较推荐的一种形式。接下来就是要对图像进行缩放,缩放的公式就是:

从Nearest插值到Bilinear插值的分析与python实现_缩放_12

从Nearest插值到Bilinear插值的分析与python实现_机器学习_13

这里定义

从Nearest插值到Bilinear插值的分析与python实现_插值_14就是对应的原始图像的坐标

从Nearest插值到Bilinear插值的分析与python实现_计算机视觉_15就是对应的缩放后的图像的坐标

从Nearest插值到Bilinear插值的分析与python实现_机器学习_16就是原始图像的宽和高

从Nearest插值到Bilinear插值的分析与python实现_缩放_17就是缩放后的图像的宽和高通过上述公式和定义,我们可以很快地计算出缩放后的图片和原图之间的关系。根据上面公式得到各个点的位置之后,就需要将连续点转化成离散的点。而Nearest差值和Bilinear差值方法的区别,也主要在这一步:

Nearest 插值方法就比较简单,就是直接四舍五入将连续地点变成离散的整数。这样的做法存在的问题上面也看到了,就是会产生明显的锯齿。如果还不明白的话,看一眼代码会更加直观。形式如下图所示:

从Nearest插值到Bilinear插值的分析与python实现_python_18


就是说,假设灰色的点代表是插值的点,那么就是取其最近的颜色,作为插值后的颜色。所以在这里表示就是亮黄色。直接赋值。双线性插值 Bilinear Interpolation,直观理解如下图所示:

从Nearest插值到Bilinear插值的分析与python实现_机器学习_19


我们还是建立在上述情况,这个时候,灰色的点从Nearest插值到Bilinear插值的分析与python实现_缩放_20位于从Nearest插值到Bilinear插值的分析与python实现_缩放_21,不再是直接考虑最近的点,而是和其相近的四个点,然后通过面积的比重,来分配权重。所以公式可以表示成:

从Nearest插值到Bilinear插值的分析与python实现_缩放_22

对应的计算就可以这么写(请参照图上的坐标进行一一对应):

从Nearest插值到Bilinear插值的分析与python实现_插值_23这样就能直接得到当前点从Nearest插值到Bilinear插值的分析与python实现_机器学习_24的值。

注意,从Nearest插值到Bilinear插值的分析与python实现_机器学习_24表示的就是像素,以函数的形式来进行表示。从Nearest插值到Bilinear插值的分析与python实现_插值_26表示的就是总面积。

至此,Nearest差值和Bilinear差值讲解就结束了,可以看一下代码,更能够容易理解一点。

从Nearest插值到Bilinear插值的分析与python实现_python_27


如果觉得不错,记得关注哟!一起来学习深度学习,机器学习等前沿算法!!