注意
最後に移動 して完全なサンプルコードをダウンロードするか、Binder 経由でブラウザでこの例を実行してください。
セグメンテーションとスーパーピクセルアルゴリズムの比較#
この例では、4つの一般的な低レベル画像セグメンテーション手法を比較します。「優れた」セグメンテーションを得ることは難しく、「優れた」の定義はアプリケーションによって異なることが多いため、これらの手法は通常、スーパーピクセルとしても知られる過剰セグメンテーションを取得するために使用されます。これらのスーパーピクセルは、条件付きランダムフィールド(CRF)などのより洗練されたアルゴリズムの基礎として機能します。
Felzenszwalbの効率的なグラフベースセグメンテーション#
[1] で提案されたこの高速な2D画像セグメンテーションアルゴリズムは、コンピュータビジョンコミュニティで人気があります。アルゴリズムには、セグメントサイズに影響を与える単一の scale
パラメータがあります。セグメントの実際のサイズと数は、局所的なコントラストに応じて大きく変化する可能性があります。
Quickshift画像セグメンテーション#
Quickshiftは、カーネル化された平均シフトの近似に基づく、比較的新しい2D画像セグメンテーションアルゴリズムです。したがって、局所モード探索アルゴリズムのファミリに属し、色情報と画像位置で構成される5D空間に適用されます [2]。
quickshiftの利点の1つは、実際には複数のスケールで同時に階層的なセグメンテーションを計算することです。
Quickshiftには、主に2つのパラメータがあります。sigma
は局所密度近似のスケールを制御し、max_dist
は生成される階層的セグメンテーションのレベルを選択します。また、ratio
で与えられる、色空間の距離と画像空間の距離の間のトレードオフもあります。
モード探索のためのクイックシフトとカーネル法、Vedaldi、A.およびSoatto、S。European Conference on Computer Vision、2008
SLIC - K-Meansベースの画像セグメンテーション#
このアルゴリズムは、色情報と画像位置の5次元空間で単にK-meansを実行するだけであり、したがってquickshiftと密接に関連しています。クラスタリング手法がより単純であるため、非常に効率的です。このアルゴリズムが優れた結果を得るためには、Lab色空間で機能することが不可欠です。アルゴリズムはすぐに勢いを増し、現在広く使用されています。詳細については、[3]を参照してください。compactness
パラメータは、Quickshiftの場合と同様に、色の類似性と近接性をトレードオフし、n_segments
はkmeansの中心の数を選択します。
Radhakrishna Achanta、Appu Shaji、Kevin Smith、Aurelien Lucchi、Pascal Fua、およびSabine Suesstrunk、最先端のスーパーピクセル法と比較したSLICスーパーピクセル、TPAMI、2012年5月。
勾配画像のコンパクトなウォーターシェッドセグメンテーション#
ウォーターシェッドは、カラー画像を入力として受け取る代わりに、明るいピクセルが領域間の境界を示すグレースケールの*勾配*画像を必要とします。アルゴリズムは画像を風景として捉え、明るいピクセルは高いピークを形成します。この風景は、与えられた*マーカー*から水没し、個別の水没盆地がピークで出会うまで水没します。個別の盆地はそれぞれ異なる画像セグメントを形成します。[4]
SLICと同様に、遠くのピクセルを水没させることをより困難にする追加の*コンパクトネス*引数があります。これにより、ウォーターシェッド領域の形状がより規則的になります。[5]
https://en.wikipedia.org/wiki/Watershed_%28image_processing%29
Peer Neubert&Peter Protzel(2014)。コンパクトウォーターシェッドと先制SLIC:スーパーピクセルセグメンテーションアルゴリズムのトレードオフの改善について。ICPR 2014、pp 996-1001。DOI:10.1109/ICPR.2014.181 https://www.tu-chemnitz.de/etit/proaut/publications/cws_pSLIC_ICPR.pdf

Felzenszwalb number of segments: 194
SLIC number of segments: 196
Quickshift number of segments: 695
Watershed number of segments: 256
import matplotlib.pyplot as plt
import numpy as np
from skimage.data import astronaut
from skimage.color import rgb2gray
from skimage.filters import sobel
from skimage.segmentation import felzenszwalb, slic, quickshift, watershed
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
img = img_as_float(astronaut()[::2, ::2])
segments_fz = felzenszwalb(img, scale=100, sigma=0.5, min_size=50)
segments_slic = slic(img, n_segments=250, compactness=10, sigma=1, start_label=1)
segments_quick = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5)
gradient = sobel(rgb2gray(img))
segments_watershed = watershed(gradient, markers=250, compactness=0.001)
print(f'Felzenszwalb number of segments: {len(np.unique(segments_fz))}')
print(f'SLIC number of segments: {len(np.unique(segments_slic))}')
print(f'Quickshift number of segments: {len(np.unique(segments_quick))}')
print(f'Watershed number of segments: {len(np.unique(segments_watershed))}')
fig, ax = plt.subplots(2, 2, figsize=(10, 10), sharex=True, sharey=True)
ax[0, 0].imshow(mark_boundaries(img, segments_fz))
ax[0, 0].set_title("Felzenszwalbs's method")
ax[0, 1].imshow(mark_boundaries(img, segments_slic))
ax[0, 1].set_title('SLIC')
ax[1, 0].imshow(mark_boundaries(img, segments_quick))
ax[1, 0].set_title('Quickshift')
ax[1, 1].imshow(mark_boundaries(img, segments_watershed))
ax[1, 1].set_title('Compact watershed')
for a in ax.ravel():
a.set_axis_off()
plt.tight_layout()
plt.show()
スクリプトの合計実行時間:(0分3.103秒)