win11系统中,同样的以0-1为元素值的8位png图像,一个显示为几乎全黑,一个显示为黑色和红色。并且在图像详情中找不到任何差别,原因在于png图像有多种颜色模式。
在下面这个链接中的第 二、PNG图片的原理与优化 有提到:https://www.cnblogs.com/susanws/p/5531163.html
如何查看png图像的颜色模式,可使用PIL库,python代码:
from PIL import Image
# 读取 PNG 图像
image = Image.open("path/to/image.png")
# 获取颜色模式
color_mode = image.mode
# 打印颜色模式
print("PNG 图像的颜色模式:", color_mode)
链接中述,png图像有5种灰度,真彩色rgb,索引色,带alpha通道的灰度,带alpha通道的真彩色rgb。
而 color_mode
在 PIL 库中可能的取值有以下几种(不仅针对png):
- "1": 二值图像,每个像素只有黑色和白色两种可能。
- "L": 灰度图像,每个像素用8位表示灰度级别,范围从0(黑色)到255(白色)。
- "P": 索引颜色模式(Palette-based Color Mode),在索引颜色模式中,图像的每个像素值对应于调色板(颜色映射表)中的一个索引,而不是直接表示颜色信息。
- "RGB": 红绿蓝彩色图像,每个像素用24位表示红色、绿色和蓝色三个通道的强度。
- "RGBA": 红绿蓝带透明通道的彩色图像,每个像素用32位表示红色、绿色、蓝色和透明度四个通道的强度。
- "CMYK": 青、品红、黄、黑四色彩色图像,每个像素用32位表示青色、品红色、黄色和黑色四个油墨的强度。
- "YCbCr": YCbCr 彩色图像,常用于视频压缩和数字图像处理。
- "HSV": 色相、饱和度、亮度模式的彩色图像。
另:
在调色板颜色模式中,图像的颜色信息存储在一个调色板中,调色板是一个包含颜色映射关系的表格。每个像素的值表示它在调色板中对应的颜色索引。通过将索引与调色板中的颜色进行映射,可以恢复出完整的彩色图像。
在索引颜色模式中,P
表示每个像素值使用8位(或其他位深度)的索引值来表示。通过查看调色板数据,可以了解每个索引值对应的具体颜色。
需要注意的是,索引颜色模式经常用于减小图像文件的大小,特别是在需要存储具有有限颜色范围的图像时,例如简单的图标、标识或动画。
经过测试,显示为全黑的png图像颜色模式为灰度颜色模式,显示为彩色的png图像颜色模式为索引颜色模式。
经验是:cv2.imwrite 函数会将8位矩阵图像存储为 灰度颜色模式,utils.lblsave 函数会将8位矩阵图像存储为 索引颜色模式。使用 utils.lblsave 存储的 索引颜色模式 0-1元素图像,使用 cv2.imwrite 灰度图模式读入时,元素1变为灰度38;不设置读入模式时,读为rgb模式,3通道,元素1变为(128,0,0)红色,与索引图颜色一致。使用 cv2.IMREAD_UNCHANGED 模式读入为8位uint,但元素1变为128。如果您的PNG图像使用的是调色板(palette)模式,那么读取后的图像将具有索引颜色,在处理和显示时需要注意索引和调色板的转换。
摸索出直接读取8位索引颜色模式png图像索引值矩阵的方法:
import numpy as np
from PIL import Image
#打开索引颜色模式图像
index_image = Image.open("index.png")
#将索引模式图像转换为numpy矩阵
index_matrix = np.array(index_image)
#index_matrix的元素均为索引值