OpenCV用色调、饱和度和亮度表示颜色

368 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

前言

我们已经学习如何使用不同的色彩空间并尝试识别具有特定颜色的图像区域。例如,RGB 颜色空间虽然是电子成像系统中颜色捕获和显示的有效表示,但这种表示不是很直观,因为,这并不是人类观察颜色的方式。我们通常根据色调、亮度或色彩(即颜色是鲜艳的还是柔和的)来谈论颜色,因此,引入了基于色调、饱和度和亮度概念的直觉色彩空间(phenomenal color spaces),以使用更直观的属性指定颜色。在本节中,我们将介绍并利用色相、饱和度和亮度作为描述颜色的一种方式。

 

用色调、饱和度和亮度表示颜色

BGR 图像转换为直觉色彩空间同样需要使用 cv::cvtColor 函数完成。

1. 使用 cv::COLOR_BGR2HSV 转换 BGR 色彩空间:

// 转换色彩空间
cv::Mat hsv;
cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);

2. 我们可以使用 cv::COLOR_BGR2HSV 将图像转换回到BGR空间。我们可以通过将转换后的图像通道拆分为三个独立的图像来可视化 HSV 图像的每个组成通道:

// 分割图像通道
std::vector<cv::Mat> channels;
cv::split(hsv, channels);

由于处理的图像为 8 位图像,OpenCV 会重新调整通道值为 0255 区间范围内(色调除外,色调值在 0180 之间)。这便于我们将这些通道显示为灰度图像,图像的值通道可视化结果如下所示:

值通道

图像的饱和度通道可视化结果如下所示:

饱和度通道

最后,图像的色调通道可视化结果如下所示:

色调通道  

引入直觉色彩空间是因为它们与人类观察色彩的方式相对应,事实上,人类更喜欢用直观的属性来描述颜色,比如色调、色彩和亮度,这三个属性是大多数直觉色彩空间的基础。色调 (Hue) 指定主色,不同颜色(如绿色、黄色、蓝色和红色)对应于不同的色调值;饱和度 (saturation) 指示颜色的鲜艳程度,柔和的颜色饱和度较低,而艳丽的颜色饱和度较高;亮度 (brightness) 是一种主观属性,指的是颜色的亮度。其他直觉色彩空间使用颜色值 (value) 或颜色亮度 (lightness) 作为表征相对颜色强度的一种方式。

这些颜色成分试图模拟人类对颜色的直觉感知,因此,它们没有标准定义。在不同资料中,我们可能会看到色相、饱和度和亮度的不同定义和公式。OpenCV 提出了两种直觉色彩空间的实现:HSVHLS 色彩空间。转换公式略有不同,但它们得到的结果非常相似。