Python實現(xiàn)標記數(shù)組的連通域
連通域標記
通過label函數(shù),可以對數(shù)組中的連通區(qū)域進行標注,效果如下
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是一個二值矩陣,經(jīng)過label標記后,其相連通的部分分別被標上了序號??梢愿庇^地用圖像顯示一下
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ù)中,還有一個用于規(guī)范何為“連通”的參數(shù),即structure,其數(shù)據(jù)類型為二值數(shù)組,其維度與輸入的input相同。
在上面的示例中,連通域1,3,4盡管沒有上下左右的聯(lián)系,但在對角線上是有交集的,通過調(diào)整structure參數(shù),可以提供一種將這三個區(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ù),其功能大致相當于[func(input[labels == i]) for i in index],即從已經(jīng)做好連。通域標記的數(shù)組中,取出序號為index所在區(qū)域的值,參數(shù)如下
labeled_comprehension(input, labels, index, func, out_dtype, default, pass_positions=False)
其中input為輸入數(shù)組;labels是已經(jīng)做好的連通域標記;index為將要挑選進行操作的連通域序號;func為具體的操作函數(shù);out_dtype為輸出數(shù)據(jù)類型;default表示,當index不存在于連通域標記中時的輸出值,下面做一個示例
from scipy.ndimage import labeled_comprehension labeled_comprehension(a, labels, [1,2,3,4], sum, int, 0) # array([3, 2, 1, 1])
連通域序號為1,2,3,4的區(qū)域,分別有3,2,1,1個元素,而且所有元素都是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ù)這個對原數(shù)組進行切片,就可以得到其對應(yīng)的標記區(qū)域
for x,y in axis:
print(labels[x,y])
print("--------")
'''
[[1 1]
[0 1]]
--------
[[2 2]]
--------
[[3]]
--------
[[4]]
--------
'''
到此這篇關(guān)于Python實現(xiàn)標記數(shù)組的連通域的文章就介紹到這了,更多相關(guān)Python標記數(shù)組連通域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你如何將 Sublime 3 打造成 Python/Django IDE開發(fā)利器
Sublime Text 是一款非常強大的文本編輯器, 下面我們介紹如何將 Sublime Text 3 打造成一款 Python/Django 開發(fā)利器:2014-07-07
Python數(shù)據(jù)處理之導(dǎo)入導(dǎo)出Excel數(shù)據(jù)方式
Python是Excel數(shù)據(jù)處理的絕佳工具,通過Pandas和Openpyxl等庫可以實現(xiàn)數(shù)據(jù)的導(dǎo)入、導(dǎo)出和自動化處理,從基礎(chǔ)的數(shù)據(jù)讀取和清洗到復(fù)雜的分析和可視化,Python都能提供強大的支持,文章還介紹了如何編寫腳本實現(xiàn)自動化處理,并探討了與其他工具的跨界合作,以提升整體效率2025-01-01
Python3實現(xiàn)將文件歸檔到zip文件及從zip文件中讀取數(shù)據(jù)的方法
這篇文章主要介紹了Python3實現(xiàn)將文件歸檔到zip文件及從zip文件中讀取數(shù)據(jù)的方法,涉及Python針對zip文件操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05

