Random Walk分割算法

引言

RandomWalk是基於圖論分割方法的一個重要分支。在根據圖像建立的圖模型上,RandomWalk根據隨機遊走模型,來求解未標記的像素(unseeded pixels)到達已標記的種子點(seeded pixels)的概率,根據未標記的像素到達不同目標區域的概率大小,來判斷未標記像素的歸屬。

RandomWalk圖像分割算法分爲三個步驟:(1)圖模型的建立;(2)根據隨機遊走模型計算unseeded pixels到達目標區域的線性方程組;(3)利用迭代法求解線性方程組,這裏通常採用共軛梯度法進行求解(conjugate gradient)。其求解過程可以用下圖來描述:

                                                                           

1 圖模型的建立

這裏根據圖像像素與相鄰像素之間的差異,建立加權圖,各個邊的加權值求解方法如下$$w_{ij}=exp(-\beta(g_i-g_j))^2$$
。其中$$g_i,g_j爲相鄰像素的像素值$$

2 隨機遊走模型的建立

隨機遊走模型的建立,可以理解爲狄利克雷積分條件的離散化。其可以使用拉普拉斯矩陣來進行描述,即對隨機遊走模型的求解,可以描述爲如下方程的最小化求解:
$$D[x] = 0.5  x^TL x,$$
其中,拉普拉斯方程的構建如下:

其中$$d_i = sum_jw_{ij}。$$
這裏將圖像中的像素分爲marked/seeded和unseeded兩種,分別標記爲$$V_M和V_U$$因此,狄利克雷方程可以變形如下:

對$x_U$求偏微分,則可以得到如下的方程組:

對於向量$x_M$,其中各個元素爲:


3 模型的求解

對上述稀疏矩陣線性方程組的求解,最長用的是共軛梯度法。這裏值得注意的是由於拉普拉斯矩陣爲稀疏矩陣,如果直接運算將會導致運算緩慢以及對內存的不規則調用。這裏通常使用處理稀疏矩陣的第三方庫來進行計算。常見的第三方庫包括:

方案一:直接使用CUDA

         需要注意的是這裏的矩陣運算是稀疏矩陣的運算,需要對稀疏矩陣進行壓縮處理。

         第三方提供的稀疏矩陣運算程序:http://www.mverschoor.nl/wp/projects/cuda-spmv/

         CUDA官方提供的稀疏矩陣運算程序[需要CUDA7.0版本]:https://developer.nvidia.com/cuSPARSE 

方案二:OPENCL的加速方法來實現

         可以使用ViennaCL進行運算。ViennaCL是使用OPENCL,OPENMP,CUDA等編寫的,主要用於進行高級的矩陣運算。http://viennacl.sourceforge.net/viennacl-about.html

         方案三:使用已有的加速方法來實現,例如voreen:

         使用voreenBlas中的共軛梯度程序求解,其中也包括對稀疏矩陣的處理。https://github.com/bilgili/Voreen/tree/master/modules/randomwalker

方案四:其他的庫,包括MKL中的DCG相關函數;GMM庫等等

4 與圖割方法的比較

 隨機遊走相比較於圖割方法,其具有以下幾點優勢:
(1)對於模糊邊界的求解:圖割方法由於採用了最大圖/最小割方法,其容易導致分割區域的收縮,因此其不適用於血管等圖像的分割。對於模糊邊界的求解,其可以用如下的示意圖表示:

參考文獻:

  1. <Random Walk For Image Segmentation> Leo Grady.

發佈了46 篇原創文章 · 獲贊 18 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章