這個用例主要介紹利用三種算法對含有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
效果圖: