Python: scikit-image Blob detection

这个用例主要介绍利用三种算法对含有blob的图像进行检測。blob 或者叫斑点,就是在一幅图像上,暗背景上的亮区域。或者亮背景上的暗区域,都可以称为blob。python

主要利用blob与背景之间的对照度来进行检測。算法

这个用例介绍了三种算法; markdown

Laplacian of Gaussian (LoG)
这是速度最慢,但是最准确的一种算法。简单来讲,就是对一幅图先进行一系列不一样尺度的高斯滤波,而后对滤波后的图像作Laplacian运算。将所有的图像进行叠加。局部最大值就是所要检測的blob,这个算法对于大的blob检測会很是慢,还有就是该算法适合于检測暗背景下的亮blob。post

Difference of Gaussian (DoG)
这是LoG算法的一种高速近似,对图像进行高斯滤波以后,不作Laplacian运算,直接作减法。相减后的图作叠加。找到局部最大值,这个算法的缺陷与LoG类似。spa

Determinant of Hessian (DoH)
这是最快的一种算法,不需要作多尺度的高斯滤波,运算速度天然提高很是多,这个算法对暗背景上的亮blob或者亮背景上的暗blob都能检測。rest

缺点是小尺寸的blob检測不许确。code

P.S. LoG 和 DoG 假设想检測亮背景上的暗blob,可以将图像作反相,这样亮背景就变成了暗背景,而暗blob就变成了亮blob,而后就可以用这两个算法了,检測完以后再反回来就行了。图片

from matplotlib import pyplot as plt
from skimage import data
from skimage.feature import blob_dog, blob_log, blob_doh
from math import sqrt
from skimage.color import rgb2gray

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

plt.imshow(image)

blobs_log = blob_log(image_gray, max_sigma=30, num_sigma=10, threshold=.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=.1)
blobs_dog[:, 2] = blobs_dog[:, 2] * sqrt(2)

blobs_doh = blob_doh(image_gray, max_sigma=30, threshold=.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, sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'})
axes = axes.ravel()
for blobs, color, title in sequence:
    ax = axes[0]
    axes = axes[1:]
    ax.set_title(title)
    ax.imshow(image, interpolation='nearest')
    for blob in blobs:
        y, x, r = blob
        c = plt.Circle((x, y), r, color=color, linewidth=2, fill=False)
        ax.add_patch(c)

plt.show()

參考来源: http://scikit-image.org/docs/dev/auto_examples/ip

原图:ci

这里写图片描写叙述

效果图:

这里写图片描写叙述

相关文章
相关标签/搜索