雙三次插值法
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個鄰近...