文章目录

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

所以, 图像的像素值即指示了所在像素是哪一种颜色/哪一级灰度, 这里存在一种"数值-颜色"的索引关系, 称为 调色板. 对于最常见的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)

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

  1. CV之FE:基于TF进行FE——去除异常(被损坏)图像 和单通道图像

    CV之FE:基于TF进行FE--去除异常(被损坏)图像 和单通道图像 目录 输出结果 设计思路 部分代码实现 输出结果 去除了异常(被损坏)图像 .单通道图像 设计思路 1. 部分代码实现 impor ...

  2. python修改rgb红色通道为黑白_如何将RGB图像(3通道)转换为灰度(1通道)并保存?...

    您的第一个代码块:import matplotlib.pyplot as plt plt.imsave('image.png', image, format='png', cmap='gray') 这 ...

  3. numpy 用于图像处理(灰度图、转置、通道分离、图像扩展、水平镜像、水平翻转、调换x,y坐标、添加mask、随机打乱顺序、交换通道)

    目录 numpy 用于图像处理 1. 转换为灰度图 2. 转置 3. 画出三个通道的彩图 4. 图像扩展 5. 水平镜像 --- 交换行 6. 水平翻转 --- 交换列 7. 调换x,y坐标 8. 添 ...

  4. python 灰度图转矩阵_图像转换矩阵

    一.Python pillow模块 pip install pillow 二.使用 from PIL import Image import numpy as np def loadImage(): ...

  5. RGB图像转为灰度图

    最后结论: Grey = (R*38 + G*75 + B*15)>> 7 代码 #include <cv.h> #include <highgui.h>using ...

  6. matlab uint8转uint16,MATLAB图像uint8,uint16,double, rgb转灰度解释

    1.uint8,uint16与double 为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像.matlab读入图像的数据是uint8 ...

  7. python用numpy和pil处理图像成灰度图_「火炉炼AI」机器学习047-图像的直方图均衡化操作...

    [火炉炼AI]机器学习047-图像的直方图均衡化操作 [火炉炼AI]机器学习047-图像的直方图均衡化操作 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, sc ...

  8. python 制作高斯mask_Python中numpy如何生成mask图像

    有的小伙伴对numpy如何生成mask图像产生了疑问,今天就这个问题为大家进行解答. 在numpy中,有一个模块叫做ma,这个模块几乎复制了numpy里面的所有函数,当然底层里面都换成了对自己定义的新 ...

  9. cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

最新文章

  1. c语言将0到1十等分放入数组,C语言课程设题计目汇总.doc
  2. android studio上下滚动菜单,Android模仿美团顶部的滑动菜单实例代码
  3. android onitemclicklistener 按钮代码,在listview Android的setOnItemClickListener上设置项目单击事件...
  4. [今日白学]组件的基础的基础的基础
  5. 小米路由通过SSH添加静态路由表之后无法跳转的问题
  6. maven 简单实用教程
  7. Caffe学习:Blobs, Layers, and Nets
  8. lc 778. Swim in Rising Water
  9. 关于office2010的mso问题和卸载重装问题
  10. 章文嵩:开源为我打开一扇窗
  11. c语言error lnk 2005,error LNK2005问题,小弟实在无能为力!!!
  12. 使用CMD隐藏文件夹
  13. VR全景制作方法教程完整版
  14. 运行jar包时报错:[mybatis-config.xml] cannot be opened because it does not exist
  15. 基于Acgis从全球.nc数据中提取中国地图并计算地区CO2值
  16. 如何改变this指向?
  17. 数据库是什么?数据库的概念
  18. 基于B/S的城市公交查询系统的设计与实现(附:源码+论文+答辩PPT))
  19. 软件开发V模型--解读
  20. bim要求计算机什么配置,BIM对电脑配置的要求

热门文章

  1. 比较适合大学生用的查题软件
  2. 小米手环4 NFC版使用实测
  3. Win10关机后机箱风扇还一直转
  4. 上市公司每股社会贡献值(数据+代码)(2000-2020年)
  5. show java使用教程_java卡片布局中show的正确使用方法
  6. 美国网红python图片_爬取网红小姐姐图片(简单入门)
  7. Lua 面向对象 创建类实例
  8. 美术宝软件测试面试流程怎么样,“倒数第一”试卷走红,老师气得找家长,美术老师却表示有前途...
  9. 【深度学习工作站】攒机
  10. idea自动导包 自动删除