numpy转PIL.Image: 处理Mask图像为单通道的彩色/灰度图colormap.png

article/2025/9/28 4:54:41

文章目录

  • 从分割数据集说起
    • 8位彩色图
    • 8位灰度图
    • 1位二值图
  • 什么是图像位深
  • PNG图像格式简介
  • 如何处理Mask图像
  • 注意!!!PIL一定要手动close 防止内存泄漏
  • PIL库相关函数


从分割数据集说起

8位彩色图

下图是 NYU数据集 里的一张Mask图像, 显示彩图, 但实际是单通道位深为8的png图像, 也就是单通道图像, 并不是常见的RGB三通道.
在这里插入图片描述
而这种图像怎么读取呢? 用opencv读取显然是行不通的, 这点在另一篇博客有过介绍, 因为改变了图像的像素值和格式, 参考在深度学习中遇到的opencv坑.
在这里插入图片描述
推荐使用PIL.Image.open()读取. 可以看到像素值在 [0, 255] 之间, 矩阵仍然是二维单通道.
在这里插入图片描述
再看一下具体的像素值, 可以通过统计元素的方法得到: (参考在深度学习中遇到的opencv坑)
px = [255, 7, 0, 37, 39, 6, 25, 4, 28]
这些值也是实例类别的标签!!! 因此不能使用opencv读取, 不能被改变.

8位灰度图

下图是 GTEA 数据集中的一张Mask图像, 显示为灰度图, 实际也是单通道 位深为8的png图像
在这里插入图片描述
使用PIL.Image.open()读取. 可以看到像素值在 [0, 255] 之间, 矩阵仍然是二维单通道.
在这里插入图片描述
统计具体的像素值, 只有两个:
px = [0, 200]
对于二值Mask图像来说, 这种情况是需要处理的, 可以读取该数据集的其他图像, 能够看出像素值并不统一, 而分割只有两种: 手和背景. 因此需要将图像标签处理为 0/1, 本文讨论的重点就是如何处理这类不规则格式的Mask图像

1位二值图

下图是 HandOverFace数据集的一张图像, 显示为二值图, 实际是单通道 位深为1的png图像, 这个格式就比较统一, 但仍然存在麻烦.
在这里插入图片描述
使用PIL.Image.open()读取. 可以看到像素值是bool型, 矩阵是二维单通道.
在这里插入图片描述
这种数据集仍然需要处理.

什么是图像位深

图像位深, 又叫色深(Color Depth),指像素点可以有多少种色彩来描述,单位是“bit”(位), 如1-bit、8-bit、24-bit和32-bit. 深度数值越高,可以获得更多的色彩.

  • 1位图像, 位深度是1, 含有 2 1 2^1 21 种颜色或灰度级;
  • 8位图像,位深度是8,含有 2 8 = 256 2^8=256 28=256 种颜色或灰度级.;
  • 24位图像可称为真彩色图像,位深度是24,能组合成 2 24 = 1677 , 7216 2^{24}=1677,7216 224=1677,7216 种颜色,超过了人眼能够分辨的颜色数量. 实际上, 计算机是以RGB三通道的形式来存储的, 每一通道都是8位, 可指示256种颜色, 三基色相互组合就形成了 ( 2 8 ) 3 (2^8)^3 (28)3 种颜色;
  • 32位图像是在RGB图像基础上增加了 α \alpha α通道, 代表还存在256级透明度;
  • 还存在不规则的2位/4位/x位等图像, 即含有 2 x 2^x 2x 种颜色或灰度级.

所以, 图像的像素值即指示了所在像素是哪一种颜色/哪一级灰度, 这里存在一种"数值-颜色"的索引关系, 称为 调色板. 对于最常见的RGB图像, 我们知道像素值[0,0,0]是黑色, [255,255,255]是白色; 对于1位图像, 像素值[0]则代表黑色, [1]代表白色; 但是对于8位图像, 则需要看调色板索引的实际颜色, 其中像素值[0]代表了调色板定义的第0种颜色, [255]代表第255种颜色.

因此, 和上述数据集Mask图像的情形一致, 同样的单通道矩阵, 如果调色板配置不同, 所呈现的图像也是不一样的.

PNG图像格式简介

参考: PNG - 维基百科

  • PNG(Portable Network Graphics,便携式网络图形)是一种无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性.

  • PNG图像的文件结构包括一个8字节的PNG文件标识域和3个以上的后续数据块组成, 共有两种类型的数据块:一种是PNG文件必须包含、读写软件必须支持的关键块(critical chunk);另一种是辅助块(ancillary chunks). PNG允许软件忽略它不认识的附加块, 这种基于数据块的设计, 使得PNG格式在扩展时仍能保持与旧版本兼容.

  • 关键数据块中有4个部分:
    文件头数据块 IHDR(header chunk):包含有图像基本信息,作为第一个数据块出现并只出现一次;
    调色板数据块 PLTE(palette chunk):必须放在图像数据块之前;
    图像数据块 IDAT(image data chunk):存储实际图像数据。PNG数据允许包含多个连续的图像数据块;
    图像结束数据 IEND(image trailer chunk):放在文件尾部,表示PNG数据流结束.

如何处理Mask图像

在语义分割/实例分割中, Mask图像的像素值代表了像素点所属的类别标签. 对于单个类别的数据集来说, Mask像素值应该是[0/1], 显示为黑色/白色以区分背景/目标; 对于多个类别的数据集, Mask像素值应该是[0,1,2,…], 显示为彩色以区分不同目标. 这就需要用到调色板索引.

考虑到通用性, 不使用1位图像[False/True], 不使用不规则的位深, 推荐Mask图像都转为8-bits二值图或彩色图. 当然, 不额外处理数据集也是可行的, 只需要在读取时对像素值做转换即可.

处理代码如下:

import numpy as np
import PIL.Image as Imagesrc= Image.open("1.png")
mat = np.array(src)
mat = mat.astype(np.uint8)
dst = Image.fromarray(mat, 'P')
bin_colormap = [0,0,0] + [255,255,255]*254    # 二值调色板
dst.putpalette(bin_colormap)
dst.save('new.png')
src.close()

在这里插入图片描述

cmap = np.load('../utils/cmap.npy')
dst.putpalette(cmap)

在这里插入图片描述

注意!!!PIL一定要手动close 防止内存泄漏

PIL库相关函数

  • PIL.Image.fromarray(obj, mode=None)
  • Image.putpalette(data, rawmode=‘RGB’)
  • Image.getpalette()
  • Image.getpixel(xy)
  • Image.save(fp, format=None, **params)
  • Image.show(title=None, command=None)

http://chatgpt.dhexx.cn/article/1yV9SNxX.shtml

相关文章

matlab图像类型的转换九种

在对图像进行处理时,很多时候对图像的类型有特殊的要求,例如,在对索引图像进行滤波时,必须把它转换为RGB图像,否则光对图像的下标进行滤波,得到的是毫无意义的结果。在MATLAB中,提供了许多图像类…

matlab mat2gray函数 对图像数据归一化的理解以及互转

刚好今天也有需要用三维重建中的深度数据,数据值大于255,自己用matlab可以显示出来,如果直接保存成图片数据都是1,什么都看不到,拿给别人也没有用,于是就想到用mat2gray先将数据进行归一化到(0,…

Matlab中mat2gray函数用法

目录 语法 描述 例子 将矩阵转换为图像 ​​​​​​​ mat2gray将矩阵转换为灰度图像 语法 I mat2gray(A,[amin amax]) I mat2gray(A)描述 I mat2gray(A,[amin amax]) 将矩阵转换为包含0(黑色)到1(白色)范围内的值A的灰度…

图像处理函数——mat2gray、imclose、imopen、imerode

文章目录 1.mat2gray2.imclose3.imopen4.imerode 1.mat2gray 功能: 将矩阵转换为灰度图像 用法:: l mat2gray(A, [amin amax])将矩阵A转换为灰度图像l。 [amin amax]为表示转换的阙值,A中大于amax的值将转换成1,小于amin的值将转…

mat2gray

文章目录 SyntaxDescriptionConvert a Matrix into an Image mat2gray:将矩阵转换为灰度图像 Syntax I mat2gray(A,[amin amax]) I mat2gray(A)Description I mat2gray(A,[amin amax])将矩阵A转换为强度图像I,该强…

CAN网络dbc格式

dbc 格式 是vector公司定义的私有文件格式。因vector公司在汽车领域,用者甚众,dbc成为描述can matrix,can报文格式的一种重要形式。格式标准说明,见本人上传附件。 CAN协议领域,有很多CAN协议,通用的有J19…

CAN 网络通信矩阵

CAN 网络通信矩阵 通信矩阵DBC文件DBC软件 通信矩阵 将信号、消息和网络节点的相互关系以表格形式展现,由OEM定义。 车辆网络中各节点ECU必须遵循该通讯矩阵才能完成信息的交互和共享。 网络节点:一个汽车控制器作为一个网络节点消息:一个控…

整车CAN网络介绍---CAN--PT CAN--Chassis CAN--Body CAN--Info CAN

CAN(Controller Area Network)控制器局域网络,CAN网络在早期的整车应用中以BCM(车身控制 1.整车CAN网络介绍 CAN(Controller Area Network)控制器局域网络,CAN网络在早期的整车应用中以BCM(车身控制器)为控制中心,主要是车身零部件(雨刮/大灯…

【汽车总线技术】CAN FD与CAN网络共存的解决方案

1.CAN FD发展的背景介绍 随着总线技术在汽车电子领域越来越广泛和深入的应用,特别是自动驾驶技术的迅速发展,汽车电子对总线宽度和数据传输速率的要求也越来也高,传统CAN(1MBit/s,8Bytes Payload)已难以满…

整车CAN网络基本结构

在了解can网络之前, 先了解1个问题: 什么是智能硬件与ECU ? 何为智能硬件, 就是包含智能控制单元的硬件, 比如发动机, 发动机上有一块儿专门负责控制发动机进气量, 喷油量, 排气量的控制单元, 这块单元相当于发动机的大脑. 他具有信号发送, 信号接收, 参数存储等基本功能, 这…

CAN网络应用软件设计CANoeCANFD

CAN CAN网络应用 简单案例 典型汽车网络拓扑结构 动力CAN(1) 负责车辆动力和必须实时响应的安全相关ECU接入这条CAN 底盘动态CAN(2) 负责底盘动态控制和辅助相关的功能的ECU接入到这条CAN信息CAN(3) 负责仪…

AutoSar之CAN网络管理

本文首发于微信公众号“汽车控制与人工智能”欢迎关注。 今天整理下AUTOSAR中的CAN网络管理。 ​AUTOSAR中网络管理主要使用了CAN接口(CanIf),并提供通用网络管理接口(NmIf)。CAN网络管理在CAN架构中所处的位置如图1,与其他模块的交互如图2。 图1 CAN架构 图2 网络管理和…

can 网络管理

网络管理主要功能: 是用来管理ECU是否在网络里面,不在的话请求加入,也就是ALIVE报文,要判断是否掉线,以及睡眠状态的转换机制,以及跛行状态判,也即是RING报文。 主要的实现逻辑流程&#xff1…

CAN网络管理唤醒功能

采用1043的can 芯片:工作模式 – 正常模式 – 具有 INH 输出以及本地和远程唤醒请求功能的待机模式 – 具有 INH 输出以及本地和远程唤醒请求的低功耗睡眠模式 状态切换流程图: CAN唤醒的需求: 唤醒请求(Wake Up Request) 唤醒请求可分为两种: ● 主动唤醒请求:来自模…

关于CAN网络管理状态

首先介绍一下,我是一名刚刚入职1个月的汽车网络测试工程师,目前主要是一边学习一边跟着公司前辈做一个项目,主要的内容就是进行通信、网络、诊断方面的测试。想以文字的形式记下自己学习的一些感想或者是经验之类的,达到巩固知识的…

AutoSar之CAN网络管理详解

​AUTOSAR中网络管理主要使用了CAN接口(CanIf),并提供通用网络管理接口(NmIf)。CAN网络管理在CAN架构中所处的位置如图1,与其他模块的交互如图2。 图1 CAN架构 图2 网络管理和其他模块的联系 AUTOSAR网络管理基于分散的直接网络管理策略,这意…

CAN网络通信

1.网络层概述 1.1综述 这部分描述了网络层的整体功能。TP协议规定了用于网络节点之间交换数据的网络层通信协议,例如ECU与ECU之间,或测试设备与ECU之间。如果要传输的数据不能使用单个的CAN帧传输,则提供一种分包传输的方法。 传输通道是通信链路的物理组成部分,包含接收/传…

CAN网络管理Autosar(入门)

一,个人小心得 作为刚入门两个月汽车电子行业的软件工程师,现阶段在学习汽车组合开关的测试(主要用CANoe软件),在学习过程中总结了一些自己理解的知识点,当然也希望得到大佬们的指点。当然如果要做一个优秀…

汽车总线CAN网络分层机构 --3

CAN网络分层机构 CAN的分层结构 遵循ISO/OSI标准模型,CAN规定了分数据链路层和物理层。数据链路层又分逻辑链路控制子层LLC和媒体访问控制子层(MAC) CAN协议层 LLC子层和MAC子层的运行被“故障界定“实体监控着。错误界定是一种能区分短期干扰和永久故障的自校验…

AUTOSAR —— CAN网络管理(CanNm)

1. 网络状态 AUTOSAR网络管理节点内部有两个状态,一个是Requested - 被请求状态,另一个是Released - 被释放状态,当节点的应用层需要使用总线进行通讯的时候,会调用接口使得节点进入请求状态,当应用层没有通信需求的时…