【OpenCV 例程300篇】203. 伪彩色图像处理

article/2025/5/7 0:23:39

OpenCV 例程200篇 总目录
201. 图像的颜色空间转换
202. 查表快速替换(cv.LUT)
203. 伪彩色图像处理
204. 图像的色彩风格滤镜
205. 调节色彩平衡/饱和度/明度

文章目录

  • 【youcans 的 OpenCV 例程300篇】203. 伪彩色图像处理
      • 什么是伪彩色图像?
      • 函数原型
      • 例程 14.5:灰度图像转换为伪彩色图像
      • 例程 14.7:多光谱合成的伪彩色图像

【youcans 的 OpenCV 例程300篇】203. 伪彩色图像处理


NASA 公布了蟹状星云 (Crab Nebula )的观测图像。茫茫太空,距离我们几亿光年的宇宙真是这样绚丽迷人吗?

NASA 专家撰文指出,蟹状星云彩色照片实际上人工合成的图像,这是不是暗示照片中的彩色是伪造的?

什么是伪彩色图像?

伪彩色图像是指对单色图像进行处理,结果转换得到颜色分量,构造为彩色效果的图像。伪彩色图像在形式和视觉表现为彩色图像,但其所呈现的颜色并非图像的真实色彩重现,仅仅是各颜色分量的像素值合成的结果。

  • (1)一类伪彩色图像是对灰度图像的增强,形成彩色效果。

伪彩色图像增强是指按照特定的准则对灰度图像进行处理,将不同的灰度级按照某种映射关系变换为不同的颜色分量。例如,天气预报中的气象云图,红外测温图像,一般都是伪彩色图像。

人眼的视觉特性,只能分辨 20 级左右的灰度,但可以分辨几千种色调和亮度。通过伪彩色图像增强,可以让灰度图像看起来更清楚,更容易分辨。

将灰度图像进行伪彩色增强,通常是基于一个设定的颜色查找表,将图像像素的灰度值替换为颜色查找表中对应的颜色值。这显然是典型的 LUT 应用场景。

  • (2)另一类伪彩色图像,是多光谱图像的编码合成图像。

光谱图像可以是可见光谱,也可以是红外、紫外、X光或其它信号。这些非可见光谱图像实际上既不是彩色图像,也不是灰度图像,“像素值”往往反映某种检测信号的强度。合成为彩色图像进行显示,只是为了便于观察和分析。

这在天文学观测中十分常用。NASA 公布的绚烂迷人的太空照片,并不是真实世界的色彩还原,而是将多种光谱信号图像进行编码组合和特效处理后,构造出的彩色图像。


函数原型

函数 cv.applyColorMap() 根据色彩映射表,将灰度图像变换为伪彩色图像。

cv.applyColorMap(src, colormap[, dst]) → dst
cv.applyColorMap(src, userColor[, dst]) → dst

参数说明:

  • src:输入图像,8 位灰度图像或彩色图像,cv_8U
  • dst:输出图像,大小和通道数与 src 相同
  • colormap:色彩映射表,OpenCV 自带色彩风格类型的颜色查找表
  • userColor:用户自定义的色彩映射表, 256个元素

注意事项:

  1. 输入图像可以是彩色图像。根据作者的测试,先将输入彩色图像转换为灰度图像,再按色彩映射表进行变换。
  2. 用户自定义的色彩映射表,是 256*3 数组。系统提供的 22种色彩映射表一般已经够用,就别折腾了。
  3. 例程中没有出现 cv.LUT 查表替换,在 cv.applyColorMap 内核中已经应用了查表替换方法。

色彩映射表:

  • OpenCV 提供了 22 种色彩风格类型,类型描述关键字与色彩效果如下图所示。

在这里插入图片描述

  • OpenCV 提供的色彩风格类型与 Matlab、Matplotlib 热图的颜色映射是类似的,描述关键字也是一致的。
    参见:http://matplotlib.org/examples/color/colormaps_reference.html

例程 14.5:灰度图像转换为伪彩色图像

    # 14.5 灰度图像转换为伪彩色图像    gray = cv.imread("../images/Fig0525a.tif", flags=0)  # 读取灰度图像h, w = gray.shape[:2]  # 图片的高度, 宽度# 伪彩色处理pseudo1 = cv.applyColorMap(gray, colormap=cv.COLORMAP_HOT)pseudo2 = cv.applyColorMap(gray, colormap=cv.COLORMAP_PINK)pseudo3 = cv.applyColorMap(gray, colormap=cv.COLORMAP_RAINBOW)pseudo4 = cv.applyColorMap(gray, colormap=cv.COLORMAP_HSV)pseudo5 = cv.applyColorMap(gray, colormap=cv.COLORMAP_TURBO)plt.figure(figsize=(9, 6))plt.subplot(231), plt.axis('off'), plt.title("GRAY"), plt.imshow(gray, cmap='gray')plt.subplot(232), plt.axis('off'), plt.title("cv.COLORMAP_HOT")plt.imshow(cv.cvtColor(pseudo1, cv.COLOR_BGR2RGB))plt.subplot(233), plt.axis('off'), plt.title("cv.COLORMAP_PINK")plt.imshow(cv.cvtColor(pseudo2, cv.COLOR_BGR2RGB))plt.subplot(234), plt.axis('off'), plt.title("cv.COLORMAP_RAINBOW")plt.imshow(cv.cvtColor(pseudo3, cv.COLOR_BGR2RGB))plt.subplot(235), plt.axis('off'), plt.title("cv.COLORMAP_HSV")plt.imshow(cv.cvtColor(pseudo4, cv.COLOR_BGR2RGB))plt.subplot(236), plt.axis('off'), plt.title("cv.COLORMAP_TURBO")plt.imshow(cv.cvtColor(pseudo5, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述


例程 14.7:多光谱合成的伪彩色图像

蟹状星云 (Crab Nebula )的观测图像,是由钱德拉 X 射线天文台数据所形成的X射线图、哈勃太空望远镜拍摄的光学图像,和斯必泽空间望远镜拍摄的红外图像合成得到的。

例程结果图中,第一行是 3 种天文观测图像的观测数据图像,图像中的灰度都只是观测的信号强度,而不是实际的物理世界的亮度或灰度。

第二行是分别对 3 种观测图像进行伪彩色变换的结果,如果选择不同的色彩风格可以获得不同的效果。

第三行是将 3 种观测信号合成得到的伪彩色图像,其中左图、中图是简单地将 3 种观测信号分别作为 RGB 的一个色彩通道得到的伪彩色图像,右图是 NASA 公布的多光谱合成伪彩色图像。

虽然 NASA 图像的视觉效果更好,但仍然可以明显地看出,该图也是由第一行 3 种观测数据图像合成的。

在这里插入图片描述

    # 14.7 多光谱编码合成的伪彩色图像# 蟹状星云 (Crab Nebula), 图片来源:# https://www.nasa.gov/mission_pages/chandra/multimedia/photo09-096.htmlcomposite = cv.imread("../images/CrabNebula.png", flags=1)  # 读取多光谱合成图像nebulaOpti = cv.imread("../images/CrabNebula_Optical.jpg", flags=1)  # 读取 OpticalnebulaXray = cv.imread("../images/CrabNebula_Xray.jpg", flags=1)  # 读取 XraynebulaInfr = cv.imread("../images/CrabNebula_Infrared.jpg", flags=1)  # 读取 Infraredh, w = nebulaOpti.shape[:2]  # 图片的高度, 宽度grayOpti = cv.cvtColor(nebulaOpti, cv.COLOR_BGR2GRAY)grayXray = cv.cvtColor(nebulaXray, cv.COLOR_BGR2GRAY)grayInfr = cv.cvtColor(nebulaInfr, cv.COLOR_BGR2GRAY)# 伪彩色处理pseudoXray = cv.applyColorMap(nebulaXray, colormap=cv.COLORMAP_TURBO)pseudoOpti = cv.applyColorMap(nebulaOpti, colormap=cv.COLORMAP_MAGMA)pseudoInfr = cv.applyColorMap(nebulaInfr, colormap=cv.COLORMAP_HOT)# 多光谱编码合成compose1 = np.zeros((h, w, 3), np.uint8)  # 创建黑色图像 BGR=0compose1[:, :, 0] = grayOpti  # Optical -> Bcompose1[:, :, 1] = grayXray  # Xray -> Gcompose1[:, :, 2] = grayInfr  # Infrared -> Rcompose2 = np.zeros((h, w, 3), np.uint8)  # 创建黑色图像 BGR=0compose2[:, :, 0] = grayXray  # Xray -> Bcompose2[:, :, 1] = grayOpti  # Optical -> Gcompose2[:, :, 2] = grayInfr  # Infrared -> R# composite = cv.normalize(nebulaInfr + nebulaOpti, None, 0, 255, cv.NORM_MINMAX)  # 归一化为 [0,255]plt.figure(figsize=(9, 9))plt.subplot(331), plt.axis('off'), plt.title("CrabNebula-Xray")plt.imshow(grayXray, cmap='gray')plt.subplot(332), plt.axis('off'), plt.title("CrabNebula-Optical")plt.imshow(grayOpti, cmap='gray')plt.subplot(333), plt.axis('off'), plt.title("CrabNebula-Infrared")plt.imshow(grayInfr, cmap='gray')plt.subplot(334), plt.axis('off'), plt.title("Xray Pseudo")plt.imshow(cv.cvtColor(pseudoXray, cv.COLOR_BGR2RGB))plt.subplot(335), plt.axis('off'), plt.title("Optical Pseudo")plt.imshow(cv.cvtColor(pseudoOpti, cv.COLOR_BGR2RGB))plt.subplot(336), plt.axis('off'), plt.title("Infrared Pseudo")plt.imshow(cv.cvtColor(pseudoInfr, cv.COLOR_BGR2RGB))plt.subplot(337), plt.axis('off'), plt.title("Spectral composited")plt.imshow(cv.cvtColor(compose1, cv.COLOR_BGR2RGB))plt.subplot(338), plt.axis('off'), plt.title("Spectral composited")plt.imshow(cv.cvtColor(compose2, cv.COLOR_BGR2RGB))plt.subplot(339), plt.axis('off'), plt.title("Composite image")plt.imshow(cv.cvtColor(composite, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()


【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125298385)
Copyright 2022 youcans, XUPT
Crated:2022-6-14
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

文章来源:https://blog.csdn.net/youcans/article/details/125298385
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://chatgpt.dhexx.cn/article/nldx0ABN.shtml

相关文章

itoa函数和atoi函数

itoa是广泛应用的非标准 C语言扩展函数。由于它不是标准C语言函数&#xff0c;所以不能在所有的 编译器中使用。但是&#xff0c;大多数的编译器&#xff08;如Windows上的&#xff09;通常在<stdlib.h>头文件中包含这个函数。 1说明编辑 功能&#xff1a;将任意类型的数…

C++之spriintf函数(itoa函数)

sprintf函数 头文件&#xff1a;stdio.h 原型 int sprintf( char *buffer, const char *format, [ argument] … ); 参数列表 buffer&#xff1a;char型指针&#xff0c;指向将要写入的字符串的缓冲区。 format&#xff1a;格式化字符串。 [argument]…&#xff1a;可选参数&a…

Vue 艺术字体下载、设置

1&#xff0c;本人常用的下载地址&#xff1a;https://zh.fonts2u.com/ 2&#xff0c;找到你需要的字体点击下载 3&#xff0c;下载完之后有一个ttf文件 4&#xff0c;在vue里面&#xff0c;我个人在assets文件下创建一个文件夹&#xff0c;叫什么名字都行&#xff0c;找到你…

vue下载跨域图片

<a style"color: #409EFF;" click"downImg(url)">下载还款凭证</a>//方法一 &#xff08;只有这种方法解决我的需求&#xff09; downImg(imgsrc) {const src ${imgsrc}?t${new Date().getTime()}fetch(src).then(res > {res.blob().th…

vue点击url链接下载文件

在src下面新建一个downLoadUrl的目录 downLoadUrl / index.js文件 /** 后端返回文件的url,前端创建a标签来下载** 1. 解决了若文件为图片或浏览器支持的格式类型,点击下载会直接打开文件的问题,* 2. 下载文件时,浏览器会有闪动的问题** 页面内使用* 1. 引入指令 import do…

vue文件下载及重命名

本文所讲的下载地址格式为&#xff1a;地址文件名&#xff08;例如&#xff1a;http... test.docx&#xff09; 页面代码&#xff1a; <!--map为所下载的文件信息&#xff0c;包括文件名、路径等 --> <p v-down"map">这是文件名</p> js代码…

使用npm下载vue-router(vuex)路由报错,“export ‘XXXX‘ was not found in ‘vue‘

vue-router vuex 报错同理 vue-router vuex 报错同理 今天在写vue项目使用cnpm下载路由&#xff0c;然后就报错"export ref was not found in vue 原因&#xff1a;cnpm install vue-router --save 现在默认下载的是4.x的版本 &#xff0c;我是用的是…

vue实现文件下载

vue中文件下载 前言 Vue浏览器文件下载最简单的方法就是用a链接实现&#xff0c;然后加一个download属性。让后端返回[blob]文件格式&#xff0c;需要传递 responseType: ‘blob’ 一、使用步骤 展示文件&#xff0c;文件点击后查看方法为handlePreview <span style&qu…

vue学习之一:下载vue-cli项目

这几周一直辗转在vue官网和各大博客搜索关于vue项目实战的例子。学的实在是零零碎碎的。不过总算在对于vue项目搭建有个基本认知&#xff0c;于是直接拿起以前做过的项目进行改版了&#xff0c;接下来是从怎么搭建vue2.xvue-router项目实战写的一些列文章。我的开发环境都是基于…

下载vue脚手架@vue/cli(详解)

1.首先到官网下载node.js 2.在自己的电脑查看是否下载成功 使用window加r输入cmd使用node -v 查看node.js是否下载成功 3.使用npm下载yarn 注意&#xff1a;因为下载node.js中会自动帮你下载npm&#xff0c; npm install -g yarn 使用yarn -v 如果显示有版本号则下载成功…

vue.js中文官网下载vue.js失败了?

访问vue官网 https://v2.cn.vuejs.org/v2/guide/installation.html下载vue.js&#xff0c;页面直接报错404&#xff0c;只需要切换到英文版&#xff0c;重新下载即可成功。 或者直接访问以下地址: https://v2.vuejs.org/v2/guide/installation.html#Direct-lt-script-gt-Includ…

如何下载vue.js

vue官网&#xff1a;https://v2.vuejs.org/ 1、第一步 2、第二步 3、 第三步

idea 下载vue 插件

1.先查看自己的idea 的版本 2.然后去官网 https://plugins.jetbrains.com/plugin/9442-vue-js/versions 下载跟自己idea 版本对应的vue插件 一定要对应不然 报版本不对应问题 类似于&#xff1a; 下载完之后 把文件放在 相应位置 我是放在了idea的插件位置 一般是在 idea的…

Vue.js的下载和调用

Vue支持双向绑定&#xff0c;非常不错。将视图层和模型层分离开。是基于MVVM模型&#xff0c;模型-视图-视图模型 。支持ES6。 目录 一、在官网下载vue.js文件 二、声明Vue对象 三、Vue修饰符 1. v-once。 使{{}}内的值不能被修改 2.v-pre 。{{}}将不会被Vue替换&#xff0c…

操作系统课后答案第三章

**操作系统课后答案**第三章 处理及调度与死锁 1、高级调度与低级调度的主要任务是什么? 为什么要引入中级调度? 答&#xff1a;高级调度的主要任务&#xff1a;用于决定把外存上处于后背队列中的哪些作业调入内存&#xff0c;并为它们创建进程&#xff0c;分配必要的资源&am…

第1章 操作系统引论课后答案

第1章 操作系统引论 1.1 简答题参考答案 1&#xff0e;在计算机系统上配置 OS&#xff08;operating system&#xff0c;操作系统&#xff09;的目标是什么&#xff1f;作用主 要表现在哪几个方面&#xff1f; 【参考答案】在计算机系统上配置OS&#xff0c;主要目标是实现&a…

操作系统解答题

操作系统 **1.平均等待时间问题****2.同步互斥问题****3.分页系统地址转换****4.LRU&#xff08;最近最久未使用&#xff09;置换算法**5.银行家算法 1.平均等待时间问题 有5个进程P1&#xff0c;P2&#xff0c;P3&#xff0c;P4&#xff0c;P5&#xff0c;它们同时依次进入就…

操作系统习题(有答案)

最近在学习os在网上找到的很好的资料&#xff0c;希望对大家有用~ 第1章 一、填空 1&#xff0e;计算机由 硬件 系统和 软件 系统两个部分组成&#xff0c;它们构成了一个完整的计算机系统。 2&#xff0e;按功能划分&#xff0c;软件可分为 系统 软件和 应用 软件两种。 3&am…

【《操作系统慕课版》合集】期末复习 + 核心算法整理 + 课后答案

所有章节归类好了概念、算法&#xff0c;同时课后的简答题也一并给出了答案。祝各位复习愉快~ 整理不易希望能点个赞~ 目录 第一章 操作系统概述 第二章 进程的描述与控制 第三章 处理机调度与死锁 第四章 进程同步 第五章 存储器管理 第六章 虚拟存储器 第七章 输入输…

计算机操作系统习题

作业一 操作系统的主要功能有&#xff08; &#xff09;。 &#xff08;3.0分&#xff09; A、进程管理、存储器管理、设备管理、处理机管理 B、虚拟存储管理、处理机管理、进程管理、文件管理 C、处理机管理、存储器管理、设备管理、文件管理 D、进程管理、中断管理、设备管理…