當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python skimage.segmentation.random_walker用法及代碼示例

用法:

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, channel_axis=None)

用於從標記進行分割的隨機遊走算法。

隨機遊走算法適用於灰度級或多通道圖像。

參數

dataarray_like

要分階段分割的圖像。灰度data可以是二維或三維的;多通道數據可以是三維或四維的channel_axis指定包含通道的維度。假設數據間距是各向同性的,除非間距使用關鍵字參數。

labels整數數組,與 data 形狀相同,沒有通道維度

種子標記數組,用不同的正整數標記,用於不同的階段。 Zero-labeled 像素是未標記的像素。負標簽對應於未考慮的非活動像素(它們從圖中刪除)。如果標簽不是連續的整數,標簽數組將被轉換,以便標簽是連續的。在多通道情況下,標簽應該具有與單個通道相同的形狀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,則標簽數組將被分割結果覆蓋。如果要節省內存,請使用 copy=False。

multichannel布爾型,可選

如果為 True,則輸入數據被解析為多通道數據(請參閱上麵的‘data’,了解在這種情況下的正確輸入格式)。不推薦使用此參數:改為指定 channel_axis。

return_full_prob布爾型,可選

如果為 True,則將返回像素屬於每個標簽的概率,而不是僅返回最可能的標簽。

spacing可迭代的浮點數,可選

每個空間維度中體素之間的間距。如果沒有,則假設每個維度中像素/體素之間的間距為 1。

prob_tol浮點數,可選

結果概率的公差在區間 [0, 1] 內。如果不滿足公差,則會顯示警告。

channel_axisint 或無,可選

如果為 None,則假定圖像是灰度(單通道)圖像。否則,此參數指示數組的哪個軸對應於通道。

返回

outputndarray
  • 如果return_full_prob為 False,具有相同形狀和數據類型的整數數組標簽,其中每個像素已根據通過各向異性擴散首先到達像素的標記進行標記。
  • 如果return_full_prob是真的,形狀的浮點數數組(nlabels,labels.shape).輸出[label_nb, i, j]是標簽的概率label_nb到達像素(i, j)第一的。

其他參數

multichannelDEPRECATED

已棄用以支持channel_axis。

注意

多通道輸入通過組合所有通道數據進行縮放。確保在運行此算法之前對所有通道進行單獨標準化。

間距參數專門用於各向異性數據集,其中數據點在一個或多個空間維度上的間距不同。各向異性數據在醫學成像中很常見。

該算法最初是在[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.

例子

>>> rng = np.random.default_rng()
>>> a = np.zeros((10, 10)) + 0.2 * rng.random((10, 10))
>>> a[5:8, 5:8] += 1
>>> b = np.zeros_like(a, dtype=np.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)

相關用法


注:本文由純淨天空篩選整理自scikit-image.org大神的英文原創作品 skimage.segmentation.random_walker。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。