先講一下線性插值:已知資料 (x0, y0) 與 (x1, y1),要計算 [x0, x1] 區間內某一位置 x 在直線上的y值(反過來也是一樣,略):
y−y0x−x0=y1−y0x1−x0」 role=」presentation」>y−y
0x−x
0=y1
−y0x
1−x0
y−y0x−x0=y1−y0x1−x0
\begin \frac = \frac
y=x1−xx1−x0y0+x−x0x1−x0y1」 role=」presentation」>y=x
1−xx
1−x0
y0+x
−x0x
1−x0
y1y=x1−xx1−x0y0+x−x0x1−x0y1
\begin y = \fracy_0 +\fracy_1
上面比較好理解吧,仔細看就是用x和x0,x1的距離作為乙個權重,用於y0和y1的加權。雙線性插值本質上就是在兩個方向上做線性插值。
在數學上,雙線性插值是有兩個變數的插值函式的線性插值擴充套件,其核心思想是在兩個方向分別進行一次線性插值[1]。見下圖:
假如我們想得到未知函式 f 在點 p = (x, y) 的值,假設我們已知函式 f 在 q11 = (x1, y1)、q12 = (x1, y2), q21 = (x2, y1) 以及 q22 = (x2, y2) 四個點的值。最常見的情況,f就是乙個畫素點的畫素值。首先在 x 方向進行線性插值,得到
然後在 y 方向進行線性插值,得到
綜合起來就是雙線性插值最後的結果:
由於影象雙線性插值只會用相鄰的4個點,因此上述公式的分母都是1。opencv中的原始碼如下,用了一些優化手段,比如用整數計算代替float(下面**中的*2048就是變11位小數為整數,最後有兩個連乘,因此》22位),以及源影象和目標影象幾何中心的對齊
srcx=(dstx+0.5)* (srcwidth/dstwidth) -0.5
srcy=(dsty+0.5) * (srcheight/dstheight)-0.5,
這個要重點說一下,源影象和目標影象的原點(0,0)均選擇左上角,然後根據插值公式計算目標影象每點畫素,假設你需要將一幅5x5的影象縮小成3x3,那麼源影象和目標影象各個畫素之間的對應關係如下。如果沒有這個中心對齊,根據基本公式去算,就會得到左邊這樣的結果;而用了對齊,就會得到右邊的結果:
[1] 雙線性插值(bilinear interpolation)
[2] opencv ——雙線性插值(bilinear interpolation)
[3] 雙線性插值演算法及需要注意事項
[4] opencv中resize函式五種插值演算法的實現過程
線性插值和雙線性插值
線性插值 如果你只處理分離的資料 想知道分離點之間的某些值,需要用到某種型別的插值。這種情況如圖5 17座標所示。對某些分離的 整數 x值,你知道y值。當x 2,你知道y 10,x 3時y 30。但你不知道x 2.7時的y值。使用線性插值,你通過連線兩點的線段找到x 2.7對應的y值,如圖1所示。使...
雙線性插值
雙線性插值作為opencv中預設使用的影象縮放演算法,其效果和速度都是不錯的。並且效果也比較穩定,計算複雜度並不算太高。我看了很多網上的演算法,自己也沒看太懂,下面是從網上找的雙線性插值 演算法的講解。影象的雙線性插值放大演算法中,目標影象中新創造的象素值,是由源影象位置在它附近的2 2區域4個鄰近...
雙線性插值
轉至 雙線性插值,這個名字咋一聽很高大上的樣紙,再在維基百科上一查 見文末,我去,一堆的公式嚇死人 像俺這種半文盲,看到公式腦子就懵的型別,真心給跪。雖然看著好複雜,但仔細一看道理再簡單不過了,所以還是自己梳理一下好。雙線性插值,顧名思義就是兩個方向的線性插值加起來 這解釋過於簡單粗暴,哈哈 所以只...