备注
转到结尾 以下载完整示例代码。或者通过 Binder 在浏览器中运行此示例。
Blob 检测#
Blob 是图像中亮暗或暗亮区域。在这个例子中,Blob 使用3种算法进行检测。所使用的图像为哈勃极端深场。图像中的每个亮点都是一颗恒星或一个星系。
高斯拉普拉斯算子 (LoG)#
这是最准确但最慢的方法。它计算具有逐渐增加标准差的拉普拉斯高斯图像,并将它们堆叠在一个立方体中。斑点是这个立方体中的局部极大值。检测较大的斑点尤其较慢,因为在卷积过程中使用了较大的核大小。仅检测暗背景上的亮斑点。有关用法,请参见 skimage.feature.blob_log()
。
高斯差分 (DoG)#
这是LoG方法的一个更快的近似。在这种情况下,图像使用增加的标准差进行模糊处理,并且两个连续模糊图像之间的差异被堆叠在一个立方体中。这种方法与LoG方法在检测较大斑点时具有相同的缺点。斑点再次被假设为在暗背景上的亮斑点。参见 skimage.feature.blob_dog()
以了解用法。
Hessian 行列式 (DoH)#
这是最快的方法。它通过在图像的 Hessian 行列式的矩阵中找到极大值来检测斑点。检测速度与斑点的大小无关,因为内部实现使用的是盒形滤波器而不是卷积。亮在暗以及暗在亮的斑点都能被检测到。缺点是小的斑点(<3px)不能被准确检测。使用方法见 skimage.feature.blob_doh()
。
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 分钟 1.641 秒)