数字图像学笔记——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

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno