语义分割结果可视化(原图+语义掩码+图例)

news2025/7/9 19:37:06

语义分割结果可视化(原图+语义掩码+图例)

由于实习工作需要把语义分割结果可视化出来,要使用自定义颜色来区分不同的label,并绘制出图例并插入在图像右端。本文将介绍如何实现这样的语义分割结果图。

文章目录

  • 语义分割结果可视化(原图+语义掩码+图例)
    • 1 确定不同Label的RGB颜色
    • 2 生成语义图和mask边缘图
    • 3 合并语义图+原图+边缘
    • 4 绘制图例

1 确定不同Label的RGB颜色

为了使视觉效果尽可能的好,我们需要选择一组相互之间差异最大的颜色,用于填涂不同Label对应的mask区域。笔者已在这篇博文中详细介绍:生成一组差异较大的RGB颜色

其中,我们利用了CIEDE2000来度量颜色的差异,它考虑了人眼的视觉感知特性,能够更好地反映实际的颜色差异情况。具体来说,它将三个颜色属性分别转化到LCH(明度、色度、色调)颜色空间,然后计算两个LCH颜色向量之间的距离。具体代码可见如上博文。

2 生成语义图和mask边缘图

读取标注图后,利用对应的colors生成相应的语义图,并检测每个label的mask的边缘,将labels、语义图和mask边缘图列表返回。

# 获取labels、语义图和mask边缘图列表
def get_semantic_edges(ann_path, colors):
    mask = cv2.imread(ann_path, cv2.IMREAD_ANYDEPTH)
    chosen_labels = np.unique(mask)
    chosen_colors = [colors[label] for label in chosen_labels]
    contours_list = []
    # 新建一个图
    color_masks = np.zeros((mask.shape[0],mask.shape[1],3))
    for i,label in enumerate(chosen_labels):
        if label!=0:  # label为0表示background            
            idx = np.nonzero(mask == label)
            color_masks[idx[0],idx[1]] = chosen_colors[i]  # 填图
            # get contours
            new_mask = np.zeros((mask.shape[0],mask.shape[1]))
            new_mask[idx[0],idx[1]] = 255
            contours,_ = cv2.findContours(new_mask.astype('uint8'), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
            contours_list.append(contours)
    color_masks = color_masks.astype('uint8')
    color_masks = cv2.cvtColor(color_masks, cv2.COLOR_RGBA2BGR)
    return chosen_labels, color_masks, contours_list

3 合并语义图+原图+边缘

通过cv2.addWeighted合并语义图和原图,注意背景不要融合进去了,否则会出现不佳的合并效果。再直接用cv2.drawContours把边缘绘制上去。

# 合并mask和原图,并绘制边缘
def merge_mask_img(masks, img, contours_list,original_img_ratio):
    idx = np.nonzero(masks != 0)
    masks[idx[0],idx[1]] = cv2.addWeighted(img[idx[0],idx[1]], original_img_ratio, masks[idx[0],idx[1]], 1, 0)
    idx = np.nonzero(masks == 0)
    masks[idx[0],idx[1]] = img[idx[0],idx[1]]
    for contours in contours_list:
        cv2.drawContours(masks, contours, -1, (255, 255, 255), 5)
    return masks

4 绘制图例

输入原图、labels、colors和原图中包含的Labels,输出与原图高度相同的图例,以便后续将第3节的输出结果与图例直接横向拼接。

# 绘制图例
def get_resized(image, labels, colors, chosen_labels):
    # 选择颜色和label
    new_labels = [label for i,label in enumerate(labels) if i in chosen_labels]
    new_colors = [color for i,color in enumerate(colors) if i in chosen_labels]
    
    # 将RGB颜色转换为归一化值,并创建自定义颜色映射
    cmap = ListedColormap([np.array(new_colors[i])/255 for i in range(len(new_colors))])

    # 绘制语义分割图和图例
    legend_elements = []
    for i in range(len(new_labels)):
        rectangle = plt.Rectangle((0, 0), 1, 1, fc=cmap(i / len(new_labels)), edgecolor='black')
        legend_elements.append(rectangle)

    # 仅保存图例
    fig_leg = plt.figure(figsize=(1.5, 5), dpi=500)
    legend = fig_leg.legend(legend_elements, new_labels, loc='upper left',fontsize=8)
    legend.get_frame().set_linewidth(0.0)
    # plt转
    canvas = FigureCanvas(fig_leg)
    canvas.draw()
    buf = canvas.buffer_rgba()
    img = np.asarray(buf)
    img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)
    height = image.shape[0]
    print(img.shape,height)
    
    if img.shape[0] >= height:
        resized = cv2.resize(img, (height*img.shape[1]//img.shape[0], height))
    else:
        resized = np.pad(img, ((0, height-img.shape[0]), (0,0), (0, 0)), constant_values=255)
    
    return resized

在拼接了图例之后,效果图如下所示:

pCFVGlD.png

如果想获取完整代码,请见:语义分割结果可视化(原图+语义掩码+图例)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql执行计划怎么看

执行计划就是sql的执行查询的顺序,以及如何使用索引查询,返回的结果集的行数 EXPLAIN SELECT * from A where X? and Y? 1.id :是一个有顺序的编号,是查询的顺序号,有几个 select 就显示几行。id的顺序是按 select 出现的顺序增…

13 【代理配置 插槽】

1.Vue脚手架配置代理 本案例需要下载axios库npm install axios 配置参考文档 Vue-Cli devServer.proxy vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 vue/cli-service自动加载。你也可以…

老人跌倒检测识别预警算法 yolov7

老人跌倒检测识别预警系统采用yolov7网络模型技术,老人跌倒检测识别预警算法对老人的行为进行实时监测。当老人发生跌倒时,系统将自动发出警报,及时通知现场护理人员进行处理。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研…

MySQL表操作:提高数据处理效率的秘诀(进阶)(1)

💕**“生命不在于相信奇迹,而在于创造奇迹。”——朱学恒**💕 🐼作者:不能再留遗憾了🐼 🎆专栏:MySQL学习🎆 🚗本文章主要内容:MySQL对表操作进阶…

Node.js从基础到项目实践

摘要: Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript构建高性能的服务器端应用程序。本文将介绍Node.js的基础知识,并通过项目实践的方式帮助读者深入理解Node.js的用法和功能。从基础到项目实践&#x…

建造者模式的运用

文章目录 一、建造者模式的运用1.1 介绍1.2 建造者模式结构1.3 建造者模式类图1.4 组装自行车案例1.4.1 组装自行车案例类图1.4.2 代码 1.5 优缺点1.6 使用场景1.7 模式扩展1.7.1 原始代码1.7.2 重构代码 一、建造者模式的运用 1.1 介绍 将一个复杂对象的构建与表示分离&…

Linux系统下SQLite基础使用命令

1.选择数据库 sqlite 数据库.db 当出现sqlite> 表示成功 2.列出数据库中的表 .table 这一步是在上一步成功选择数据库的基础上进行的, 当出现event, 表示event-20230407这个数据库中有且只有一张表, 表名叫event 3.查询表中数据 select * from 表名; (此处注意记得一定…

【假捻发加工生产工单下达】

假捻工单是需要下到工作中心的,比如A01机台或者A02机台。 所以下工单之前要先查询A01机台上的最新工单量。 查询结果如下: 她会按照创建时间进行排序,后下的工单排在最前面 (如果下了个新工单,那么前一个工单的执行状态会自动改为关闭。) 因此查询结果,最上面的工单执…

外贸跨境商城app,多语言,多货币,跨境电商系统开发

外贸跨境商城app是一种在线购物平台,专门为海外买家提供跨境电商服务。用户可以在该app上浏览和购买来自全球各地的商品,以及与卖家进行沟通和交流。这些商品可能包括服装、鞋子、家居用品、电子产品等等,价格也跨越了各个层次。外贸跨境商城…

正确认识糖化学试剂:120173-57-1,Fmoc-Ser(Ac3GalNAcα)-OH的参数和保存方法

(文章资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ 【中文名称】N-芴甲氧羰基-O-(2-乙酰氨基-3,4,6-三-O-乙酰基-2-脱氧-α-D-吡喃半乳糖基)-L-丝氨酸 【英文名称】 Fmoc-Ser(Ac3GalNAcα)-OH 【结 构 式】 【CAS号】120173-…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(四):拖拽式GUI开发

前言: 如何做出炫酷的嵌入式GUI界面?GUI(Graphical User Interface) :图形化操作界面。新能源汽车对于炫酷GUI的需求也是越来越强烈。 AWTK全称为Toolkit AnyWhere,是ZLG倾心打造的一套基于C语言开发的GUI框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松…

2docker

一、引言 1.1 环境不一致 我本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。 1.2 隔离性 哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自…

基于Java+SpringBoot制作一个校园圈子小程序

制作一个校园圈子小程序,有效连接信息供需双方,用户可获取和发布需求信息、参与互动交流,适用于同校、同城、社区交流、客户互动、同学/老师注册发布信息等场景。 微信小程序实战开发专栏 一、小程序1.1 项目创建1.2 首页轮播图九宫格

Golang语法控制初识

Golang语法控制初识 采用文章 https://www.runoob.com/go/go-operators.html程序流程控制 在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控 制语句。 顺序控制分支控制循环控制 5.2 顺序控制 顺序控…

数智人力:现代企业解决人才短缺的新途径

后疫情时代,市场人才供需持续扩张。受疫情影响,人才市场供给总量较为充裕,但满足企业需求、符合业务调整方向的核心人才却仍然紧俏。供需双方在行业、地域以及岗位技能上往往存在错位,就业的结构性矛盾突出。 大型企业在解决人才…

数据结构与算法总结——Python版

目录 数据结构相关知识一.算法1. 哈希表是什么?2. 什么是时间复杂度?3. 空间复杂度4. 递归4. 查找4.1、顺序查找4.2. 二分查找 5. 排序5.1. 冒泡排序5.2. 选择排序5.3. 插入排序5.4. 快速排序5.5. 堆排序5.5.1.树5.5.2. 堆 5.6. 归并排序5.7. 希尔排序5.…

基于云计算的检验所云LIS系统源码(两癌筛查)

一、云LIS系统是基于云计算和使用B/S架构开发的实验室(检验科)管理系统,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器访问。SaaS服务,无需部署,开通账号接口快速入门使用,集齐…

代理模式(CGLIB和JDK)

文章目录 一. 简介1. 生活中的代理案例2. java中代理模式的应用3. 什么是代理模式 二. 如何实现代理1. 简介2. 静态代理3. 动态代理 三. JDK中的动态代理1. 介绍2. 测试3. 原理分析4. 原理图 四. CGLIB中的动态代理1. 简介2. 案例3. 底层原理分析 一. 简介 1. 生活中的代理案例…

什么是Odoo ERP:部署方式、业务集成、成本投入、发展与未来

ERP部署的类型 如何部署ERP 系统?通过多年的发展,ERP系统的部署方式更加多样化,包括公有云或私有云部署、本地部署或整合不同环境的混合部署场景,企业可根据自身条件与应用场景加以选择。下面介绍了每种部署模式的主要优势&#…

kafka系统的CAP保证

kafka系统的CAP保证 CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中: 一致性(Consistency)可用性(Availability)分区容错性(Partition tolerance) 最多满足其中的两个特性。…