首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Matplotlib绘制二进制Numpy数组的边界

使用Matplotlib绘制二进制Numpy数组的边界
EN

Stack Overflow用户
提问于 2020-02-06 12:28:39
回答 1查看 743关注 0票数 3

我正在对一些图像使用图像分割,有时能够绘制分段的边界会很好。

我有一个用Matplotlib绘制的2D NumPy数组,我得到的最接近的是等值线绘制。这在数组中创建了角,但在其他方面是完美的。

Matplotlib的轮廓函数可以只绘制垂直/水平线吗,或者有其他方法可以做到这一点吗?

示例如下:

代码语言:javascript
运行
AI代码解释
复制
import matplotlib.pyplot as plt
import numpy as np


array = np.zeros((20, 20))
array[4:7, 3:8] = 1
array[4:7, 12:15] = 1
array[7:15, 7:15] = 1
array[12:14, 13:14] = 0

plt.imshow(array, cmap='binary')
plt.contour(array, levels=[0.5], colors='g')
plt.show()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-06 15:55:39

前段时间我写了一些函数来实现这一点,但我很高兴能想出如何能更快地完成它。

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection


def get_all_edges(bool_img):
    """
    Get a list of all edges (where the value changes from True to False) in the 2D boolean image.
    The returned array edges has he dimension (n, 2, 2).
    Edge i connects the pixels edges[i, 0, :] and edges[i, 1, :].
    Note that the indices of a pixel also denote the coordinates of its lower left corner.
    """
    edges = []
    ii, jj = np.nonzero(bool_img)
    for i, j in zip(ii, jj):
        # North
        if j == bool_img.shape[1]-1 or not bool_img[i, j+1]:
            edges.append(np.array([[i, j+1],
                                   [i+1, j+1]]))
        # East
        if i == bool_img.shape[0]-1 or not bool_img[i+1, j]:
            edges.append(np.array([[i+1, j],
                                   [i+1, j+1]]))
        # South
        if j == 0 or not bool_img[i, j-1]:
            edges.append(np.array([[i, j],
                                   [i+1, j]]))
        # West
        if i == 0 or not bool_img[i-1, j]:
            edges.append(np.array([[i, j],
                                   [i, j+1]]))

    if not edges:
        return np.zeros((0, 2, 2))
    else:
        return np.array(edges)


def close_loop_edges(edges):
    """
    Combine thee edges defined by 'get_all_edges' to closed loops around objects.
    If there are multiple disconnected objects a list of closed loops is returned.
    Note that it's expected that all the edges are part of exactly one loop (but not necessarily the same one).
    """

    loop_list = []
    while edges.size != 0:

        loop = [edges[0, 0], edges[0, 1]]  # Start with first edge
        edges = np.delete(edges, 0, axis=0)

        while edges.size != 0:
            # Get next edge (=edge with common node)
            ij = np.nonzero((edges == loop[-1]).all(axis=2))
            if ij[0].size > 0:
                i = ij[0][0]
                j = ij[1][0]
            else:
                loop.append(loop[0])
                # Uncomment to to make the start of the loop invisible when plotting
                # loop.append(loop[1])
                break

            loop.append(edges[i, (j + 1) % 2, :])
            edges = np.delete(edges, i, axis=0)

        loop_list.append(np.array(loop))

    return loop_list


def plot_outlines(bool_img, ax=None, **kwargs):
    if ax is None:
        ax = plt.gca()

    edges = get_all_edges(bool_img=bool_img)
    edges = edges - 0.5  # convert indices to coordinates; TODO adjust according to image extent
    outlines = close_loop_edges(edges=edges)
    cl = LineCollection(outlines, **kwargs)
    ax.add_collection(cl)


array = np.zeros((20, 20))
array[4:7, 3:8] = 1
array[4:7, 12:15] = 1
array[7:15, 7:15] = 1
array[12:14, 13:14] = 0

plt.figure()
plt.imshow(array, cmap='binary')
plot_outlines(array.T, lw=5, color='r')

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60095053

复制
相关文章
【Elasticsearch】RestAPI
ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:Elasticsearch Clients | Elastic
陶然同学
2023/10/14
1570
【Elasticsearch】RestAPI
rm: 无法删除"/mnt/cdrom/
[root@redhatAS6 home]# mount -o loop rhel-server-6.3-x86_64-dvd.iso /mnt/cdrom
py3study
2020/01/07
2.4K0
restapi(8)- restapi-sql:用户自主的服务
学习函数式编程初衷是看到自己熟悉的oop编程语言和sql数据库在现代商业社会中前景暗淡,准备完全放弃windows技术栈转到分布式大数据技术领域的。但是在现实中理想总是不如人意,本来想在一个规模较小的公司展展拳脚,以为小公司会少点历史包袱,有利于全面技术改造。但现实是:即使是小公司,一旦有个成熟的产品,那么进行全面的技术更新基本上是不可能的了,因为公司要生存,开发人员很难新旧技术之间随时切换。除非有狂热的热情,员工怠慢甚至抵制情绪不容易解决。只能采取逐步切换方式:保留原有产品的后期维护不动,新产品开发用一些新的技术。在我们这里的情况就是:以前一堆c#、sqlserver的东西必须保留,新的功能比如大数据、ai、识别等必须用新的手段如scala、python、dart、akka、kafka、cassandra、mongodb来开发。好了,新旧两个开发平台之间的软件系统对接又变成了一个问题。
用户1150956
2019/10/30
1.5K0
Elasticsearch常用的RESTAPI
GET方式 1.0 查询Elastic节点状态 curl -v 192.168.10.1:9200/_cat/health?v 1.1 初始化索引 # 在创建索引之前 对索引进行初始化操作,指定sha
Yuou
2022/09/26
2690
Kubernetes容器netns无法删除问题
近日摸鱼,出现问题 在k8s+containerd的环境上删除容器失败,容器一直保持在terminating状态containerd日子显示”failed to check network namespace closed: remove netns:unlinkat *: device or resource busy” ,不影响新创建的容器运行。
王先森sec
2023/04/24
2.3K1
解决kafka无法删除topic问题
使用kafka命令删除某个topic之后,查看集群的topic列表时,被删除的tpoic依然存在
全栈程序员站长
2022/11/03
1.7K0
解决kafka无法删除topic问题
Docker---(9)Docker中容器无法停止无法删除
问题:mysql容器如法停止,无法删除,也无法连接。docker stop,docker kill等命令都无效。
IT云清
2019/01/22
6.5K0
Flink Metrics监控与 RestApi
Flink 的 metrics 是 Flink 公开的一个度量系统,metrics 也可以暴露给外部系统,通过在 Flink 配置文件 conf/flink-conf.yaml 配置即可,Flink原生已经支持了很多reporter,如 JMX、InfluxDB、Prometheus 等等。
kk大数据
2021/07/09
4.2K0
Flink Metrics监控与 RestApi
git无法删除本地分支_git如何删除远程分支
转载:https://blog.csdn.net/benben_2015/article/details/79782202
全栈程序员站长
2022/11/07
2.2K0
网络服务—NFS
NFS(NetWork File Sysetem, 网络文件系统)它允许网络中的计算机之间通过TCP/IP网络共享资源的分布式存储系统,通常用来存储共享视频、图片等静态数据; NFS Server允许NFS Client将远端NFS Server的共享目录挂载到本地。在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
用户10048459
2022/09/19
1.8K0
EDB无法删除分区子表的错误
最近某个应用,连接的是EDB数据库,测试环境是EDB 9.2版本,在删除一张inherit方式创建的分区子表(例如主表a,子表b),先用alter table b no herit a删除关联,再drop删除子表,提示无法删除,从错误提示看,主表a要依赖子表b,建议删除主表a,达到删除子表b的效果。可我都删除了主子关系,为什么无法删表?
bisal
2019/02/28
1.7K0
Hue中无法删除用户异常分析
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.问题描述 ---- 在Hue中使用管理员安装了Solr的示例后,在用户管理界面无法正常删除用户,报如下异常: Processing exception: (1146, "Table 'hue.search_collection' doesn't exist"): Traceback (most recen
Fayson
2018/04/18
1.8K0
Hue中无法删除用户异常分析
k8s无法删除namespace
kubernetes 删除 namespace 但是一直处于 Terminating 状态
summerking
2022/10/27
9170
个推消息推送RestAPI版
1.权鉴获取Token /** * 个推获取权鉴Token * @return bool */ public static function getAuthToken() { require_once(__DIR__ . '/../../common/libs/requests/library/Requests.php'); \Requests::register_autoloader(); $headers
素描
2019/09/19
1.5K0
为Flask RestAPI集成Swagger UI
虽然这种事情已经做过好几遍了,但是不读文档还是没辙;我把这种半吊子形容为“我认识人民币,但是画不出来…T_T”
happy123.me
2019/12/30
2K0
Linux文件名乱码无法删除文件
2. 通过命令find . -inum xxxx -delete 删除文件
流柯
2022/03/08
14.2K0
Linux文件名乱码无法删除文件
Nodejs·网络服务
本章是从NodeJS拥有的模块角度,讲述了网络服务中的应用: net ----- > TCP dgram --> UDP http -----> HTTP https ----> HTTPS 从这四个模块的角度出发,讲述了网络在服务器中的应用。 从创建服务的服务器端和客户端角度,模拟发送和接收请求。 其中受益最大的应该是webSocket那章节,之前都没有听过这个协议,后来看了这本书,询问了下度娘,才知道: 这个协议是基于HTML5的新协议,它支持服务器端与客户端创建长连接,不需要多次进行
用户1154259
2018/01/17
6740
Nodejs·网络服务
Linux网络服务
按“G”到末行,按"O"在下一行插入:IPADD、NETMASK(子网掩码)、GETWAY
云计算小白
2019/10/09
1.8K0
delete archivelog all 无法彻底删除归档日志?
    最近在因归档日志暴增,使用delete archivelog all貌似无法清除所有的归档日志,到底是什么原因呢?
Leshami
2018/08/14
1.3K0
Docker Image 解决镜像无法删除的问题
Error response from daemon: conflict: unable to delete 4ac2d12f10cd (must be forced) - image is referenced in multiple repositories 来自守护进程的错误响应:冲突:无法删除4ac2d12f10cd(必须强制) - 映像在多个存储库中被引用 1.删除镜像 查看镜像 root@souyunku:~/mydocker# docker images REPOSITORY
程序员鹏磊
2018/02/09
4.8K1

相似问题

自动化Web测试服务器部署

13

Heroku :应用程序崩溃,部署了“surespot”web服务器

19

无服务器部署的环境变量不更新

14

在同一台服务器上部署多个web应用

61

nServicebus web服务器部署

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档