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

持续创作,加速成长!这是我参与「掘金日新计划 · 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 色彩空间。转换公式略有不同,但它们得到的结果非常相似。