您的位置:首页 > 其它

Random Walk分割算法

2015-07-27 16:31 337 查看

引言

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)对于模糊边界的求解:图割方法由于采用了最大图/最小割方法,其容易导致分割区域的收缩,因此其不适用于血管等图像的分割。对于模糊边界的求解,其可以用如下的示意图表示:



参考文献:

<Random Walk For Image Segmentation> Leo Grady.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: