Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域
連通域標(biāo)記
通過(guò)label函數(shù),可以對(duì)數(shù)組中的連通區(qū)域進(jìn)行標(biāo)注,效果如下
from scipy.ndimage import label import numpy as np a = np.array([[0,0,1,1,0,0], [0,0,0,1,0,0], [1,1,0,0,1,0], [0,0,0,1,0,0]]) labels, N = label(a) print(labels) ''' [[0 0 1 1 0 0] [0 0 0 1 0 0] [2 2 0 0 3 0] [0 0 0 4 0 0]] ''' print(N) 4
其中,a
是一個(gè)二值矩陣,經(jīng)過(guò)label
標(biāo)記后,其相連通的部分分別被標(biāo)上了序號(hào)??梢愿庇^地用圖像顯示一下
import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(121) plt.imshow(a) ax = fig.add_subplot(122) plt.imshow(labels) plt.show()
structure參數(shù)
在label函數(shù)中,還有一個(gè)用于規(guī)范何為“連通”的參數(shù),即structure,其數(shù)據(jù)類型為二值數(shù)組,其維度與輸入的input相同。
在上面的示例中,連通域1,3,4盡管沒有上下左右的聯(lián)系,但在對(duì)角線上是有交集的,通過(guò)調(diào)整structure參數(shù),可以提供一種將這三個(gè)區(qū)域連在一起的連通域方案。
stru = np.ones([3,3]) bLab, bN = label(a, stru) print(bLab) ‘'‘ [[0 0 1 1 0 0] [0 0 0 1 0 0] [2 2 0 0 1 0] [0 0 0 1 0 0]] '‘'
可見,這次只選出了兩組連通域。
操作連通域
scipy.ndimage提供了labeled_comprehension函數(shù),其功能大致相當(dāng)于[func(input[labels == i]) for i in index],即從已經(jīng)做好連。通域標(biāo)記的數(shù)組中,取出序號(hào)為index所在區(qū)域的值,參數(shù)如下
labeled_comprehension(input, labels, index, func, out_dtype, default, pass_positions=False)
其中input為輸入數(shù)組;labels是已經(jīng)做好的連通域標(biāo)記;index為將要挑選進(jìn)行操作的連通域序號(hào);func為具體的操作函數(shù);out_dtype為輸出數(shù)據(jù)類型;default表示,當(dāng)index不存在于連通域標(biāo)記中時(shí)的輸出值,下面做一個(gè)示例
from scipy.ndimage import labeled_comprehension labeled_comprehension(a, labels, [1,2,3,4], sum, int, 0) # array([3, 2, 1, 1])
連通域序號(hào)為1,2,3,4的區(qū)域,分別有3,2,1,1個(gè)元素,而且所有元素都是1,所以求和之后的值為[3, 2, 1, 1]。
定位連通域
scipy.ndimage中的find_objects函數(shù)可以返回連通域的切片范圍。
from scipy.ndimage import find_objects axis = find_objects(labels) for x,y in axis: print(x, y) ''' slice(0, 2, None) slice(2, 4, None) slice(2, 3, None) slice(0, 2, None) slice(2, 3, None) slice(4, 5, None) slice(3, 4, None) slice(3, 4, None) ''''
如果根據(jù)這個(gè)對(duì)原數(shù)組進(jìn)行切片,就可以得到其對(duì)應(yīng)的標(biāo)記區(qū)域
for x,y in axis: print(labels[x,y]) print("--------") ''' [[1 1] [0 1]] -------- [[2 2]] -------- [[3]] -------- [[4]] -------- '''
到此這篇關(guān)于Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域的文章就介紹到這了,更多相關(guān)Python標(biāo)記數(shù)組連通域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用pycharm開發(fā)django項(xiàng)目示例代碼
這篇文章主要介紹了用pycharm開發(fā)django項(xiàng)目示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06python如何實(shí)現(xiàn)常用的五種排序算法詳解
排序有很多種實(shí)現(xiàn)方法,比如冒泡排序、選擇排序、歸并排序、希爾排序、快速排序、插入排序、堆排序、基數(shù)排序等,這篇文章主要給大家介紹了關(guān)于python如何實(shí)現(xiàn)常用的五種排序算法,需要的朋友可以參考下2021-08-08Python實(shí)現(xiàn)將Markdown文檔轉(zhuǎn)為EPUB電子書文件
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)將Markdown文檔轉(zhuǎn)為EPUB電子書文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06淺談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)
下面小編就為大家?guī)?lái)一篇淺談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)。2017-09-09Python編程實(shí)現(xiàn)下載器自動(dòng)爬取采集B站彈幕示例
這篇文章主要介紹了使用Python編程來(lái)實(shí)現(xiàn)一個(gè)下載器可以自動(dòng)爬取采集B站彈幕的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10使用Python實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音并播放功能
這篇文章主要給大家介紹了使用Python實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音并播放功能,文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01GPU排隊(duì)腳本實(shí)現(xiàn)空閑觸發(fā)python腳本實(shí)現(xiàn)示例
有的服務(wù)器是多用戶使用,GPU的資源常常被占據(jù)著,很可能在夜間GPU空閑了,但來(lái)不及運(yùn)行自己的腳本。如果沒有和別人共享服務(wù)器的話,自己的多個(gè)程序想排隊(duì)使用GPU,也可以用這個(gè)腳本2021-11-11python散點(diǎn)圖雙軸設(shè)置坐標(biāo)軸刻度的實(shí)現(xiàn)
散點(diǎn)圖是一種常用的圖表類型,可以用來(lái)展示兩個(gè)變量之間的關(guān)系,本文主要介紹了python散點(diǎn)圖雙軸設(shè)置坐標(biāo)軸刻度的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01