骨架提取與分水嶺算法也屬于形態(tài)學處理范疇,都放在morphology子模塊內。
1、骨架提取
骨架提取,也叫二值圖像細化。這種算法能將一個連通區(qū)域細化成一個像素的寬度,用于特征提取和目標拓撲表示。
morphology子模塊提供了兩個函數(shù)用于骨架提取,分別是Skeletonize()函數(shù)和medial_axis()函數(shù)。我們先來看Skeletonize()函數(shù)。
格式為:skimage.morphology.skeletonize(image)
輸入和輸出都是一幅二值圖像。
例1:
from skimage import morphology,drawimport numpy as npimport matplotlib.pyplot as plt#創(chuàng)建一個二值圖像用于測試image = np.zeros((400, 400))#生成目標對象1(白色U型)image[10:-10, 10:100] = 1image[-100:-10, 10:-10] = 1image[10:-10, -100:-10] = 1#生成目標對象2(X型)rs, cs = draw.line(250, 150, 10, 280)for i in range(10): image[rs + i, cs] = 1rs, cs = draw.line(10, 150, 250, 280)for i in range(20): image[rs + i, cs] = 1#生成目標對象3(O型)ir, ic = np.indices(image.shape)circle1 = (ic - 135)**2 + (ir - 150)**2 < 30**2circle2 = (ic - 135)**2 + (ir - 150)**2 < 20**2image[circle1] = 1image[circle2] = 0#實施骨架算法skeleton =morphology.skeletonize(image)#顯示結果fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))ax1.imshow(image, cmap=plt.cm.gray)ax1.axis('off')ax1.set_title('original', fontsize=20)ax2.imshow(skeleton, cmap=plt.cm.gray)ax2.axis('off')ax2.set_title('skeleton', fontsize=20)fig.tight_layout()plt.show()生成一幅測試圖像,上面有三個目標對象,分別進行骨架提取,結果如下:

例2:利用系統(tǒng)自帶的馬圖片進行骨架提取
from skimage import morphology,data,colorimport matplotlib.pyplot as pltimage=color.rgb2gray(data.horse())image=1-image #反相#實施骨架算法skeleton =morphology.skeletonize(image)#顯示結果fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))ax1.imshow(image, cmap=plt.cm.gray)ax1.axis('off')ax1.set_title('original', fontsize=20)ax2.imshow(skeleton, cmap=plt.cm.gray)ax2.axis('off')ax2.set_title('skeleton', fontsize=20)fig.tight_layout()plt.show()
medial_axis就是中軸的意思,利用中軸變換方法計算前景(1值)目標對象的寬度,格式為:
skimage.morphology.medial_axis(image,mask=None,return_distance=False)
mask: 掩模。默認為None, 如果給定一個掩模,則在掩模內的像素值才執(zhí)行骨架算法。
return_distance: bool型值,默認為False. 如果為True, 則除了返回骨架,還將距離變換值也同時返回。這里的距離指的是中軸線上的所有點與背景點的距離。
新聞熱點
疑難解答