持续创作,加速成长!这是我参与「掘金日新计划 · 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
会重新调整通道值为 0
到 255
区间范围内(色调除外,色调值在 0
和 180
之间)。这便于我们将这些通道显示为灰度图像,图像的值通道可视化结果如下所示:
图像的饱和度通道可视化结果如下所示:
最后,图像的色调通道可视化结果如下所示:
引入直觉色彩空间是因为它们与人类观察色彩的方式相对应,事实上,人类更喜欢用直观的属性来描述颜色,比如色调、色彩和亮度,这三个属性是大多数直觉色彩空间的基础。色调 (Hue
) 指定主色,不同颜色(如绿色、黄色、蓝色和红色)对应于不同的色调值;饱和度 (saturation
) 指示颜色的鲜艳程度,柔和的颜色饱和度较低,而艳丽的颜色饱和度较高;亮度 (brightness
) 是一种主观属性,指的是颜色的亮度。其他直觉色彩空间使用颜色值 (value
) 或颜色亮度 (lightness
) 作为表征相对颜色强度的一种方式。
这些颜色成分试图模拟人类对颜色的直觉感知,因此,它们没有标准定义。在不同资料中,我们可能会看到色相、饱和度和亮度的不同定义和公式。OpenCV
提出了两种直觉色彩空间的实现:HSV
和 HLS
色彩空间。转换公式略有不同,但它们得到的结果非常相似。