HOG演算法中用到三線性插值(Trilinear Interpolation)的作用及其用法
1. 寫在前面的屁話。
最近的科研任務需要對HOG演算法進行魔改,很自然的就需要來看一看演算法,看一看程式碼了。
一開始網上down了一些程式碼,發現效果很差。分析了一下原因,發現他們都是根據作者論文直接復現的。然後沒辦法,把matlab中的程式碼調出來看了一下,果然,事情沒有那麼簡單。
裡面分別用了高斯濾波,三線性插值這兩個騷操作,簡直666.
講道理,程式碼我看了兩天,真的是沒看懂,這也是因為我沒有看原始論文的原因,為了圖快,也是看了網上的部落格,大家都是講了大概,文章中的一些細節都沒講明白,其中最主要的一點就是,為什麼要用三線性插值,怎麼用三線性插值。
下面我就把這個做筆記寫下來吧。
2. 三線性插值
-----通常將某個變數範圍固定劃分為幾個區域進行某種計算時,由於邊界變數與相鄰區域也有相關性,如果只對當前區域進行計算而完全忽略與相鄰區域的關係,就會產生區域混疊效應。這種混疊效應會在特徵向量中產生突變。在這種情況下就需要採用插值演算法對計算結果進行修正。在HOG特徵提取方法中,位於不同cell交界處的畫素如果只對所在的cell進行投影同樣會對其他區域產生混疊效應,此時需要採用三維線性插值的方法對梯度向量直方圖進行修正。
------插值運算在影像放大中應用較多, 這裡借用插值運算的思想對累積直方圖進行修正, 即將某個畫素點的梯度幅值以不同的權重累加到相應的bin上。確切地說, 這是一種權值分配, 但多數文獻和部落格中仍然延續 “插值” 這一說法。由於提取HOG特徵時需要在兩個位置座標(x, y)和一個方向座標( θ )共三個維度上進行插值運算, 因此稱為三線性插值。
------首先以二維情況為例說明線性插值的思想。在兩個維度上進行線性插值稱為“雙線性插值”。雙線性插值在影像放大或影像旋轉中應用廣泛,它是利用周圍4個鄰點的灰度值在兩個方向上作線性內插以得到待取樣點的灰度值,即根據待取樣點與相鄰點的距離確定相應的權值計算出待取樣點的灰度值。如下圖所示,點P為待取樣點,Q11、Q12、Q21、Q22為點P的四個相鄰點,用線性插值法對P點進行插值運算的數學表示式為:
----------------------------------------------------二維線性插值原理圖
2.1 在梯度方向上進行線性插值
根據上述插值思想,可在各畫素的梯度方向上進行加權運算,如下圖所示,將區間[0°,180°]以20°為一個區間劃分,每個小區間以中心角度作為直方圖的中心數值,假設要對梯度方向為15°的畫素點進行處理,顯然15與以10和30為中心的直方圖最近,應該將該點的梯度幅值加權累加到這兩個直方圖上,權重分別為(30-15)/20=0.75和(15-10)/20=0.25。
---------------------------------------對待處理畫素點的梯度方向進行線性加權示意圖
針對這個圖,我簡單解釋一下。在HOG演算法中,根據影像梯度方向範圍,將其劃分為無符號型(0,180°)或者有符號行(-180,180)。我是使用(0,180°)。這樣的話,因為預設將角度分為9個方向,因此就事9個bin,每個bin頻寬20°,即(0,20),(20,40),…,(160,180) ,因此,在bin中,梯度的每個方向的中心分別是:10,30,50,70,…,170.。
2.2 在畫素位置上進行插值
同理運用線性插值方法在各個畫素的位置上進行加權運算, 如下圖所示, 左圖中的方框處為待處理畫素點, 它位於block中的C0單元中, 利用該點與四個cell中的中心畫素點 (圖中4個圓點) 的距離計算權值, 將待處理畫素點的梯度幅值分別加權累加到C0、C1、 C2、 C3中相應的直方圖上。
----------------------對待處理畫素點的位置進行線性加權
2.3 在畫素位置和畫素梯度方向上進行三線性插值
綜合考慮,在兩個位置座標(x,y)和一個方向座標(θ)上進行三線性插值,關鍵要解決的問題是應該在哪些bin上進行加權累加,累加時權值又是多少。將一個畫素點處的梯度幅值加權分配到4個cell中與該點梯度方向相鄰的2個bin上。按照公式(7)修正直方圖向量,其中x、y軸表徵畫素點的空間位置,z軸表徵該點的梯度方向(即θ)。對於待處理畫素點(x,y),設其梯度幅值為ω,梯度方向為z,z1和z2分別是與之最鄰近的兩個bin的中點座標。梯度直方圖h沿x、y、z三個維度的直方圖頻寬分別為b=[bx,by,bz],bx=by=8,bz=180°/9。如圖6所示為三線性插值計算梯度方向直方圖向量的示意圖,左圖中的方框處為待處理畫素點,計算block的每個cell中與該點梯度方向相鄰的2個bin,共計8個直方圖柱上的權值,將該點的梯度幅值進行加權累加,即形成block中的梯度方向直方圖[5]。
由於線性插值法考慮了待取樣點周圍直接鄰點對待取樣點的影響, 因此能夠克服區域混疊的問題。
--------------------------------------三線性插值計算梯度方向直方圖向量
特此感謝
黃冬麗, 戴健文, 馮超, et al. HOG特徵提取中的三線性插值演算法[J]. 電腦知識與技術, 2012(31):7548-7551.
相關文章
- 演算法、資料結構、與設計模式等在遊戲開發中的運用 (三):插值(Interpolation)演算法資料結構設計模式遊戲開發
- [work] 影象縮放——雙線性插值演算法演算法
- 影像重取樣演算法之雙線性插值演算法演算法
- 九種常見二維插值方法及雙線性插值的理解
- 演算法-查詢(線性、二分、插值、斐波那契)演算法
- echo命令在Unix中的作用以及其常見用法?
- 線性蒙皮分解演算法及其在遊戲中的應用演算法遊戲
- NOISEDIFFUSION: 改進基於擴散模型的球面線性插值模型
- 淺析Java中的雜湊值HashCode的作用及用法Java
- 常用演算法 插值演算法演算法
- 插值查詢演算法演算法
- 線性表及其演算法(java實現)演算法Java
- opencv中自定義的雙線性二次插值的影像旋轉及縮放OpenCV
- 介紹一種二維線性插值計算方法
- 查詢演算法__插值查詢演算法
- 函式(三)作用域之變數作用域、函式巢狀中區域性函式作用域、預設值引數作用域函式變數巢狀
- 有符號浮點運算的基本步驟:以雙線性插值為例符號
- 線性表及其實現
- 命令注入-命令的連線符【‘&’‘&&’‘||’‘|’】的含義及其用法
- html中Position屬性值介紹和position屬性四種用法HTML
- SCSS #{} 插值CSS
- 影像重取樣演算法之最鄰近插值演算法演算法
- mapboxgl 中插值表示式的應用場景
- MATLAB一維插值和二維插值 比較Matlab
- 二、插值操作
- javascript中的資料型別及其常見用法JavaScript資料型別
- maven中profile元素的作用意義和用法Maven
- css詳解position五種屬性用法及其含義CSS
- 【影像縮放】雙立方(三次)卷積插值卷積
- js計算線性漸變的中間顏色值JS
- 求插值係數
- 插值技術研究
- c#-string 插值C#
- 【java】【插值查詢】Java
- String interpolation using $
- SSE影像演算法優化系列十八:三次卷積插值的進一步SSE優化。演算法優化卷積
- Hive的基本操作用法Hive
- PHP中的連線字元. 的用法PHP字元