Python标记数组的连通域

news/2024/11/18 1:30:52/

文章目录

    • 连通域标记
    • structure参数
    • 操作连通域
    • 定位连通域

连通域标记

通过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]]
--------
'''

http://www.ppmy.cn/news/46153.html

相关文章

王道计组(23版)1_计算机系统概述

1.计算机发展历程 硬件的发展: 电子管、晶体管、中小规模集成电路、超大规模集成电路 摩尔定律: 价格不变时,每18个月,集成电路可容纳的晶体管数量和性能增加一倍 微型计算机的发展以微处理器技术为标志 计算机体系结构&#xf…

信息系统项目管理师-项目干系人管理

1.过程 1.1 识别干系人 定期识别项目干系人,分析和记录他们的利益、参与度、相互依赖性、影响力和对项目成功的潜在影响力的过程。 1.2 规划干系人参与 根据干系人的期望、需求、利益和对项目潜在的影响,制定项目干系人参与项目的方法的过程。 1.3 管理干…

适配器详解

目录 1、适配器简介 2、函数对象适配器 ​编辑 3、函数指针作为适配器 ptr_fun ​编辑 4、类中的成员函数作为适配器 mem_fun_ref 5、取反适配器 5.1、not1 一元取反适配器 ​编辑 5.2、not2 二元取反适配器 1、适配器简介 适配器 为算法 提供接口 目前的适配器最多能…

spring redis Sentinel 哨兵 原理

客户端选择 redis 常用的连接客户端 有三个 Jedis:是老牌的Redis的Java实现客户端,提供了比较全面的Redis命令的支持,Redisson:实现了分布式和可扩展的Java数据结构。Lettuce:高级Redis客户端,用于线程安…

Socks5代理与HTTP代理:基本概念、工作原理和在网络应用中的应用

在互联网上,代理服务器是一种非常重要的技术手段,可以实现许多网络应用的高效和安全运行。Socks5代理和HTTP代理是两种常见的代理服务器类型,它们在网络应用中都有着重要的作用。本文将介绍Socks5代理和HTTP代理的基本概念、工作原理以及在网…

代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零

代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零 1049. 最后一块石头的重量 II题目代码 494. 目标和题目代码 474.一和零题目代码 1049. 最后一块石头的重量 II 题目 1049. 最后一块石头的重量 II 有一堆石头,用整数数组…

程序员跳槽,要求涨薪50%过分吗?

如果问在TI行业涨工资最快的方式是什么? 回答最多的一定是:跳槽! 前段时间,知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 ,有网友提问 “程序员跳槽要求涨薪50%过分吗?” 截图来源于知乎,…

做gl demo谨慎打开面剔除功能,否则容易干扰测试,没有错的情况下什么都不显示

关于何为面剔除,很多博主已经介绍得很清晰了,就不重复介绍了(我懒): OpenGL基础32:面剔除_Jaihk662的博客-CSDN博客 其实面剔除对于有效减少渲染时看不到的面消耗的算力很有帮助,但在程序还没…