js 雙線性插值 雙三次插值法 實現

2021-10-05 09:37:06 字數 2614 閱讀 3933

雙三次插值法

js實現

在網頁中利用canvas進行繪圖時,遇到乙個問題,原始的資料解析度很小,而要放大到整個網頁,所以需要把資料進行插值放大。學習了雙線性插值和三次內插法插值,兩種方式實現效果不同,都用js**實現了一下,下面給大家分享一下

雙線性插值即在x和y兩個方向上,對資料各進行一次線性插值。

原始資料的矩陣,即乙個二維陣列,大小為a*b,目標矩陣大小為m*n,m、n比a、b可以大(放大),也可以小(縮小),當然比例也可以不一樣, 取決於你插值後的資料需要多大。

基本思想為,遍歷目標矩陣的座標,如x*y這個點,找到這個點在原始矩陣中對應的位置,稱為對映點,然後找到這個對映點p在原始矩陣中周圍的四個點,然後根據對映點p到這個四個點的x和y方向上的座標的距離,進行兩次線性插值,得到對映點的值即可。

如上圖所示,p點為目標矩陣中x*y點在原始矩陣中對映的位置,它周圍最近的有q12,q11,q21,q22四個點,現在x方向進行線性插值,得到r1和r2兩個點的值,再在y方向進行一次線性插值,得到p點的值。

注意:用雙線性插值放大資料後,如果放大倍數過大,生成後發現有著明顯的馬賽克現象

實現**參考後面js**

雙三次插值又稱立方卷積插值。三次卷積插值是一種更加複雜的插值方式。該演算法利用待取樣點周圍16個點的灰度值作三次插值,不僅考慮到4 個直接相鄰點的灰度影響,而且考慮到各鄰點間灰度值變化率的影響。具體的原理可參考下面部落格:

參考這裡的部落格

基本原理就是,先找到目標矩陣中點在源資料矩陣中的對映點p,然後找到p點周圍16個點,然後根據p點座標距離16個點的x和y方向的距離,利用bicubic函式算出每個點的權重,最後每個點乘以權重後,加起來即可得到p的值。

bicubic函式:

其中,a取-0.5時,bicubic函式具有如下形狀:

取a=-0.5時,放大的資料挺好,生成的非常平滑,也保留了很多細節。

具體為什麼要用這個函式,我也沒有深入研究,不過利用該方法放大資料後,生成效果很好,沒有馬賽克現象

/**

* 資料處理工具類(也可以自己直接定義方法,不用class)

*/class

datautil

}/**

* 資料插值

* @param w 目標矩陣寬度

* @param h 目標矩陣高度

* @param data 源資料矩陣(二維陣列)

* @param type 插值方式,1:雙線性插值,2:雙三次插值法

*/datautil.

scaledata

=function

(w, h, data, type =2)

else

if(type ===1)

else

line[i]

= math.

round

(v);

} resdata[j]

= line;

}let t2 =

newdate()

.gettime()

; console.

log(

"資料插值耗時:"

,(t2 - t1));

return resdata;

}/**

* 雙線性插值

* @param sw 目標矩陣的寬度

* @param sh 目標矩陣的高度

* @param x_ 目標矩陣中的x座標

* @param y_ 目標矩陣中的y座標

* @param data 源資料矩陣(二維陣列)

*/datautil.

interpolation

=function

(sw, sh, x_, y_, data)

/** * 雙三次插值法

* @param sw 目標矩陣的寬度

* @param sh 目標矩陣的高度

* @param x_ 目標矩陣中的x座標

* @param y_ 目標矩陣中的y座標

* @param data 源資料矩陣(二維陣列)

*/datautil.

cubicinterpolation

=function

(sw, sh, x_, y_, data)

}return val;

}/**

* 雙三次插值法中,基於bicubic基函式,計算源座標v,最近的4*4的座標和座標對應的權重

* @param v 目標矩陣中座標對應在源矩陣中座標值

*/datautil.

getcubicweight

=function

(v)else

if(val <2)

ws[i]

= w;

}return

;}

git專案位址

專案中有上述原始碼,和使用案例

雙線性插值法

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

線性插值和雙線性插值

線性插值 如果你只處理分離的資料 想知道分離點之間的某些值,需要用到某種型別的插值。這種情況如圖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個鄰近...