在做图像处理的时候,我们经常需要对图像大小进行变换。在深度学习中,也经常会用到Upsample上采样。而最常用的插值方法就是BiLinear双线性插值。
image_new = cv2.resize(image,(750,600),interpolation=cv2.INTER_LINEAR)
m10 = nn.Upsample(scale_factor=2, mode='bilinear')
m11 = nn.UpsamplingBilinear2d(scale_factor=2)
那么双线性插值到底是怎么一回事呢?
以下图为例,我们需要将左图(线条交点为像素点,size:5x5)放大到右图(size:12x8)。
那么我们可以做下图所示的一个投影变换示意图。以颜色区分:红色为原图,蓝色为新图。
那么可以得到下图所示的示意图,红色为缩放后的原图,蓝色为要求得的新图。放到某一个局部就是一个双线性插值问题。
双线性插值动画示意图:
现在搬出下面这张双线性插值原理图,x-y坐标系、已知Q12,Q22,Q11,Q21四个点的值,求P点值。
首先在Q11Q21、Q12Q22方向上进行两次线性插值,得到R1、R2;然后在R1R2方向再做一次线性插值,得到P点。这就是双线性插值。
双线性插值关键的是P点在x,y两个方向上相对已知Q点的位置。
令:α = (x-x1) / (x2-x1) β = (y-y1) / (y2-y1) ,则 R1 = Q11 + (Q21 - Q11) * α = (1 - α)*Q11 + α*Q21,R2 = Q12 + (Q22 - Q12) * α = (1 - α)*Q12 + α*Q22;
P = (1 - β)*R1 + β*R2 = (1 - β)(1 - α)*Q11 + (1 - β)α*Q21 + β*(1 - α)*Q12 + α*β*Q22 = (1 - α)*( (1 - β)*Q11 + β*Q12 ) + α*( (1 - β)*Q21 + β*Q22)