版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 https://blog.csdn.net/xuanwu_yan/article/details/7962508
勘誤使於2017年3月19日
本文寫於2012年碩士生階段,有較多疏漏和誤解,於今日起開始勘誤,以最大限度的保留原始文章,同時更正其中錯誤。html
1、背景碎碎念
以前的saliency filter引用了一篇Adams的Fast high-dimensional filtering using the permutohedral lattice,2010(見引用4),看了不少遍,感受因爲篇幅受限略過去了不少東西,數學又是屬於基礎的問題,看起來很慢。不死心繼續搜,終於功夫不負有心人,找到了Adams在2011年寫的HIGH-DIMENSIONAL GAUSSIAN FILTERING FOR COMPUTATIONAL PHOTOGRAPHY(
Pdf)博士畢業論文,全文133頁,詳細闡明瞭新提出的兩種高斯卷積加速方法:一個就是本篇中要詳細講的利用permutohedral lattice,第二種使用了Gaussian KD-Tree。
文章首先在開始處介紹了幾種Gaussian濾波的家族成員:雙邊濾波,joint-雙邊濾波,joint-雙邊濾波upsample,以及Non-local Means的主要函數形式,以及在圖片處理中的效果。下面是高維高斯濾波的函數形式:
左邊爲位置i的新數值(通常爲顏色),向量表示;pi表示當前點的特徵值,pj爲窗口空間中剩餘點的特徵值,

,
對於此處爲何有個1,個人理解是爲了保證窗口中權值之和爲1須要除一個參數,新獲得rgb值缺乏這麼一個參數,因而就有了這個1
咱們分析不一樣濾波方式中特徵值不一樣產生的影響:
1)在普通的高斯濾波中有
也就是說當前像素點周圍只是位置的遠近影響新的值;
2)而雙邊濾波中
致使顏色迥異的點時權值近似爲零。(後來我才知道這裏放的兩隻黑狗照片是做者拍攝地,有錢淫,他的Stanford主頁上還有各類旅遊風景照,口水ing)這裏先作簡單介紹,實現代碼與此有關。此後又對以上幾種方法進行了圖片(Canon 400D at ISO 1600.)處理的對比,發現對於非高斯噪點,joint-雙邊濾波對人眼表現最好,但Non-local Means處理後的照片最真實。
說了這麼多,其實做者的意思就是高斯卷積在圖片處理中處於使用量巨大,可是同時速度很慢的一個技術,如何快速計算高斯卷積是一項灰常灰常重要的事。
本文思想
下面輪到介紹本文的基本思想了,也許各位也看過了不少遍吧。。。
1)用新建座標系,用pi表示特徵值節點座標而不是原始的(x, y),vi保持不變
2)投影映射,就是座標變換,降維的步驟在此處進行。一個座標不是投影到一個點,而是相似於重心插值投影到一個單形(lattice)各個頂點處,保留各頂點的權值爲之後的upsample保存。若兩個不一樣的點投影到相同的頂點座標時,增大此點值。
3)對lattice的頂點計算高斯卷積
4)upsample獲得原始的點。
2、現有成果
因爲我讀本文重點在於permutohedral lattice,因此那些濾波之類的就只作了一下簡單瞭解,joint-雙邊濾波-upsample和Non_local Means真心沒有搞懂,這裏也不瞎作介紹。而後有一幅圖挺重要的,具體對比了Gaussian Filter這些年的進步。
1)Naive方法只是單純地將窗口中全部點進行卷積,時間複雜度O(mn^d);
2)快速高斯卷積方法首先將格子中的每一個點都放在了格子的重心上,時間複雜度O(mk^d),因爲格子的個數k小於point的個數n,因此提速;
3)雙邊方格卷積在上面的基礎上,不對每一個點卷積,而是對格子的每一個頂點卷積,最後使用插值方式恢復特徵點,複雜度變爲O(k^(d+1)),特徵點的個數多於格子的個數,因此有加速,但此方法有個缺點就是對於維度仍然是指數複雜度,對高維特徵的高斯濾波不合適(d>3 or d>5)
4)改進的快速高斯卷積,不侷限於方格而是簇概念,每一個簇能夠是跨維度的形狀,雙邊濾波改進處就是在中心表示以後,直接對重心進行blur,而後在插值造成原來的點,時間複雜度O(mkd);
5)本文在第一步採用了新的方法,經過提升維度的方法將格子原來的grid變成了文中的permutohedral lattice,時間複雜度也是O(nd^2),但因爲使用質心插值方法,可以產生更加優秀的效果;高斯Kd-tree則在分類上作了改變,有時間再繼續讀。
3、Permutohedral Lattice
本文貢獻
Permutohedral lattice相比以前工做的進步之處於,
- 它不只僅把一個點映射到格子中心表示,而是映射到單形格子的各個頂點上,這樣子近似卷積的更加精確;
- 因爲每一個lattice具備同等形態,可以用質心差值插值映射到lattice的各個頂點上;
- 而且可以快速在此lattice上找到映射點四周的頂點,這樣子兩次映射(splat,slice)可以快速進行;
- blur階段能夠每一維離散進行,而且一個lattice頂點的周邊頂點可以迅速肯定,此階段可以快速進行。
定義
一個d維的permutohedral lattice是d+1維空間子平面分割,此超平面法向量爲
![\vec{1}=[1,1,...,1]](http://static.javashuo.com/static/loading.gif)
,因此咱們有

。什麼是分割?通常認爲分割的格子(lattice)是一樣形狀,一個平面可以被相同形狀的格子沒有縫隙,沒有重疊的佈滿,那麼格子就是空間的分割。
咱們須要對此子平面進行分割,做者使用了單形進行分割。單形頂點在d+1維空間座標咱們不得而知,做者從新定義了基向量(並不徹底準確,由於之間線性相關),因而此子平面上單形頂點的座標直接知足在平面上的要求,即

。
當d=3時,單形頂點在原點,單形的邊長爲1,格子如上圖所示。單形的頂點座標爲整數,而且一個點的座標各項模d+1=3有相同餘項k,咱們稱這個頂點爲餘k點。這裏對上面的基向量稍微作一下解釋,假設在三維空間中,有子空間

,有
在xoy平面上,有三個點

,這個點通過映射變換,就對應了上圖中的橙色區域,座標爲
也就是說,下圖右側x軸原點y軸夾的右上部分區域,是下圖左側分割空間座標映射變換
下面的文章都是基於映射後的座標。
網格性質
子平面具備三個屬性:
- 這個子平面被相同形狀的單形填充,不留縫隙,沒有重疊
- 子平面中任意一點所在的單形頂點都能以
的時間內定義
- 單形頂點周圍全部的頂點也能以
的時間內定義
文章有詳細的論證,咱們這裏簡單的說明一下:
這個子平面被相同形狀的單形填充,不留縫隙,沒有重疊。做者首先證實了一個距離子平面中一點x最近的餘0頂點是原點,其充分必要條件是該點座標最大值與最小值差小於等於d+1。由格子的平移不變性,咱們能夠獲得每一個點(不在格子的邊上)的最近餘0點l都是惟一的,並且能夠經過x-l的座標獲得具體在餘0點周邊具體的單形區域(也惟一)。因此子平面被單形分割,沒有縫隙,沒有重疊。
子平面中任意一點所在的單形頂點都能以

的時間內定義。分兩步,先肯定最近餘0點,而後經過l-x座標判斷所在單形而後計算單形頂點。本文使用Conway&Sloane提出的方法肯定最近餘0點,給一個座標,先找出其最近的餘0點。具體方法爲:座標向量中每一個值找到最近的模d+1餘0的值,若是座標向量1範式值不爲0(不在此子平面),則調整座標中變化最大的那一項,使其向反方向增長或者減小d+1。用時

。
單形頂點周圍的頂點也能以

的時間內定義。一個單形頂點全部臨近點與其座標相差爲
![\pm [-1,...,-1,d,-1,...-1]](http://static.javashuo.com/static/loading.gif)
,總共有2(d+1)個這樣的點,因此用時

。
計算高斯卷積
下面介紹利用這個permutohedral lattice計算高斯卷積。
生成特徵值映射到子平面的點
首先將每一個座標點除了一個偏差,是由splat,blur以及slice中產生的。而後映射到子平面上,注意此時的映射矩陣與上面的不一樣,由於上面的基向量不是正交的,而且此映射能夠用

的時間計算出來。
舉例bilateral filter,position由5-D向量組成,
計算方法以下:
Splat階段:
這個階段主要是把特徵點的值使用質心插值的方法,累加到所在單形的全部頂點上。上文已經介紹瞭如何經過點找到所在單形的頂點。那麼質心插值如何計算?
還記得上面圖片的橙色三角區域嗎,假設其中有一個點y,s是單形的頂點,b是插值係數,那麼咱們有
做者證實了此階段時間複雜度是

。
Blur階段:
查找單形頂點的全部相鄰點對,即
![\hat{l}_i\pm [-1,...,-1,d,-1,...,-1]](http://static.javashuo.com/static/loading.gif)
,使用核函數進行blur操做,此步驟複雜度爲

。
Slice階段:
同splat階段步驟,利用權重b計算插值。因爲在splat階段創建了b的table,因此用時O(nd)。
本算法總計用時爲O((n+l)d^2)。
此圖爲速度比的等高線,爲最快速度和第二快的算法結構用時之比。顏色越深相差越大。圖片左側標誌維度,橫軸爲filter size,右側爲使用的算法。
能夠看到5-20維度時候permutohedral lattice根據filter size狀況最優。
完結。算法