Ripser.py の学習 (7): スター画像のフィルターを下げる

1 紹介

このセクションでは、画像データのロー スターおよびサブセット フィルター形状を示します。このフィルター形状により、0 次元連続グラフの初期時間として極小値または極大値を使用し、終点として鞍点を使用できます。必要なライブラリは次のとおりです。

import numpy as np
import matplotlib.pyplot as plt
import scipy
import PIL
from scipy import ndimage
from persim import plot_diagrams
from ripser import ripser, lower_star_img

フォローアップでは、画像上に 0 次元のロースター フィルター形状を構築する関数を定義します。これは疎距離行列を構築します。画像内の各ピクセルは頂点であり、各頂点は 8 つの空間隣接要素に接続されます。国境の場合を除きます。境界の重みは、それらが接続する 2 つのピクセル値の最大値であると見なされます (したがって、「低い星」)。

ピクセル数は多いですが、この関数の時間計算量は線形にピクセル数に近くなります。これは、ピクセル スケールの境界の数が有限であり、0 次元のホモトピーのみが計算されるためです。

2 ガウス スポット

これは、ガウス ブロブを含むイメージです。3 つの負のガウス分布が、-3、-2、および -1 で極小値を持つイメージに配置されます。

ts = np.linspace(-1, 1, 100)
x1 = np.exp(-ts**2/(0.1**2))
ts -= 0.4
x2 = np.exp(-ts**2/(0.1**2))
img = -x1[None, :]*x1[:, None] - 2*x1[None, :]*x2[:, None] - 3*x2[None, :]*x2[:, None]
plt.imshow(img)
plt.show()

出力は次のとおりです。

0 次元の継続グラフを取得します。

dgm = lower_star_img(img)

plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.imshow(img)
plt.colorbar()
plt.title("Test Image")
plt.subplot(122)
plot_diagrams(dgm)
plt.title("0-D Persistence Diagram")
plt.tight_layout()
plt.show()

出力は次のようになります。

この例では、グラフ内の 3 つの点が 3 つのガウス ブロブに対応し、最初はそれぞれが独自の最小値にあります。そのうちの 2 つは 0 付近で死亡し、サドル ポイントで他のクラスに出会います。一方、-3 のイニシャルは他のクラスを吸収し、「エルダー ルール」により永遠に存続します。

3 細胞生物学の画像

概略図は次のとおりです。

画像を [0,255] のグレースケール画像に変換すると、0 と 255 はそれぞれ暗い部分と明るい部分に対応します。セルの内部輝度が非常に高く、各セルが境界上の特定の値は、より近い の鞍点で出会います。

この場合、各セル内に局所的な最大値が大きく持続していると想定されます。つまり、超順序集合または昇順スター フィルタリングを実行します。極大値ではなく極大値に対してコードを機能させるには、下の星型フィルター関数に画像のネガを指定するだけです。

cells_original = (plt.imread("Cells.png") * 255).astype(np.uint8)
cells_grey = np.asarray(PIL.Image.fromarray(cells_original).convert('L'))

plt.subplot(121)
plt.title(cells_original.shape)
plt.imshow(cells_original)
plt.axis('off')
plt.subplot(122)
plt.title(cells_grey.shape)
plt.imshow(cells_grey, cmap='gray')
plt.axis('off')
plt.show()

出力は次のとおりです。0

次元の継続グラフを描画します。

dgm = lower_star_img(-cells_grey)

plt.figure(figsize=(6, 6))
plot_diagrams(dgm, lifetime=True)
plt.show()

出力は次のとおりです。

ポイントがセルに関連付けられていると見なされる持続性しきい値を選択します。

Ripser.py は現在、0 次元のホモトピー クラスの表現を返しませんが、各ピクセルに少量の一様なノイズを追加することでいくつかの回避策を実行できます。これにより、各ピクセルが一意の値を持つようになるため、探しているクラスの初期時間に等しい値を持つピクセルを簡単に見つけることができます。これを行う前に、局所平均化を実行して、最大値の表現をセルの中心に近づけます。

smoothed = ndimage.uniform_filter(cells_grey.astype(np.float64), size=10)
smoothed += 0.01 * np.random.randn(*smoothed.shape)

plt.figure(figsize=(10, 5))
plt.subplot(121)
im = plt.imshow(cells_grey, cmap='gray')
plt.colorbar(im, fraction=0.03)

plt.subplot(122)
im = plt.imshow(smoothed, cmap='gray')
plt.colorbar(im, fraction=0.03)

plt.tight_layout()
plt.show()

出力は次のとおりです。

0D 継続グラフを再度描画します。

dgm = lower_star_img(-smoothed)
plot_diagrams(dgm, lifetime=True)
plt.show()

出力は次のとおりです。

カットオフ ポイントを見て、寿命が 70 を超えるすべてのポイントを調べます。以下は、元の画像で強調表示された各 0D ピクセル表現を示しています。

thresh = 70
idxs = np.arange(dgm.shape[0])
idxs = idxs[np.abs(dgm[:, 1] - dgm[:, 0]) > thresh]

plt.figure(figsize=(8, 5))
plt.imshow(cells_original)

X, Y = np.meshgrid(np.arange(smoothed.shape[1]), np.arange(smoothed.shape[0]))
X = X.flatten()
Y = Y.flatten()
for idx in idxs:
    bidx = np.argmin(np.abs(smoothed + dgm[idx, 0]))
    plt.scatter(X[bidx], Y[bidx], 20, 'k')
plt.axis('off')

plt.show()

出力は次のとおりです。

おすすめ

転載: blog.csdn.net/weixin_44575152/article/details/129697238