一.插值方法
當我們對圖像進行縮放或旋轉等操作時,需要在新的像素位置上計算出對應的像素值。
而插值算法的作用就是根據已知的像素值來推測未知位置的像素值。
1.1 最近鄰插值
CV2.INTER_NEAREST
其為?warpAffine()?函數的參數?flags?的其一,表示最近鄰插值。
????????這個方法是根據原圖與目標圖的坐標關系來做填充,目標圖中一點的坐標經過公式找到原圖坐標然后找到像素點,然后填充進目標圖中,也就是填充最近的像素。下面是公式:
- dstX:目標圖像中某點的x坐標,
- dstY:目標圖像中某點的y坐標,
- srcWidth:原圖的寬度,
- dstWidth:目標圖像的寬度;
- srcHeight:原圖的高度,
- dstHeight:目標圖像的高度。
- 而srcX和srcY:目標圖像中的某點對應的原圖中的點的x和y的坐標。
如果計算出的是小數,則向下取整(防止取不到點)
1.2 雙線性插值
CV2.INTER_LINEAR
????????原始圖像的某些像素坐標可能不再是新圖像中的整數位置,這時就需要使用其他插值算法來確定這些非整數坐標的像素值。我們依然需要把目標圖像的點映射到原圖像上,公式不變。
先來看看單線性插值:
????????可見,單位像素值就是?(P2-P1)/(x2-x1)?,其中通過兩點與目標點的關系給出表達式,簡化后得到單線性插值的像素值公式。我們也容易理解,k2?的值是更大的,說明?P2?與?P?關系更近。
而雙線性插值就是做兩次,分別在水平方向和垂直方向上做線性插值:
- 水平方向:根據 x?與 x0?和 x1?的關系計算出 P00?和 P10?、 P01?和 P11?之間的插值結果。
- 垂直方向:將第一步的結果與 y?與 y0?和 y1?的關系結合,再在垂直方向上做一次線性插值。
1.3 像素區域插值
cv2.INTER_AREA
????????使用像素區域插值方法進行縮小圖像時,它就會變成一個均值濾波器(就是一個卷積核),其工作原理可以理解為對一個區域內的像素值取平均值。目標圖像的每個像素點,其值等于卷積核中所有像素值的均值。(依然需要目標圖像與原圖像的坐標對應公式。)
卷積核先往右邊走,計算完一個值就移動一格,到邊緣就換到下一行開始依次進行。
1.4 雙三次插值
cv2.INTER_CUBIC
雙三次插值法需要原圖像中近鄰的**16**個點來加權,也就是4x4的網格。
????????還是需要公式得出一點在原圖像中的坐標,找到離它最近的16個像素點。此時坐標有小數,則把整數部分與小數部分分離為(x+u,y+v)。取整數部分(x,y),這個時候就肯定會是16個像素點的其中之一,將其作為坐標原點(是的你沒有聽錯),然后再分別計算其他15個像素點的坐標。
????????再來到重點,把這15個像素點的橫縱坐標都取出來,然后分別與取出來的小數部分u或v做差,再取絕對值,這就是每個像素點在一個方向上與原點的距離dw或dh。隨后再根據公式計算得出權重,再把像素值乘以對應權重,最后把所有乘積相加,就是插值后的像素值。
公式:
1.5 Lanczos插值
????????與雙三次插值的思想是一樣的,不同的就是其需要的原圖像周圍的像素點的范圍變成了8*8,并且不再使用BiCubic函數來計算權重,而是換了一個公式計算權重。
其中a通常取2或者3,當a=2時,該算法適用于圖像縮小。a=3時,該算法適用于圖像放大。