Python实现标记数组的连通域

 更新时间:2023年04月20日 10:57:23   作者:微小冷  
这篇文章主要为大家详细介绍了如何通过Python实现标记数组的连通域,文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下

连通域标记

通过label函数,可以对数组中的连通区域进行标注,效果如下

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是一个二值矩阵,经过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参数

在label函数中,还有一个用于规范何为“连通”的参数,即structure,其数据类型为二值数组,其维度与输入的input相同。

在上面的示例中,连通域1,3,4尽管没有上下左右的联系,但在对角线上是有交集的,通过调整structure参数,可以提供一种将这三个区域连在一起的连通域方案。

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函数,其功能大致相当于[func(input[labels == i]) for i in index],即从已经做好连。通域标记的数组中,取出序号为index所在区域的值,参数如下

labeled_comprehension(input, labels, index, func, out_dtype, default, pass_positions=False)

其中input为输入数组;labels是已经做好的连通域标记;index为将要挑选进行操作的连通域序号;func为具体的操作函数;out_dtype为输出数据类型;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的区域,分别有3,2,1,1个元素,而且所有元素都是1,所以求和之后的值为[3, 2, 1, 1]。

定位连通域

scipy.ndimage中的find_objects函数可以返回连通域的切片范围。

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)
''''

如果根据这个对原数组进行切片,就可以得到其对应的标记区域

for x,y in axis:
    print(labels[x,y])
    print("--------")
'''
[[1 1]
 [0 1]]
--------
[[2 2]]
--------
[[3]]
--------
[[4]]
--------
'''

到此这篇关于Python实现标记数组的连通域的文章就介绍到这了,更多相关Python标记数组连通域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你如何将 Sublime 3 打造成 Python/Django IDE开发利器

    教你如何将 Sublime 3 打造成 Python/Django IDE开发利器

    Sublime Text 是一款非常强大的文本编辑器, 下面我们介绍如何将 Sublime Text 3 打造成一款 Python/Django 开发利器:
    2014-07-07
  • Python的装饰器用法学习笔记

    Python的装饰器用法学习笔记

    这篇文章主要介绍了Python的装饰器用法学习笔记,装饰器的使用是Python编程中的高级技巧,需要的朋友可以参考下
    2016-06-06
  • pytorch中[..., 0]的用法说明

    pytorch中[..., 0]的用法说明

    这篇文章主要介绍了pytorch中[..., 0]的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python 中如何写注释

    Python 中如何写注释

    这篇文章主要介绍了如何在 Python 中注释,帮助其他开发者理解你的代码,以及代码的目的。感兴趣的朋友可以了解下
    2020-08-08
  • 对Python 除法负数取商的取整方式详解

    对Python 除法负数取商的取整方式详解

    今天小编就为大家分享一篇对Python 除法负数取商的取整方式详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python画图系列之个性化显示x轴区段文字的实例

    python画图系列之个性化显示x轴区段文字的实例

    今天小编就为大家分享一篇python画图系列之个性化显示x轴区段文字的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 使用Tensorboard工具查看Loss损失率

    使用Tensorboard工具查看Loss损失率

    今天小编就为大家分享一篇使用Tensorboard工具查看Loss损失率,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python数据处理之导入导出Excel数据方式

    Python数据处理之导入导出Excel数据方式

    Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂的分析和可视化,Python都能提供强大的支持,文章还介绍了如何编写脚本实现自动化处理,并探讨了与其他工具的跨界合作,以提升整体效率
    2025-01-01
  • Python3实现将文件归档到zip文件及从zip文件中读取数据的方法

    Python3实现将文件归档到zip文件及从zip文件中读取数据的方法

    这篇文章主要介绍了Python3实现将文件归档到zip文件及从zip文件中读取数据的方法,涉及Python针对zip文件操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • python多进程操作实例

    python多进程操作实例

    这篇文章主要介绍了python多进程操作实例,本文讲解了multiprocessing类的相关方法,然后给出了一个综合实例和运行效果,需要的朋友可以参考下
    2014-11-11

最新评论