图像处理中的伪彩色图与模式转换:P模式、L模式及语义分割标签可视化实践
1. 伪彩色图伪彩色(pseudo-color)图像是一种图像处理技术用于将灰度图像或单通道图像映射到彩色空间以便通过颜色差异来增强图像的视觉表现。在伪彩色图像中不同的灰度级或数据值被赋予不同的颜色从而创建出一个彩色的图像表示。伪彩色图每个像素值实际上是一个索引值或代码该代码值作为色彩查找表CLUT(Color Look-Up Table)中某一项的入口地址根据该地址可查找出包含实际R、G、B的强度值。这种用查找映射的方法产生的色彩称为伪彩色生成的图像为伪彩色图像。伪彩色图查找表是一个预先定义好的映射表它将原始图像的灰度值或某个特定范围内的灰度值映射到特定的颜色值。每个条目通常包含红、绿、蓝RGB三个颜色通道的值以及可能的透明度Alpha信息。需要注意的是伪彩色图像并不是真正的彩色图像而是通过对灰度图像或单通道图像进行颜色映射得到的。因此在解释伪彩色图像时需要注意颜色所代表的实际含义。2. 图像模式图像模式是指图像中像素的存储和表示方式不同的模式对应不同的颜色深度和存储需求。在PIL中常见的图像模式包括“1”二值图像“L”灰度图像“P”调色板图像“RGB”红绿蓝三通道彩色图像“RGBA”红绿蓝及透明度四通道彩色图像“CMYK”印刷色彩模式包括青、洋红、黄和黑色“YCbCr”用于JPEG压缩的颜色空间“I”32位整型图像“F”32位浮点型图像fromPILimportImage imgImage.open(test.png)modeimg.modeprint(mode)# 输出可能是L, RGB, RGBA等如果你输入的是彩色图那么输出是RGB。在cv2中没有直接的输出图像模式的方法。3. P模式与L模式上面介绍了图像模式这里主要介绍语义分割中用到的标签的图像的模式。3.1 P模式Pseudocolor mode在P模式下灰度图像的每个像素值会被映射到一个特定的颜色上映射函数可以是线性的也可以是非线性的取决于所选的伪彩色变换方法伪彩色图可以用于突出显示图像中的特定特征如边缘、纹理或特定类型的图像数据例如医学成像中的不同组织类型P模式下的伪彩色图通常用于科学可视化其中不同的颜色可以帮助解释和理解数据3.2 L模式Luminance modeL模式通常指的是亮度模式它是一种将灰度图像转换为具有单一颜色通道的图像的方法在L模式下图像的每个像素值被转换为相同的颜色通常是白色或其他单一颜色然后通过调整亮度来区分不同的像素值这种方法通常用于创建高对比度的图像使得图像中的不同区域或特征通过亮度的变化来区分而不是颜色的变化L模式下的图像可能不如P模式那样丰富和多彩但它们可以提供一种简单而有效的方式来强调图像中的亮度差异这里对标签掩码灰度图及伪彩色掩码图进行测试从左至右分别是原图labelme得到的标签伪彩色掩码图label.png单通道灰度图pic.pngimportcv2importnumpyasnpfromPILimportImage# 测试L模式图像imgImage.open(pic.png)modeimg.modeprint(mode)# Lprint(np.unique(img))# [0 1 2]print(-*30)# 测试P模式图像imgImage.open(label.png)modeimg.modeprint(img.getpalette())# PIL的P模式默认调色板RGB颜色及顺序[0, 0, 0, 128, 0, 0, 0, 128, 0, 128, 128, 0, 0, 0, 128, 128, 0, 128, 0, 128, 128, 128, 128, ...]print(mode)# Pprint(np.unique(img))# [0 1 2]print(-*30)# 使用cv2读取图片测试imgcv2.imread(label.png,0)# 以灰度读取伪彩色标签图print(np.unique(img))# [ 0 38 75]imgcv2.imread(label.png,1)# 以彩色读取伪彩色标签图print(np.unique(img))# [ 0 128]imgcv2.imread(pic.png,0)print(np.unique(img))# [0 1 2]imgcv2.imread(pic.png,1)print(np.unique(img))# [0 1 2]上述代码中np.unique是用来测试图像的像素值有哪些。很显然cv2对于P模式的伪彩色标签图会以三通道彩色图去读取无法读取到实际的标签种类。4. P模式与L模式相互转换4.1 P模式转L模式fromPILimportImage# 读取伪彩色P模式图像imgImage.open(pseudo_color_image.png)# 检查图像模式print(f原始图像模式:{img.mode})# 如果图像不是RGB模式先转换为RGB模式这里假设图像已经是P模式ifimg.mode!RGB:imgimg.convert(RGB)# 将RGB图像转换为灰度图像gray_imgimg.convert(L)# 保存灰度图像gray_img.save(gray_image.jpg)# 检查转换后的图像模式print(f转换后图像模式:{gray_img.mode})4.2 L模式转P模式fromPILimportImage# 打开L模式图像imageImage.open(pic.png)# 将L模式转换为P模式并设置调色板p_imageimage.convert(P)# 这里的palette参数实际上是被忽略的# 自定义一个包含5种颜色的调色板colors[128,128,0,0,255,0,0,0,255,0,0,255,255,255,255]p_image.putpalette(colors)# 保存带有自定义调色板的P模式图像p_image.save(converted_palette_image.png)# 验证图像模式print(f转换后图像模式:{p_image.mode})5. Alpha透明通道与自定义语义分割标签生成使用如下代码在原图上利用掩码标注的区域添加彩色通过设置两者叠加的权重达到透明可视效果。5.1 基础叠加方法importcv2importnumpyasnp image_pathrimages\img.png# 三通道彩色图mask_pathrimages\pic.png# 单通道灰度图掩码# 读取原图imagecv2.imread(image_path)print(image.shape)# (500, 800, 3)maskcv2.imread(mask_path,cv2.IMREAD_UNCHANGED)# 读取图像时保留所有通道包括透明度通道print(mask.shape)# 创建一个空白的彩色掩码叠加图 (与原图相同大小)overlaynp.zeros_like(image,dtypenp.uint8)colors{0:(0,0,0),# 背景 - 无色其实不用添加1:(0,0,255),# 类1 - 红色2:(0,128,255)# 类2 - 绿色} 颜色说明 0: (0, 0, 0), # 背景 - 无色其实不用添加 1: (0, 0, 128), # 类1 - 浅红色 2: (0, 128, 0) # 类2 - 浅绿色 # 遍历掩码中的每个类别为每个类别设置颜色forvalue,colorincolors.items():overlay[maskvalue]color# 设置透明度alpha 透明度值alpha0.25# 0.0完全透明1.0完全不透明# 将透明的彩色叠加图与原图结合resultcv2.addWeighted(overlay,alpha,image,1-alpha,0)# 保存结果cv2.imwrite(overlayed_image.png,result)效果对比叠加彩色的图原图5.2 增加Alpha透明通道importcv2importnumpyasnp image_pathrimages\img.png# 三通道彩色图mask_pathrimages\pic.png# 单通道灰度图掩码# 读取原图imagecv2.imread(image_path)print(image.shape)# (500, 800, 3)maskcv2.imread(mask_path,cv2.IMREAD_UNCHANGED)# 读取图像时保留所有通道包括透明度通道print(mask.shape)# 创建一个空白的彩色叠加图 (与原图相同大小但包含透明度通道)overlaynp.zeros((image.shape[0],image.shape[1],4),dtypenp.uint8)colors{0:(0,0,0,0),# 背景 - 透明完全透明1:(0,0,255,128),# 类1 - 半透明红色2:(0,255,0,128)# 类2 - 半透明绿色}# 遍历掩码中的每个类别为每个类别设置颜色forvalue,colorincolors.items():overlay[maskvalue]color# 将原图像转换为包含透明度通道的格式image_bgracv2.cvtColor(image,cv2.COLOR_BGR2BGRA)# 将透明的彩色叠加图与原图结合combinedcv2.addWeighted(overlay,0.3,image_bgra,1,0)# 保存结果cv2.imwrite(overlayed_image2.png,combined)效果对比叠加彩色的图原图5.3 添加图例importcv2importnumpyasnpdefadd_legend(image,colors,labels,alpha0.8): 在图像的右上角添加图例使用固定的尺寸。 :param image: 输入的BGR图像。 :param colors: 颜色字典键是类值值是颜色元组B, G, R。 :param labels: 标签字典键是类值值是标签文本。 :param alpha: 叠加透明度。 :return: 带图例的图像。 # 图像尺寸height,widthimage.shape[:2]# 固定图例尺寸和参数legend_height60legend_width150legend_padding10color_box_size15text_offset20text_font_scale0.5text_thickness1line_height20# 每一行的高度# 创建图例的背景legendnp.zeros((legend_height*len(labels)legend_padding*2,legend_width,3),dtypenp.uint8)foridx,(key,color)inenumerate(colors.items()):# 设置图例的颜色框top_left(legend_padding,idx*line_heightlegend_padding)bottom_right(legend_paddingcolor_box_size,idx*line_heightlegend_paddingcolor_box_size)cv2.rectangle(legend,top_left,bottom_right,color[::1],-1)# 颜色需要从 BGR 转换为 RGB# 添加标签文本text_position(legend_paddingcolor_box_sizetext_offset,top_left[1]color_box_size)cv2.putText(legend,labels[key],text_position,cv2.FONT_HERSHEY_SIMPLEX,text_font_scale,(255,255,255),text_thickness)# 计算图例位置legend_xwidth-legend_width-legend_padding legend_ylegend_padding# 将图例叠加到原图像右上角overlayimage.copy()overlay[legend_y:legend_ylegend.shape[0],legend_x:legend_xlegend.shape[1]]legend# 透明混合resultcv2.addWeighted(overlay,alpha,image,1-alpha,0)returnresult image_pathrimages\img.png# 三通道彩色图mask_pathrimages\pic.png# 对应的单通道灰度图标签掩码# 读取原图imagecv2.imread(image_path)print(image.shape)# (500, 800, 3)maskcv2.imread(mask_path,cv2.IMREAD_UNCHANGED)# 读取图像时保留所有通道包括透明度通道print(mask.shape)# 创建一个空白的彩色叠加图 (与原图相同大小但包含透明度通道)overlaynp.zeros((image.shape[0],image.shape[1],3),dtypenp.uint8)colors{0:(0,0,0),# 背景1:(0,0,255),# 类1 - 红色2:(0,255,0)# 类2 - 绿色}colors_legend{1:(0,0,255),# 类1 - 红色2:(0,255,0)# 类2 - 绿色}labels{1:Class 1,2:Class 2}# 遍历掩码中的每个类别为每个类别设置颜色forvalue,colorincolors.items():overlay[maskvalue]color combinedcv2.addWeighted(overlay,0.3,image,1,0)# 添加图例到右上角result_with_legendadd_legend(combined,colors_legend,labels,alpha0.5)# 保存结果cv2.imwrite(overlayed_image3_legend.png,result_with_legend)本文详细介绍了图像处理中的伪彩色图概念、P模式与L模式的特性及相互转换方法并提供了完整的语义分割标签可视化实践代码。通过设置浅色的红色与绿色叠加可以近似达到添加Alpha透明通道设置低值的效果为图像分割任务提供了实用的可视化解决方案。

相关新闻

基于HFSS的毫米波双工天线设计

基于HFSS的毫米波双工天线设计

追光者 摘要 本文提出了一款具备双极化能力的基片集成波导腔背式自双工槽天线阵列。该天线阵列由四个线性排列的全双工单元组成,可分别独立工作在22.52GHz和26.62GHz频段。天线设计在半模基片集成波导(HMSIW)腔体内,通过两个L槽来…

2026/10/18 10:38:25 阅读更多 →
终极指南:2分钟在Windows上快速安装苹果USB和移动设备以太网驱动

终极指南:2分钟在Windows上快速安装苹果USB和移动设备以太网驱动

终极指南:2分钟在Windows上快速安装苹果USB和移动设备以太网驱动 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.…

2026/10/18 10:38:35 阅读更多 →
SOLIDWORKS PDM二次开发实战指南:C#与API集成

SOLIDWORKS PDM二次开发实战指南:C#与API集成

1. 为什么选择SOLIDWORKS PDM二次开发 作为一名长期从事制造业数字化解决方案的工程师,我见证了SOLIDWORKS PDM在工程数据管理领域的强大能力。这个产品数据管理系统(PDM)不仅能有效管理设计文件版本,更重要的是它开放的API接口为…

2026/10/18 6:56:11 阅读更多 →

最新新闻

24GB显存跑32B开源大模型:量化+动态卸载的春节实验

24GB显存跑32B开源大模型:量化+动态卸载的春节实验

春节我给自己找了一件挺拧巴的事:非要把一个32B参数的开源大模型,塞进家用那台只有24GB显存的消费级显卡里。拧巴的不是技术难度,而是时机——走亲访友最忙的那几天,客厅里主机风扇一响,整个年味就碎了一地。所以这场实…

2026/10/18 19:44:30 阅读更多 →
心电算法实战:Python滤波、R波识别与心率计算全链路解析

心电算法实战:Python滤波、R波识别与心率计算全链路解析

简介:这是一份以Python编写的心电信号处理算法合集,围绕滤波、R波识别、心率计算、特征提取、心律失常分类,以及房颤、室颤室速等异常心律识别构建,同时覆盖伪差干扰研究、可视化展示与测试工程,适合生物医学工程专业学…

2026/10/18 19:44:30 阅读更多 →
假期AI圈动态全解析:模型迭代、工具链与工程落地

假期AI圈动态全解析:模型迭代、工具链与工程落地

七天假期结束,把手机里这段时间攒下的AI圈消息重新捋了一遍,说实话比上班还累。人在景区排队,群里在刷权重更新;晚上躺床上刷手机,新框架的讨论又顶上热搜。这七天给我的感觉就是:AI圈真的没一天消停&#…

2026/10/18 19:44:30 阅读更多 →
Fetch MCP服务:让大模型拥有实时网页抓取能力

Fetch MCP服务:让大模型拥有实时网页抓取能力

最近帮一位朋友调试他的AI助手项目,聊到一个很现实的问题:模型明明很强,却答不上来昨天刚发布的技术文档。原因很简单,模型的知识有截止日期,而它自己又不会主动去翻网页。要解决这个问题,就得给模型接上一…

2026/10/18 19:44:30 阅读更多 →
vdw-Prks水合物模型:甲烷水合物相平衡高精度计算原理与实现

vdw-Prks水合物模型:甲烷水合物相平衡高精度计算原理与实现

简介:本资源是一份面向计算化学、能源材料与相平衡研究方向的科研人员及高年级本科生的MATLAB建模仿真工具,聚焦甲烷水合物在低温高压条件下的相平衡预测问题。它基于经典的van der Waals–Platteeuw(vdw-P)理论框架,并…

2026/10/18 19:44:30 阅读更多 →
GitHub 开源趋势日报 | 2026年10月8日:AI Agent 与 TypeScript 项目实战配置指南

GitHub 开源趋势日报 | 2026年10月8日:AI Agent 与 TypeScript 项目实战配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 19:43:30 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →