中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
python數(shù)字圖像處理(19):骨架提取與分水嶺算法

骨架提取與分水嶺算法也屬于形態(tài)學(xué)處理范疇,都放在morphology子模塊內(nèi)。

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)#顯示結(jié)果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()

生成一幅測試圖像,上面有三個目標對象,分別進行骨架提取,結(jié)果如下:

例2:利用系統(tǒng)自帶的馬圖片進行骨架提取

from skimage import morphology,data,colorimport matplotlib.pyplot as pltimage=color.rgb2gray(data.horse())image=1-image #反相#實施骨架算法skeleton =morphology.skeletonize(image)#顯示結(jié)果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(imagemask=Nonereturn_distance=False)

mask: 掩模。默認為None, 如果給定一個掩模,則在掩模內(nèi)的像素值才執(zhí)行骨架算法。

return_distance: bool型值,默認為False. 如果為True, 則除了返回骨架,還將距離變換值也同時返回。這里的距離指的是中軸線上的所有點與背景點的距離。

import numpy as npimport scipy.ndimage as ndifrom skimage import morphologyimport matplotlib.pyplot as plt#編寫一個函數(shù),生成測試圖像def microstructure(l=256):    n = 5    x, y = np.ogrid[0:l, 0:l]    mask = np.zeros((l, l))    generator = np.random.RandomState(1)    points = l * generator.rand(2, n**2)    mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1    mask = ndi.gaussian_filter(mask, sigma=l/(4.*n))    return mask > mask.mean()data = microstructure(l=64) #生成測試圖像#計算中軸和距離變換值skel, distance =morphology.medial_axis(data, return_distance=True)#中軸上的點到背景像素點的距離dist_on_skel = distance * skelfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))ax1.imshow(data, cmap=plt.cm.gray, interpolation='nearest')#用光譜色顯示中軸ax2.imshow(dist_on_skel, cmap=plt.cm.spectral, interpolation='nearest')ax2.contour(data, [0.5], colors='w')  #顯示輪廓線fig.tight_layout()plt.show()

2、分水嶺算法

分水嶺在地理學(xué)上就是指一個山脊,水通常會沿著山脊的兩邊流向不同的“匯水盆”。分水嶺算法是一種用于圖像分割的經(jīng)典算法,是基于拓撲理論的數(shù)學(xué)形態(tài)學(xué)的分割方法。如果圖像中的目標物體是連在一起的,則分割起來會更困難,分水嶺算法經(jīng)常用于處理這類問題,通常會取得比較好的效果。

分水嶺算法可以和距離變換結(jié)合,尋找“匯水盆地”和“分水嶺界限”,從而對圖像進行分割。二值圖像的距離變換就是每一個像素點到最近非零值像素點的距離,我們可以使用scipy包來計算距離變換。

在下面的例子中,需要將兩個重疊的圓分開。我們先計算圓上的這些白色像素點到黑色背景像素點的距離變換,選出距離變換中的最大值作為初始標記點(如果是反色的話,則是取最小值),從這些標記點開始的兩個匯水盆越集越大,最后相交于分山嶺。從分山嶺處斷開,我們就得到了兩個分離的圓。

例1:基于距離變換的分山嶺圖像分割

import numpy as npimport matplotlib.pyplot as pltfrom scipy import ndimage as ndifrom skimage import morphology,feature#創(chuàng)建兩個帶有重疊圓的圖像x, y = np.indices((80, 80))x1, y1, x2, y2 = 28, 28, 44, 52r1, r2 = 16, 20mask_circle1 = (x - x1)**2 + (y - y1)**2 < r1**2mask_circle2 = (x - x2)**2 + (y - y2)**2 < r2**2image = np.logical_or(mask_circle1, mask_circle2)#現(xiàn)在我們用分水嶺算法分離兩個圓distance = ndi.distance_transform_edt(image) #距離變換local_maxi =feature.peak_local_max(distance, indices=False, footprint=np.ones((3, 3)),                            labels=image)   #尋找峰值markers = ndi.label(local_maxi)[0] #初始標記點labels =morphology.watershed(-distance, markers, mask=image) #基于距離變換的分水嶺算法fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))axes = axes.ravel()ax0, ax1, ax2, ax3 = axesax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')ax0.set_title("Original")ax1.imshow(-distance, cmap=plt.cm.jet, interpolation='nearest')ax1.set_title("Distance")ax2.imshow(markers, cmap=plt.cm.spectral, interpolation='nearest')ax2.set_title("Markers")ax3.imshow(labels, cmap=plt.cm.spectral, interpolation='nearest')ax3.set_title("Segmented")for ax in axes:    ax.axis('off')fig.tight_layout()plt.show()

分水嶺算法也可以和梯度相結(jié)合,來實現(xiàn)圖像分割。一般梯度圖像在邊緣處有較高的像素值,而在其它地方則有較低的像素值,理想情況 下,分山嶺恰好在邊緣。因此,我們可以根據(jù)梯度來尋找分山嶺。

例2:基于梯度的分水嶺圖像分割

import matplotlib.pyplot as pltfrom scipy import ndimage as ndifrom skimage import morphology,color,data,filterimage =color.rgb2gray(data.camera())denoised = filter.rank.median(image, morphology.disk(2)) #過濾噪聲#將梯度值低于10的作為開始標記點markers = filter.rank.gradient(denoised, morphology.disk(5)) <10markers = ndi.label(markers)[0]gradient = filter.rank.gradient(denoised, morphology.disk(2)) #計算梯度labels =morphology.watershed(gradient, markers, mask=image) #基于梯度的分水嶺算法fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(6, 6))axes = axes.ravel()ax0, ax1, ax2, ax3 = axesax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')ax0.set_title("Original")ax1.imshow(gradient, cmap=plt.cm.spectral, interpolation='nearest')ax1.set_title("Gradient")ax2.imshow(markers, cmap=plt.cm.spectral, interpolation='nearest')ax2.set_title("Markers")ax3.imshow(labels, cmap=plt.cm.spectral, interpolation='nearest')ax3.set_title("Segmented")for ax in axes:    ax.axis('off')fig.tight_layout()plt.show()

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
使用 Python 的基于邊緣和基于區(qū)域的分割
生命科學(xué)中的 UMAP(降維算法)
【Matplotlib】繪圖常見設(shè)置說明
Python Matplotlib 繪圖使用指南(附代碼)
Python的圖像處理
干貨 | 用Python做圖像處理:圖像導(dǎo)數(shù)實戰(zhàn)
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服