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标记数组连通域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python的Urllib库的基本使用教程

    Python的Urllib库的基本使用教程

    这篇文章主要介绍了Python的Urllib库的基本使用教程,是用Python编写爬虫的必备知识,需要的朋友可以参考下
    2015-04-04
  • 用pycharm开发django项目示例代码

    用pycharm开发django项目示例代码

    这篇文章主要介绍了用pycharm开发django项目示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python如何实现常用的五种排序算法详解

    python如何实现常用的五种排序算法详解

    排序有很多种实现方法,比如冒泡排序、选择排序、归并排序、希尔排序、快速排序、插入排序、堆排序、基数排序等,这篇文章主要给大家介绍了关于python如何实现常用的五种排序算法,需要的朋友可以参考下
    2021-08-08
  • Python实现将Markdown文档转为EPUB电子书文件

    Python实现将Markdown文档转为EPUB电子书文件

    这篇文章主要为大家详细介绍了Python如何实现将Markdown文档转为EPUB电子书文件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • 浅谈python for循环的巧妙运用(迭代、列表生成式)

    浅谈python for循环的巧妙运用(迭代、列表生成式)

    下面小编就为大家带来一篇浅谈python for循环的巧妙运用(迭代、列表生成式)。
    2017-09-09
  • Python编程实现下载器自动爬取采集B站弹幕示例

    Python编程实现下载器自动爬取采集B站弹幕示例

    这篇文章主要介绍了使用Python编程来实现一个下载器可以自动爬取采集B站弹幕的示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • 使用Python实现文字转语音并播放功能

    使用Python实现文字转语音并播放功能

    这篇文章主要给大家介绍了使用Python实现文字转语音并播放功能,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • 浅谈python的深浅拷贝以及fromkeys的用法

    浅谈python的深浅拷贝以及fromkeys的用法

    这篇文章主要介绍了python的深浅拷贝以及fromkeys的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • GPU排队脚本实现空闲触发python脚本实现示例

    GPU排队脚本实现空闲触发python脚本实现示例

    有的服务器是多用户使用,GPU的资源常常被占据着,很可能在夜间GPU空闲了,但来不及运行自己的脚本。如果没有和别人共享服务器的话,自己的多个程序想排队使用GPU,也可以用这个脚本
    2021-11-11
  • python散点图双轴设置坐标轴刻度的实现

    python散点图双轴设置坐标轴刻度的实现

    散点图是一种常用的图表类型,可以用来展示两个变量之间的关系,本文主要介绍了python散点图双轴设置坐标轴刻度的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论