Blob検出#

Blobは、画像内の暗い領域または明るい領域で明るく表示される領域、または明るい領域で暗く表示される領域です。この例では、3つのアルゴリズムを使用してBlobを検出します。この場合に使用される画像は、ハッブル超深宇宙です。画像内の各明るい点は、恒星または銀河です。

ガウシアンのラプラシアン(LoG)#

これは最も正確で最も遅いアプローチです。標準偏差が連続的に増加するガウシアン画像のラプラシアンを計算し、それらをキューブに積み重ねます。Blobはこのキューブ内の局所的な最大値です。畳み込み中のカーネルサイズが大きいため、より大きなBlobの検出は特に遅くなります。暗い背景上の明るいBlobのみが検出されます。使用法については、skimage.feature.blob_log()を参照してください。

ガウシアンの差分(DoG)#

これは、LoGアプローチの高速近似です。この場合、画像は標準偏差が増加してぼかされ、連続してぼかされた2つの画像間の差がキューブに積み重ねられます。この方法は、より大きなBlobを検出するためのLoGアプローチと同じ欠点があります。Blobは再び、暗い部分に対して明るい部分であると想定されます。使用法については、skimage.feature.blob_dog()を参照してください。

ヘッセ行列の行列式(DoH)#

これは最速のアプローチです。画像のヘッセ行列の行列式において最大値を検出することによりBlobを検出します。内部実装では畳み込みの代わりにボックスフィルターを使用しているため、検出速度はBlobのサイズに依存しません。暗い部分に対して明るい部分と、明るい部分に対して暗い部分の両方のBlobが検出されます。欠点は、小さなBlob(<3px)が正確に検出されないことです。使用法については、skimage.feature.blob_doh()を参照してください。

Laplacian of Gaussian, Difference of Gaussian, Determinant of Hessian
from math import sqrt
from skimage import data
from skimage.feature import blob_dog, blob_log, blob_doh
from skimage.color import rgb2gray

import matplotlib.pyplot as plt


image = data.hubble_deep_field()[0:500, 0:500]
image_gray = rgb2gray(image)

blobs_log = blob_log(image_gray, max_sigma=30, num_sigma=10, threshold=0.1)

# Compute radii in the 3rd column.
blobs_log[:, 2] = blobs_log[:, 2] * sqrt(2)

blobs_dog = blob_dog(image_gray, max_sigma=30, threshold=0.1)
blobs_dog[:, 2] = blobs_dog[:, 2] * sqrt(2)

blobs_doh = blob_doh(image_gray, max_sigma=30, threshold=0.01)

blobs_list = [blobs_log, blobs_dog, blobs_doh]
colors = ['yellow', 'lime', 'red']
titles = ['Laplacian of Gaussian', 'Difference of Gaussian', 'Determinant of Hessian']
sequence = zip(blobs_list, colors, titles)

fig, axes = plt.subplots(1, 3, figsize=(9, 3), sharex=True, sharey=True)
ax = axes.ravel()

for idx, (blobs, color, title) in enumerate(sequence):
    ax[idx].set_title(title)
    ax[idx].imshow(image)
    for blob in blobs:
        y, x, r = blob
        c = plt.Circle((x, y), r, color=color, linewidth=2, fill=False)
        ax[idx].add_patch(c)
    ax[idx].set_axis_off()

plt.tight_layout()
plt.show()

スクリプトの総実行時間:(0分5.736秒)

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