ランダムウォーカーセグメンテーション#

ランダムウォーカーアルゴリズム[1]は、いくつかのフェーズ(2つ以上)をラベル付けしたマーカーのセットから画像のセグメンテーションを決定します。異方性拡散方程式は、マーカーの位置で開始されたトレーサーを使用して解かれます。隣接するピクセルが類似した値を持つ場合、局所拡散係数は大きくなり、高勾配を横切る拡散が困難になります。各未知のピクセルのラベルは、この拡散プロセス中に最初に到達する確率が最も高い既知のマーカーのラベルに帰属されます。

この例では、2つのフェーズが明確に見えますが、データのノイズが多すぎてヒストグラムのみからセグメンテーションを実行できません。グレースケール値のヒストグラムの極端なテールから2つのフェーズのマーカーを決定し、セグメンテーションにランダムウォーカーを使用します。

Noisy data, Markers, Segmentation
import numpy as np
import matplotlib.pyplot as plt

from skimage.segmentation import random_walker
from skimage.data import binary_blobs
from skimage.exposure import rescale_intensity
import skimage

rng = np.random.default_rng()

# Generate noisy synthetic data
data = skimage.img_as_float(binary_blobs(length=128, rng=1))
sigma = 0.35
data += rng.normal(loc=0, scale=sigma, size=data.shape)
data = rescale_intensity(data, in_range=(-sigma, 1 + sigma), out_range=(-1, 1))

# The range of the binary image spans over (-1, 1).
# We choose the hottest and the coldest pixels as markers.
markers = np.zeros(data.shape, dtype=np.uint)
markers[data < -0.95] = 1
markers[data > 0.95] = 2

# Run random walker algorithm
labels = random_walker(data, markers, beta=10, mode='bf')

# Plot results
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(8, 3.2), sharex=True, sharey=True)
ax1.imshow(data, cmap='gray')
ax1.axis('off')
ax1.set_title('Noisy data')
ax2.imshow(markers, cmap='magma')
ax2.axis('off')
ax2.set_title('Markers')
ax3.imshow(labels, cmap='gray')
ax3.axis('off')
ax3.set_title('Segmentation')

fig.tight_layout()
plt.show()

スクリプトの合計実行時間:(0分0.559秒)

Sphinx-Galleryによって生成されたギャラリー