OpenCV 雙線性插值法

2021-08-16 14:34:06 字數 4285 閱讀 5191

定義:

又稱雙線性內插。在數學上,雙線性插值是有兩個變數的插值函式的線性插值擴充套件,其核心思想是在兩個方向上分別進行一次線性插值。

對於乙個目的畫素,設定座標通過反向變換得到的浮點座標為(i+u,j+v) (其中i、j均為浮點座標的整數部分,u、v為浮點座標的小數部分,是取值[0,1)區間的浮點數),則這個畫素得值 f(i+u,j+v) 可由原影象中座標為 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所對應的周圍四個畫素的值決定,即:f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)

其中f(i,j)表示源影象(i,j)處的的畫素值,以此類推。

特點:

當對相鄰四個畫素點採用雙線性插值時,所得表面在鄰域處是吻合的,但斜率不吻合。並且雙線性灰度插值的平滑作用可能使得影象的細節產生退化,這種現象在進行影象放大時尤其明顯。

計算:

已知的紅色資料點與待插值得到的綠色資料點

假如我們想得到未知函式f在點p= (x,y) 的值,假設我們已知函式f在q11 = (x1,y1)、q12 = (x1,y2),q21 = (x2,y1) 以及q22 = (x2,y2) 四個點的值。

首先在x方向進行線性插值,得到r1和r2,然後在y方向進行線性插值,得到p。

這樣就得到所要的結果f(x,y).

其中紅色點q11,q12,q21,q22為已知的4個畫素點.

第一步:x方向的線性插值,在q12,q22中插入藍色點r2,q11,q21中插入藍色點r1;

第二步:y方向的線性插值 ,通過第一步計算出的r1與r2在y方向上插值計算出p點。

線性插值的結果與插值的順序無關。首先進行y方向的插值,然後進行x方向的插值,所得到的結果是一樣的。

在影象處理的時候,我們先根據

srcx = dstx * (srcwidth / dstwidth);

srcy = dsty * (srcheight / dstheight);

來計算目標畫素在源影象中的位置,這裡計算的srcx和srcy一般都是浮點數,比如f(1.2, 3.4)這個畫素點是虛擬存在的,先找到與它臨近的四個實際存在的畫素點

(1, 3) (2, 3)

(1, 4) (2, 4)

寫成f(i + u, j + v)的形式,則u = 0.2, v = 0.4, i = 1, j = 3

在沿著x方向差插值時,f(r1)=u(f(q21)-f(q11))+f(q11)

沿著y方向同理計算。

或者,直接整理一步計算,f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 。

如果選擇乙個座標系統使得 的四個已知點座標分別為 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那麼插值公式就可以化簡為

f

(x,y)=f

(0,0)

(1-x)

(1-y)+f

(1,0)

x(1-y)+f

(0,1)

(1-x)

y+f(1,1)

xy

在x與y方向上,z值成單調性特性的應用中,此種方法可以做外插運算,即可以求解q1~q4所構成的正方形以外的點的值。

//—————————以下摘自:mr. easy

加速及優化

單純按照上文實現的插值演算法只能勉強完成插值的功能,速度和效果都不會理想,在具體**實現的時候有些小技巧。參考opencv原始碼以及網上部落格整理如下兩點:

源影象和目標影象幾何中心的對齊。

將浮點運算轉換成整數運算

1)源影象與目標影象幾何中心的對齊

方法:在計算源影象的虛擬浮點座標的時候,一般情況:

srcx=dstx* (srcwidth/dstwidth) ,

srcy = dsty * (srcheight/dstheight)

中心對齊(opencv也是如此):

srcx=(dstx+0.5)* (srcwidth/dstwidth) -0.5

srcy=(dsty+0.5) * (srcheight/dstheight)-0.5

原理

雙線性插值演算法及需要注意事項這篇部落格解釋說「如果選擇右上角為原點(0,0),那麼最右邊和最下邊的畫素實際上並沒有參與計算,而且目標影象的每個畫素點計算出的灰度值也相對於源影象偏左偏上。」我有點保持疑問。

將公式變形,srcx=dstx* (srcwidth/dstwidth)+0.5*(srcwidth/dstwidth-1)

相當於我們在原始的浮點座標上加上了0.5*(srcwidth/dstwidth-1)這樣乙個控制因子,這項的符號可正可負,與srcwidth/dstwidth的比值也就是當前插值是擴大還是縮小影象有關,有什麼作用呢?看乙個例子:假設源影象是3*3,中心點座標(1,1)目標影象是9*9,中心點座標(4,4),我們在進行插值對映的時候,盡可能希望均勻的用到源影象的畫素資訊,最直觀的就是(4,4)對映到(1,1)現在直接計算srcx=4*3/9=1.3333!=1,也就是我們在插值的時候所利用的畫素集中在影象的右下方,而不是均勻分布整個影象。現在考慮中心點對齊,srcx=(4+0.5)*3/9-0.5=1,剛好滿足我們的要求.

將浮點運算轉換成整數運算

參考影象處理界雙線性插值演算法的優化

直接進行計算的話,由於計算的srcx和srcy 都是浮點數,後續會進行大量的乘法,而影象資料量又大,速度不會理想,解決思路是:浮點運算→→整數運算→→」《左右移按位運算」

放大的主要物件是u,v這些浮點數,opencv選擇的放大倍數是2048「如何取這個合適的放大倍數呢,要從三個方面考慮,第一:精度問題,如果這個數取得過小,那麼經過計算後可能會導致結果出現較大的誤差。第二,這個數不能太大,太大會導致計算過程超過長整形所能表達的範圍。第三:速度考慮。假如放大倍數取為12,那麼算式在最後的結果中應該需要除以12*12=144,但是如果取為16,則最後的除數為16*16=256,這個數字好,我們可以用右移來實現,而右移要比普通的整除快多了。」我們利用左移11位操作就可以達到放大目的。

**:

//雙線性內插  

【參考:】

雙線性插值法

今天在看faster rcnn時,看到了rol align的思想,其主要是在rol pool的基礎上提出了雙線插值獲取浮點數的點的值。維基百科上有詳細的數學公式推導,我在這只是通俗的講解下自己的理解,以留備份。類似於中值定理,根據兩邊的點確定中間點的值,假設已知q11 f q11 q f q q11...

雙線性插值

雙線性插值作為opencv中預設使用的影象縮放演算法,其效果和速度都是不錯的。並且效果也比較穩定,計算複雜度並不算太高。我看了很多網上的演算法,自己也沒看太懂,下面是從網上找的雙線性插值 演算法的講解。影象的雙線性插值放大演算法中,目標影象中新創造的象素值,是由源影象位置在它附近的2 2區域4個鄰近...

雙線性插值

轉至 雙線性插值,這個名字咋一聽很高大上的樣紙,再在維基百科上一查 見文末,我去,一堆的公式嚇死人 像俺這種半文盲,看到公式腦子就懵的型別,真心給跪。雖然看著好複雜,但仔細一看道理再簡單不過了,所以還是自己梳理一下好。雙線性插值,顧名思義就是兩個方向的線性插值加起來 這解釋過於簡單粗暴,哈哈 所以只...