数字图像学笔记——1. 常用颜色空间转换

2024-02-29 17:30

本文主要是介绍数字图像学笔记——1. 常用颜色空间转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 常用颜色空间
    • 1. RGB颜色空间
    • 2. CMY/CMYK颜色空间
    • 3. HSL/HSI/HSV/HSB颜色空间
    • 4. Lab颜色空间
    • 5. YUV/YCbCr 颜色空间
  • 使用OpenCV对颜色空间进行转化

常用颜色空间

1. RGB颜色空间

这是一种由发光元件(例如显示器)所定义的颜色空间, 包含最基本的三原色(红, 绿, 蓝). 生活中所接触到的图像, 大部分由RGB空间表示. 它的一个缺点就是把色调、亮度、饱和度糅合在了一起. 在某一些领域, 例如科学研究、制图绘图等不常采用.

在这里插入图片描述
在这里插入图片描述

2. CMY/CMYK颜色空间

它是工业印刷采用的颜色空间, 基本颜色主要由洋红、黄色、青色、黑色组成。它与RGB的红、黄、蓝相对应, RGB的颜色叠加越多颜色发白, 而CMY叠加的颜色越多颜色越暗, 由于在研究领域方面也比较少用到这个颜色空间, 由于这是一种印刷界使用的标准颜色空间, 因此对于出版行业的人来说比较熟悉. 对于专注于图像研究的我们来说, 只要了解这个颜色空间就行.

在这里插入图片描述

3. HSL/HSI/HSV/HSB颜色空间

这是一种在绘图领域比较常见的颜色表达, 主要分为色调、饱和度、明度或者强度. 比如说在PS中, 你可以调出HSV色板, 可以通过调节饱和度和明度, 感受某种颜色的变化情况. 这是一种以光影强度变化为特征的颜色空间体系.

在这里插入图片描述
尽管叫法和名称在不同资料上可能有所不同, 但本质是一样的 (hue, saturation, indensity/value/light), 如果从波的角度来看这个问题, 色调就是不同的频率, 也就是光谱. 饱和度表示接收端接收到的光信号衰减程度, 而明度表示发射端发射的光波强度, 明度与饱和度共同决定了某个颜色最终表现的情况.

4. Lab颜色空间

Lab颜色模型是由CIE(国际照明委员会)制定的一种色彩模式。自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB空间还要大。另外,这种模式是以数字化方式来描述人的视觉感应, 与设备无关,所以它弥补了RGB和CMYK模式必须依赖于设备色彩特性的不足。由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。这就意味着RGB以及CMYK所能描述的色彩信息在Lab空间中都能 得以影射。

以笛卡尔空间表示, 它有三个轴, L轴是光亮度, 值越大颜色越发白; A轴正半轴是红色, 负半轴是绿色; B轴正半轴是黄色, 负半轴是蓝色.

在这里插入图片描述
在这里插入图片描述

RGB转Lab颜色空间的方式:

RGB没法直接转换到LAB空间, 通常需要先转换到XYZ空间后, 再转换到LAB空间.

[ X Y Z ] = [ 0.412453 0.357580 0.180423 0.212671 0.715160 0.072169 0.019334 0.119193 0.950227 ] ⋅ [ R G B ] \begin{bmatrix} X\\ Y\\ Z \end{bmatrix} = \begin{bmatrix} 0.412453 & 0.357580 & 0.180423 \\ 0.212671 & 0.715160 & 0.072169 \\ 0.019334 & 0.119193 & 0.950227 \end{bmatrix} \cdot \begin{bmatrix} R\\ G\\ B \end{bmatrix} XYZ=0.4124530.2126710.0193340.3575800.7151600.1191930.1804230.0721690.950227RGB

[ R G B ] = [ 3.240479 − 1.537150 − 0.498535 − 0.969256 1.875992 0.041556 0.055648 − 0.204043 1.057311 ] ⋅ [ X Y Z ] \begin{bmatrix} R\\ G\\ B \end{bmatrix} = \begin{bmatrix} 3.240479 & -1.537150 & -0.498535 \\ -0.969256 & 1.875992 & 0.041556 \\ 0.055648 & -0.204043 & 1.057311 \end{bmatrix} \cdot \begin{bmatrix} X\\ Y\\ Z \end{bmatrix} RGB=3.2404790.9692560.0556481.5371501.8759920.2040430.4985350.0415561.057311XYZ

XYZLAB空间转换

L = 116 f ( Y / Y ∗ ) − 16 L = 116f(Y/Y^{*}) - 16 L=116f(Y/Y)16

a = 500 [ f ( X / X ∗ ) − f ( Y / Y ∗ ) ] a = 500[f(X/X^{*}) - f(Y/Y^{*})] a=500[f(X/X)f(Y/Y)]

b = 200 [ f ( Y / Y ∗ ) − f ( Z / Z ∗ ) ) ] b = 200[f(Y/Y^{*}) - f(Z/Z^{*}))] b=200[f(Y/Y)f(Z/Z))]

其中:

f ( t ) = { t 1 3 t > δ 3 t 3 δ 2 + 4 29 o t h e r w i s e f(t) = \left\{\begin{matrix} t^{\frac{1}{3}} & t > \delta ^ 3 \\ \frac{t}{3 \delta^2} + \frac{4}{29} & otherwise \end{matrix}\right. f(t)={t313δ2t+294t>δ3otherwise

δ = 6 29 \delta = \frac{6}{29} δ=296

RGB取值范围, 如果不特别说明, 通常研究以 [ 0 , 1 ] [0, 1] [0,1]表示, 所以RGB转换为XYZ后, 为了归一, XYZ会分别除以0.950456、1.0、1.088754, 这是因为:

X ∗ = 0.412453 + 0.357580 + 0.180423 = 0.950456 X^{*} = 0.412453 + 0.357580 + 0.180423 = 0.950456 X=0.412453+0.357580+0.180423=0.950456
Y ∗ = 0.212671 + 0.715160 + 0.072169 = 1.0 Y^{*} = 0.212671 + 0.715160 + 0.072169 = 1.0 Y=0.212671+0.715160+0.072169=1.0
Z ∗ = 0.019334 + 0.119193 + 0.950227 = 1.088754 ​ Z^{*} = 0.019334 + 0.119193 + 0.950227 = 1.088754 ​ Z=0.019334+0.119193+0.950227=1.088754

LABXYZ空间转换

X = X ∗ f − 1 ( L + 16 116 + a 500 ) X = X^{*} f^{-1} ( \frac{L + 16}{116} + \frac{a}{500} ) X=Xf1(116L+16+500a)
Y = Y ∗ f − 1 ( L + 16 116 ) Y = Y^{*} f^{-1} ( \frac{L + 16}{116}) Y=Yf1(116L+16)
Z = Z ∗ f − 1 ( L + 16 116 − b 200 ) Z = Z^{*} f^{-1} ( \frac{L + 16}{116} - \frac{b}{200} ) Z=Zf1(116L+16200b)

其中:

F ( L ) = L + 16 116 F(L) = \frac{L + 16}{116} F(L)=116L+16

f − 1 ( t ) = { t 3 t > δ 3 δ 2 ( t − 4 29 ) o t h e r w i s e f^{-1}(t) = \left\{ \begin{matrix} t^{3} & t > \delta \\ 3 \delta ^ 2 ( t - \frac{4}{29} ) & otherwise \end{matrix}\right. f1(t)={t33δ2(t294)t>δotherwise

5. YUV/YCbCr 颜色空间

YUV与YCbCr是同一种类型的颜色空间表达方式, 其中Y表示亮度, UV表示两种不同的颜色信号, 也就是构成最终颜色的颜色分量, 在YCbCr颜色空间体系下, 颜色表示如下:

在这里插入图片描述
Y的表示, 在UV不变的情况下, 表现如下:

在这里插入图片描述
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

广播、视频和成像标准使用YUV色彩空间还有一个重要的原因,就是与人的视觉系统很有关系。人类的眼睛对低频信号比对高频信号具有更高的敏感度。事实上,人类的眼睛对明视度的改变也比对色彩的改变要敏感的多。因此对人类而言,Y分量比U分量重要,根据人眼的这一特征,在不使用任何复杂算法的前提下, 可以适当地抛弃U和V分量以达到压缩的目的,这就是部分取样(subsampling)。

YUV与YCrCb的区别:YCrCb颜色空是由YUV颜色空间派生的一种颜色空间。YCbCr是在世界数字组织视频标准研制过程中作为ITU-R BT.601建议的一部分,其实是YUV经过缩放和偏移的翻版。YCrCb中的Y与YUV中的Y含义一致,Cb、Cr同样都指色彩,只是在表示方法上不同。YCbCr中,Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。在YUV家族中,YCbCr是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。YCbCr有许多取样格式。

[ Y U V ] = [ 0.299 0.587 0.114 − 0.14713 − 0.28886 0.436 0.615 − 0.51499 − 0.10001 ] ⋅ [ R G B ] \begin{bmatrix} Y\\ U\\ V \end{bmatrix} = \begin{bmatrix} 0.299 & 0.587 & 0.114 \\ -0.14713 & -0.28886 & 0.436 \\ 0.615 & -0.51499 & -0.10001 \end{bmatrix} \cdot \begin{bmatrix} R\\ G\\ B \end{bmatrix} YUV=0.2990.147130.6150.5870.288860.514990.1140.4360.10001RGB

[ R G B ] = [ 1 0 1.13983 1 − 0.39465 − 0.58060 1 2.03211 0 ] ⋅ [ Y U V ] \begin{bmatrix} R\\ G\\ B \end{bmatrix} = \begin{bmatrix} 1 & 0 & 1.13983 \\ 1 & -0.39465 & -0.58060 \\ 1 & 2.03211 & 0 \end{bmatrix} \cdot \begin{bmatrix} Y\\ U\\ V \end{bmatrix} RGB=11100.394652.032111.139830.580600YUV

YUV主要采样格式: YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。

(1)、YUV 4:4:4:无压缩,YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。

(2)、YUV 4:2:2:压缩33.3%,每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存。

(3)、YUV 4:1:1: 压缩50%,4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存。

每个点保存一个8bit的亮度值(也就是Y值),每2x2个点保存一个Cr和Cb值, 图像在肉眼中的感觉不会起太大的变化。所以,原来用RGB(R,G,B都是8bit unsigned)模型,1个点需要8x3=24bits,(全采样后,YUV仍各占8bit)。按4:1:1采样后,而现在平均仅需要 8+(8/4)+(8/4)=12bits(4个点,8*4(Y)+8(U)+8(V)=48bits), 平均每个点占12bits。这样就把图像的数据压缩了一半。

(4)、YUV4:2:0: 压缩50%,4:2:0并不意味着只有Y、Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。绝大多数视频编解码器都采用这种格式作为标准的输入格式。

使用OpenCV对颜色空间进行转化

import matplotlib.pyplot as plt
import cv2img_BGR = cv2.imread('test.jpg') # BGR
plt.subplot(3,3,1); plt.imshow(img_BGR);plt.axis('off');plt.title('BGR')img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
plt.subplot(3,3,2); plt.imshow(img_RGB);plt.axis('off');plt.title('RGB')img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
plt.subplot(3,3,3); plt.imshow(img_GRAY);plt.axis('off');plt.title('GRAY')img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
plt.subplot(3,3,4); plt.imshow(img_HSV);plt.axis('off');plt.title('HSV')img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
plt.subplot(3,3,5); plt.imshow(img_YcrCb);plt.axis('off');plt.title('YcrCb')img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
plt.subplot(3,3,6); plt.imshow(img_HLS);plt.axis('off');plt.title('HLS')img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
plt.subplot(3,3,7); plt.imshow(img_XYZ);plt.axis('off');plt.title('XYZ')img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
plt.subplot(3,3,8); plt.imshow(img_LAB);plt.axis('off');plt.title('LAB')img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
plt.subplot(3,3,9); plt.imshow(img_YUV);plt.axis('off');plt.title('YUV')

[参考资料]

  • 《数字图像处理之6大颜色空间》, 王圣亚, https://zhuanlan.zhihu.com/p/28741691
  • 《对颜色空间YUV、RGB的理解》, 打字员小钻风, https://blog.csdn.net/asahinokawa/article/details/80596655
  • 《CIELAB color space》, Wikipedia, https://en.wikipedia.org/wiki/CIELAB_color_space#CIELAB%E2%80%93CIEXYZ_conversions
  • 《颜色空间YUV简介》, fengbingchun, https://blog.csdn.net/fengbingchun/article/details/50216901
  • 《YUV》, Wikipedia, https://en.wikipedia.org/wiki/YUV#:~:text=White%2C%20RGB%3D(1%2C%201,be%20in%20linear%20RGB%20space.
  • 《颜色空间及cv2.cvtColor 转换函数》, AIHGF, https://www.aiuai.cn/aifarm365.html

这篇关于数字图像学笔记——1. 常用颜色空间转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759498

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP