为什么我们在视觉和图像处理中如此频繁地使用 HSV 颜色空间?

信息处理 图像处理 计算机视觉
2022-01-08 20:48:21

我看到到处都在使用 HSV 颜色空间:用于跟踪、人体检测等……我想知道,为什么?这个色彩空间是什么使它比使用 RGB 更好?

4个回答

简单的答案是,与RGB不同,HSVluma或图像强度与色度或颜色信息分开。这在许多应用程序中非常有用。例如,如果您想对彩色图像进行直方图均衡,您可能只想在强度分量上执行此操作,而不理会颜色分量。否则你会得到非常奇怪的颜色。

在计算机视觉中,出于各种原因,您经常希望将颜色分量与强度分开,例如对光照变化的鲁棒性或去除阴影。

但是请注意,HSV 是将颜色与强度分开的众多颜色空间之一(参见 YCbCr、Lab 等)。经常使用 HSV 只是因为用于在 RGB 和 HSV 之间转换的代码广泛可用并且也可以轻松实现。例如,MATLAB 的图像处理工具箱包括函数rgb2hsvhsv2rgb.

颜色信息通常比 HSV 信息更嘈杂。

让我举个例子:我和一些朋友参与了一个处理真实场景视频中交通标志识别的项目(噪音、阴影,有时还存在遮挡)。这是一个更大项目的一部分,因此我们有时间尝试不同的方法来解决这个特定问题(并重用旧方法)。我自己没有尝试基于颜色的方法,但我记得一个有趣的信息:_STOP 标志中的主要 RGB 分量通常不是红色!(主要是由于阴影)

您经常可以从 HSV 颜色空间中获得更好的信息让我再举一个个人经验的例子:试着想象你有一个单色平面的图像,上面有阴影。在 RGB 颜色空间中,阴影部分很可能与没有阴影的部分具有非常不同的特征。在 HSV 颜色空间中,两个色块的色调分量更可能相似:阴影将主要影响,或者可能是饱和度分量,而色调表示主要的“颜色”(没有亮度和被白色稀释/black) 不应该改变太多。

如果这些解释对您来说听起来不直观,我建议:

  • 尝试并更好地理解用于在 HSV 颜色空间中表示颜色的组件,并更新您的 RGB 知识

  • 试着看看为什么这些颜色表现被开发出来的原因:它总是以某种方式,基于人类对颜色的解释

    例如,孩子们实际上并不喜欢高度着色==有价值的物体,他们更喜欢高度饱和的物体,颜色强烈且未稀释的物体

  • 在你得到这个并培养一些直觉之后,你应该玩图像:尝试在它们的 RGB 和 HSV 组件中分解各种图像

    您的目标是查看和理解包含阴影、强照明、光反射的图像的这些分解的差异。

  • 如果您有喜欢玩的特定类型的图像,请尝试分解它们:谁知道呢,也许 RGB 真的比 HSV 更适合您的需求 :)

仅使用 Hue 组件会使算法对照明变化不太敏感(如果不是不变的话)。

另一个流行的选项是 LAB 颜色空间,其中 AB 通道代表颜色,AB 空间中的欧式距离更符合人类对颜色的感知。同样,忽略 L 通道(亮度)使算法对光照差异更加稳健。

我能想到的最佳答案是:RGB 与关于 RGB 显示颜色方式的“实现细节”有关,而 HSV 与“实际颜色”组件有关。另一种说法是 RGB 是计算机处理颜色的方式,而 HSV 试图捕捉我们人类感知颜色方式的组成部分。

我会详细说明:

颜色是基于电磁波的感知。这些波的自然属性是例如强度和频率。如果我们将光波的频率从红外线扫描到紫外线,我们会在视觉上感知到彩虹色的颜色变化。彩虹色可以被认为是“纯色”,因为它们由单频波表示。

现在人眼只能对三种主要的光频率做出反应或“共振”,这并不奇怪,红色、绿色和蓝色。事实是这种响应是非线性的,因此视网膜可以通过三种颜色分量的组合响应来区分给定的纯色(以及隐含的“频率”)

RGB 颜色空间的存在只是为了模仿我们视网膜的内部运作,因此绝大多数颜色可以通过方便的(从计算机的角度)24 位/像素颜色在计算机显示器上表示编码。RGB 颜色空间与自然颜色属性没有内在关系,也与人类对颜色的解释没有内在关系。

例如,在 RGB 空间中按通道执行的任何算术运算(例如,颜色渐变的生成)都会给出非常粗略甚至明显“错误”的结果。这就是为什么建议通过将色标从 RGB 转换为其他颜色空间(HLS、Lab 等)、执行插值、然后将插值转换回 RGB 来创建颜色图的原因。

希望这可以帮助!