在做圖像處理的時候,我們經常需要對圖像大小進行變換。在深度學習中,也經常會用到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)