颜色空间
不同色彩空间显示效果是不一样的。
RGB 人眼的色彩空间
HSV 色彩空间
HSV 代表色相(Hue)、饱和度(Saturation)、明度(Value),这三个分量描述了颜色的不同方面:
- 色相(Hue): 表示颜色的种类,以角度度量(0°到360°)。常见的颜色如红、绿、蓝等都有特定的色相值。
- 饱和度(Saturation): 表示颜色的纯度或灰度。饱和度为0时,颜色变成灰度,为1时,颜色是完全饱和的。
- 明度(Value): 表示颜色的明亮程度。数值范围从0到1,其中0代表黑色,1代表最亮的颜色。
opencv 倾向于使用 hsv.
import cv2
import numpy as np
# 读取图像
image = cv2.imread('example.jpg')
# 将图像从 BGR 转换为 HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
HSL
HSL 是另一种颜色空间,表示颜色的方式与 RGB 和 HSV 略有不同。HSL 代表色相(Hue)、饱和度(Saturation)、亮度(Lightness),这三个分量描述了颜色的不同方面:
- 色相(Hue): 表示颜色的种类,以角度度量(0°到360°)。HSL 色相与 HSV 色相是相同的。
- 饱和度(Saturation): 表示颜色的纯度或灰度。饱和度为0时,颜色是灰度的,为1时,颜色是完全饱和的。
- 亮度(Lightness): 表示颜色的相对亮度。数值范围从0到1,其中0代表黑色,0.5是中间的灰度,1代表最亮的颜色。
HSL 色彩空间同样常用于图像处理和计算机视觉任务中。在 OpenCV 中,你同样可以使用 cv2.cvtColor 函数将图像从其他颜色空间(如 BGR)转换为 HSL。
HSL 用的比较少。
YUV
主要用在视频中。
YUV 是一种将亮度(Luminance)和色度(Chrominance)分离的颜色编码方式,常用于视频压缩和图像处理。YUV 的表示方式包括 Y、U、V 三个分量:
- Y(亮度): 表示图像的亮度信息,即灰度信息。Y 分量用于表示黑白图像的亮度,与 RGB 的灰度表示类似。
- U(蓝色色度): 表示蓝色的色度信息。U 分量描述了图像中蓝色和黄色的变化。在 YUV 中,U 分量越大,蓝色越强,越小则黄色越强。
- V(红色色度): 表示红色的色度信息。V 分量描述了图像中红色和绿色的变化。在 YUV 中,V 分量越大,红色越强,越小则绿色越强。
YUV 主要应用于视频编码和传输领域,其中 Y 分量用于表示亮度信息,而 U 和 V 分量则用于表示颜色信息。通过将颜色信息与亮度信息分离,可以更有效地进行压缩,因为人眼对亮度的感知更为敏感,而对颜色的感知相对较弱。
在 OpenCV 中,你可以使用 cv2.cvtColor 函数将图像从其他颜色空间(如 BGR)转换为 YUV。例如:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('example.jpg')
# 将图像从 BGR 转换为 YUV
yuv_image = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)
YUV420、YUV422、YUV444 是 YUV 颜色编码的不同变体,它们主要区别在于亮度(Y)和色度(U、V)分量的采样方式和存储结构。
YUV420:
采样方式: Y 分量进行全采样,而 U 和 V 分量进行水平和垂直方向的子采样。通常是 4:2:0 的采样方式,表示每 4 个 Y 值对应 2 个 U 和 2 个 V 值。
存储结构: 以块为单位存储,每个块中包含多个 Y、U、V 像素。Y 采样密集,而 U 和 V 采样相对稀疏。这是最常用于视频压缩的一种格式。
YUV422:
采样方式: Y 分量进行全采样,而 U 和 V 分量进行水平方向的子采样。通常是 4:2:2 的采样方式,表示每 4 个 Y 值对应 2 个 U 和 2 个 V 值。
存储结构: 类似 YUV420,以块为单位存储,但 U 和 V 采样略为密集,相对于 YUV420,存储要求更高。
YUV444:
采样方式: Y、U、V 分量均进行全采样,没有子采样。每个 Y、U、V 都有一个对应的采样值。
存储结构: 每个像素都有对应的 Y、U、V 值,存储密集。这是最高质量的 YUV 变体,但也需要更多的存储空间。
这些变体在视频压缩和传输中具有不同的应用场景。YUV420 常用于广播电视和视频流,因为它在保持相对较高图像质量的同时,能够更有效地压缩数据。YUV444 则通常用于图像和视频编辑等对图像质量要求较高的场景。
颜色空间转换代码示例
import cv2
def callback(userdata):
pass
cv2.namedWindow('color', cv2.WINDOW_NORMAL)
img = cv2.imread('./RMB.jpeg')
colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA,
cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV,
cv2.COLOR_BGR2YUV]
cv2.createTrackbar('curcolor', 'color', 0, 4, callback)
while True:
index = cv2.getTrackbarPos('curcolor', 'color')
#颜色空间转换API
cvt_img = cv2.cvtColor(img, colorspaces[index])
cv2.imshow('color', cvt_img)
key = cv2.waitKey(10)
print(key)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()