从Nearest插值到Bilinear插值的分析与python实现
这篇主要是想分析一下Nearest差值和Bilinear差值的计算细节,然后附上对应的Python实现代码,希望对你有帮助:https://github.com/LonglongaaaGo/ComputerVision
效果
先给出实现效果。
首先我们有一张小狗狗:
然后用Nearest 上采样,能够得到:
可以看到,有很多的锯齿,看起来不是很完美。
然后试试这个实现的Bilinear 上采样:
能够看到整体上柔和很多~虽然有点模糊,但是比Nearest好了很多。
正文
图像在计算机当中进行表示的话,是离散的,形式如下:
就是 能够表示对应在图像中的坐标,而看成对应的函数。表示的就是对应的像素信息。为了方便 讨论,就从1通道进行解释。
但是如果我们想做变换的话,如果直接用离散的点进行变换,肯定会丢失很多信息,所以我们就要考虑在连续的空间里进行变换。对应的,表现形式可以如下:
如果我们将的中心点作为坐标的话,那么对应的左对角的点就是。这种做法比较常见,也是比较推荐的一种形式。接下来就是要对图像进行缩放,缩放的公式就是:
这里定义
就是对应的原始图像的坐标
就是对应的缩放后的图像的坐标
就是原始图像的宽和高
就是缩放后的图像的宽和高通过上述公式和定义,我们可以很快地计算出缩放后的图片和原图之间的关系。根据上面公式得到各个点的位置之后,就需要将连续点转化成离散的点。而Nearest差值和Bilinear差值方法的区别,也主要在这一步:
Nearest 插值方法就比较简单,就是直接四舍五入将连续地点变成离散的整数。这样的做法存在的问题上面也看到了,就是会产生明显的锯齿。如果还不明白的话,看一眼代码会更加直观。形式如下图所示:
就是说,假设灰色的点代表是插值的点,那么就是取其最近的颜色,作为插值后的颜色。所以在这里表示就是亮黄色。直接赋值。双线性插值 Bilinear Interpolation,直观理解如下图所示:
我们还是建立在上述情况,这个时候,灰色的点位于,不再是直接考虑最近的点,而是和其相近的四个点,然后通过面积的比重,来分配权重。所以公式可以表示成:
对应的计算就可以这么写(请参照图上的坐标进行一一对应):
这样就能直接得到当前点的值。
注意,表示的就是像素,以函数的形式来进行表示。表示的就是总面积。
至此,Nearest差值和Bilinear差值讲解就结束了,可以看一下代码,更能够容易理解一点。
如果觉得不错,记得关注哟!一起来学习深度学习,机器学习等前沿算法!!