最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python數(shù)字圖像處理之骨架提取與分水嶺算法

 更新時間:2018年04月27日 09:21:01   作者:denny402  
這篇文章主要介紹了python數(shù)字圖像處理之骨架提取與分水嶺算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

1、骨架提取

骨架提取,也叫二值圖像細化。這種算法能將一個連通區(qū)域細化成一個像素的寬度,用于特征提取和目標拓撲表示。

morphology子模塊提供了兩個函數(shù)用于骨架提取,分別是Skeletonize()函數(shù)和medial_axis()函數(shù)。我們先來看Skeletonize()函數(shù)。

格式為:skimage.morphology.skeletonize(image)

輸入和輸出都是一幅二值圖像。

例1:

from skimage import morphology,draw
import numpy as np
import matplotlib.pyplot as plt

#創(chuàng)建一個二值圖像用于測試
image = np.zeros((400, 400))

#生成目標對象1(白色U型)
image[10:-10, 10:100] = 1
image[-100:-10, 10:-10] = 1
image[10:-10, -100:-10] = 1

#生成目標對象2(X型)
rs, cs = draw.line(250, 150, 10, 280)
for i in range(10):
 image[rs + i, cs] = 1
rs, 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**2
circle2 = (ic - 135)**2 + (ir - 150)**2 < 20**2
image[circle1] = 1
image[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,color
import matplotlib.pyplot as plt

image=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(image,mask=None,return_distance=False)

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

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

import numpy as np
import scipy.ndimage as ndi
from skimage import morphology
import 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 * skel

fig, (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、分水嶺算法

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

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

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

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

import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage import morphology,feature

#創(chuàng)建兩個帶有重疊圓的圖像
x, y = np.indices((80, 80))
x1, y1, x2, y2 = 28, 28, 44, 52
r1, r2 = 16, 20
mask_circle1 = (x - x1)**2 + (y - y1)**2 < r1**2
mask_circle2 = (x - x2)**2 + (y - y2)**2 < r2**2
image = 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 = axes

ax0.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 plt
from scipy import ndimage as ndi
from skimage import morphology,color,data,filter

image =color.rgb2gray(data.camera())
denoised = filter.rank.median(image, morphology.disk(2)) #過濾噪聲

#將梯度值低于10的作為開始標記點
markers = filter.rank.gradient(denoised, morphology.disk(5)) <10
markers = 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 = axes

ax0.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()

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Django項目如何給數(shù)據(jù)庫添加約束

    Django項目如何給數(shù)據(jù)庫添加約束

    這篇文章主要介紹了Django項目如何給數(shù)據(jù)庫添加約束,幫助大家更好的理解和學習使用Django框架,感興趣的朋友可以了解下
    2021-04-04
  • Python中BeautifuSoup庫的用法使用詳解

    Python中BeautifuSoup庫的用法使用詳解

    這篇文章主要介紹了Python中BeautifuSoup庫的用法使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • python實現(xiàn)Windows電腦定時關機

    python實現(xiàn)Windows電腦定時關機

    這篇文章主要為大家詳細介紹了python實現(xiàn)Windows電腦定時關機功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • python中的3種定義類方法

    python中的3種定義類方法

    這篇文章主要給大家分享得是 python中的3種定義類方法,分別是普通方法、類方法(@classmethod)以及類方法(@classmethod),想了解方法具體實現(xiàn)的小伙伴可以參考下面文章內(nèi)容哦,希望對你有所幫助
    2021-11-11
  • Python 詳解通過Scrapy框架實現(xiàn)爬取百度新冠疫情數(shù)據(jù)流程

    Python 詳解通過Scrapy框架實現(xiàn)爬取百度新冠疫情數(shù)據(jù)流程

    Scrapy是用純Python實現(xiàn)一個為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應用框架,用途非常廣泛,框架的力量,用戶只需要定制開發(fā)幾個模塊就可以輕松的實現(xiàn)一個爬蟲,用來抓取網(wǎng)頁內(nèi)容以及各種圖片,非常之方便
    2021-11-11
  • Python中的FTP通信模塊ftplib的用法整理

    Python中的FTP通信模塊ftplib的用法整理

    ftplib模塊中擁有FTP類,可以做到FTP協(xié)議下的各種上傳下載操作,以下就來看一下Python中的FTP通信模塊ftplib的用法整理:
    2016-07-07
  • 解決python2 繪圖title,xlabel,ylabel出現(xiàn)中文亂碼的問題

    解決python2 繪圖title,xlabel,ylabel出現(xiàn)中文亂碼的問題

    今天小編就為大家分享一篇解決python2 繪圖title,xlabel,ylabel出現(xiàn)中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python編程實現(xiàn)從字典中提取子集的方法分析

    Python編程實現(xiàn)從字典中提取子集的方法分析

    這篇文章主要介紹了Python編程實現(xiàn)從字典中提取子集的方法,結(jié)合實例形式對比分析了Python采用字典推導式與序列轉(zhuǎn)換實現(xiàn)字典提取子集的相關操作技巧與優(yōu)缺點,需要的朋友可以參考下
    2018-02-02
  • pymysql模塊的使用(增刪改查)詳解

    pymysql模塊的使用(增刪改查)詳解

    這篇文章主要介紹了pymysql模塊的使用(增刪改查)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Python簡單過濾字母和數(shù)字的方法小結(jié)

    Python簡單過濾字母和數(shù)字的方法小結(jié)

    這篇文章主要介紹了Python簡單過濾字母和數(shù)字的方法,涉及Python基于內(nèi)置函數(shù)與正則表達式進行字母和數(shù)字過濾的相關操作技巧,需要的朋友可以參考下
    2019-01-01

最新評論

军事| 昭苏县| 涪陵区| 昆山市| 资中县| 当雄县| 永靖县| 丰县| 诏安县| 临清市| 乌鲁木齐县| 武平县| 台州市| 汪清县| 涿鹿县| 深泽县| 白河县| 景宁| 三都| 东港市| 龙江县| 都兰县| 轮台县| 定州市| 琼海市| 金堂县| 黄浦区| 大理市| 沁阳市| 铅山县| 巴楚县| 丰城市| 尉犁县| 上高县| 莎车县| 宜丰县| 定边县| 潼南县| 且末县| 青浦区| 临澧县|