当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python cucim.skimage.segmentation.random_walker用法及代码示例


用法:

cucim.skimage.segmentation.random_walker(data, labels, beta=130, mode='cg_j', tol=0.001, copy=True, multichannel=False, return_full_prob=False, spacing=None, *, prob_tol=0.001)

用于从标记进行分割的随机游走算法。

为gray-level 或多通道图像实施随机游走算法。

参数

dataarray_like

要分阶段分割的图像。 Gray-level data可以是二维或三维;多通道数据可以是三维或四维(multichannel=True),最高维度表示通道。除非使用 spacing 关键字参数,否则假定数据间距是各向同性的。

labels整数数组,与 data 形状相同,没有通道维度

种子标记数组,用不同的正整数标记,用于不同的阶段。 Zero-labeled 像素是未标记的像素。负标签对应于未考虑的非活动像素(它们从图中删除)。如果标签不是连续的整数,标签数组将被转换,以便标签是连续的。在多通道情况下,labels 应该与 data 的单个通道具有相同的形状,即没有表示通道的最终尺寸。

beta浮点数,可选

随机游走运动的惩罚系数(beta 越大,扩散越困难)。

mode字符串,可用选项 {‘cg’, ‘cg_j’, ‘cg_mg’, ‘bf’}

随机游走算法中求解线性系统的模式。

  • ‘bf’(蛮力):计算拉普拉斯算子的 LU 分解。这对于小图像(<1024x1024)来说很快,但对于大图像(例如 3-D 体积)非常慢且 memory-intensive。
  • ‘cg’(共轭梯度):使用scipy.sparse.linalg中的共轭梯度方法迭代求解线性系统。这比大图像的蛮力方法少memory-consuming,但速度很慢。
  • ‘cg_j’(带有 Jacobi 前置条件的共轭梯度):Jacobi 前置条件在共轭梯度方法迭代期间应用。这可能会加速‘cg’ 方法的收敛。
  • ‘cg_mg’(使用多重网格预处理器的共轭梯度):使用多重网格求解器计算预处理器,然后使用共轭梯度方法计算解。此模式需要安装 pyamg 模块。
tol浮点数,可选

使用基于共轭梯度的模式(‘cg’, ‘cg_j’ 和‘cg_mg’)求解线性系统时要实现的容差。

copy布尔型,可选

如果 copy 为 False,labels 数组将被分割结果覆盖。如果要节省内存,请使用 copy=False。

multichannel布尔型,可选

如果为 True,则输入数据被解析为多通道数据(请参阅上面的‘data’,了解在这种情况下的正确输入格式)。

return_full_prob布尔型,可选

如果为 True,则将返回像素属于每个标签的概率,而不是仅返回最可能的标签。

spacing可迭代的浮点数,可选

每个空间维度中体素之间的间距。如果 None ,则假设每个维度中像素/体素之间的间距为 1。

prob_tol浮点数,可选

结果概率的公差在区间 [0, 1] 内。如果不满足公差,则会显示警告。

返回

outputndarray
  • 如果 return_full_prob 为 False,则具有与 labels 相同形状和数据类型的整数数组,其中每个像素已根据通过各向异性扩散首先到达像素的标记进行标记。
  • 如果 return_full_prob 为 True,则形状为 (nlabels, labels.shape) 的浮点数组。 output[label_nb, i, j]是标签label_nb首先到达像素(i, j)的概率。

注意

多通道输入通过组合所有通道数据进行缩放。确保在运行此算法之前对所有通道进行单独标准化。

spacing 参数专门用于各向异性数据集,其中数据点在一个或多个空间维度上的间距不同。各向异性数据在医学成像中很常见。

该算法最初是在[1] 中提出的。

该算法无限次求解放置在每个相位标记上的源的扩散方程。像素被标记为最有可能首先扩散到像素的相位。

扩散方程通过最小化每个相位的 xT L x 来求解,其中 L 是图像加权图的拉普拉斯算子,x 是给定相位的标记通过扩散首先到达像素的概率(x=1在相位标记上,x=0 在其他标记上,并寻找其他系数)。每个像素都具有最大值 x 的标签。图像的拉普拉斯 L 定义为:

  • L_ii = d_i,像素i的邻居数(i的度数)

  • L_ij = -w_ij 如果 i 和 j 是相邻像素

权重 w_ij 是局部梯度范数的减函数。这确保了在具有相似值的像素之间更容易扩散。

当拉普拉斯算子分解为标记和未标记像素块时:

L = M B.T
    B A

第一个索引对应于标记的像素,然后是未标记的像素,最小化一个阶段的 x.T L x 求解:

A x = - B x_m

其中 x_m = 1 在给定相位的标记上,在其他标记上为 0。该线性系统在算法中对小图像使用直接法求解,对较大图像使用迭代法求解。

参考

1

Leo Grady, Random walks for image segmentation, IEEE Trans Pattern Anal Mach Intell. 2006 Nov;28(11):1768-83. DOI:10.1109/TPAMI.2006.233.

例子

>>> import cupy as cp
>>> cp.random.seed(0)
>>> a = cp.zeros((10, 10)) + 0.2 * cp.random.rand(10, 10)
>>> a[5:8, 5:8] += 1
>>> b = cp.zeros_like(a, dtype=cp.int32)
>>> b[3, 3] = 1  # Marker for first phase
>>> b[6, 6] = 2  # Marker for second phase
>>> random_walker(a, b)
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 2, 2, 2, 1, 1],
       [1, 1, 1, 1, 1, 2, 2, 2, 1, 1],
       [1, 1, 1, 1, 1, 2, 2, 2, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=int32)

相关用法


注:本文由纯净天空筛选整理自rapids.ai大神的英文原创作品 cucim.skimage.segmentation.random_walker。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。