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


64

我看到了遍及整个地方的HSV色彩空间:用于跟踪,人体检测等...我想知道,为什么?与使用RGB相比,使它更好的色彩空间是什么?


3
这个问题问得好。在我看来,它可以从更详细的内容中受益:什么是HSV,什么是RGB。由于大多数答案都在比较HSV和RGB,因此可以改写标题以比较这两个颜色空间。
PhilMacKay 2012年

2
另一个好问题可能是:“为什么在各地都使用HSV而不是HSL?”
posfan12

Answers:


60

简单的答案是,与RGB不同,HSV亮度或图像强度与色度或颜色信息分开。这在许多应用程序中非常有用。例如,如果要对彩色图像进行直方图均衡化,则可能只希望对强度分量进行此操作,而不必对颜色分量进行处理。否则,您将获得非常奇怪的颜色。

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

但是请注意,HSV是将颜色与强度分开的许多颜色空间之一(请参见YCbCr,Lab等)。单纯使用HSV的原因很简单,因为RGB和HSV之间进行转换的代码已广泛使用并且也很容易实现。例如,用于MATLAB的图像处理工具箱包含函数rgb2hsvhsv2rgb


42

颜色信息通常比HSV信息嘈杂得多。

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

通常,您可以从HSV色彩空间中获得更好的信息。让我尝试再次给出一个个人经验的示例:尝试想象您的单色平面图像上有阴影。在RGB色彩空间中,阴影部分很可能与没有阴影的部分具有非常不同的特征。在HSV色彩空间中,两个色块的色相分量很可能相似:阴影将主要影响饱和度分量,而色相则指示主要的“颜色”(没有亮度和白色稀释度) / black)应该不会有太大变化。

如果您觉得这些解释不直观,我建议:

  • 尝试并更好地了解用于表示HSV色彩空间中的颜色的组件,并重新获得RGB知识
  • 尝试看看开发这种颜色表示的原因:总是以某种方式,基于人类对颜色的解释的某种观点

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

  • 在掌握了这一点并发展了一些直觉之后,您应该使用图像:尝试分解其RGB和HSV分量中的各种图像

    您的目标是查看和理解包含阴影,强光照,光反射的图像在这些分解中的区别。

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


1
如果是阴影,则应仅更改亮度-而不更改饱和度。
Andrey Rubshtein 2012年

就像我说的那样,@ Andrey我本人并没有从事基于颜色的方法,但是我可以推测,如果它不仅是阴影,可能是周围环境的一些间接照明或类似的作用。
penelope 2012年

1
你是对的。但是,在间接照明的情况下,色相也会改变。
安德烈·鲁布施泰因

1
@Andrey因此,我的措辞是:“更有可能”,“相似”,“主要影响”……毕竟,我并没有解释HSV,只是给出一些示例并根据经验进行有根据的猜测。而且,为任何应用程序选择最合适的色彩空间的最佳方法是使用图像数据库和不同的色彩空间
penelope 2012年

3
阴影中因此没有被主光源(太阳)照亮的任何事物都被辅助光源(天空)照亮,天空是巨大,明亮且非常蓝的光。在人眼中,红色仍然看起来是红色的,因为我们的眼睛进行的是相对颜色的测量,而不是绝对颜色,这就是为什么您的室内非闪光照片看起来比您想象的要黄的原因。我绝对同意使用您的实际图像数据库。
约翰·罗伯逊

8

仅使用色相组件会使算法对光照变化的敏感性降低(如果不是不变的话)。

另一个流行的选择是LAB色彩空间,其中AB通道代表颜色,而AB空间中的欧几里得距离与人类对色彩的感知更好地匹配。同样,忽略L通道(亮度)会使算法对光照差异更鲁棒。


7

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

我会详细说明:

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

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

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

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

希望这可以帮助!


2
我不同意。这里有三个领域,而不是两个领域:人,计算机和物理。RGB模型来自人眼,具有三个颜色接收器。
MSalters 2012年

@MSalters我认为我们在谈论同样的事情(尽管也许我还没有完全弄清楚自己)。RGB显示器的制造符合我们的色彩感知系统。它们具有计算机对应部分,即(R,G,B)“坐标”。由于这些坐标映射到实现,而与物理,“真实自然”色彩的性质,但它们不适合于执行一些数学处理,例如感知线性梯度内插,色彩校正,亮度和饱和度OPS等
heltonbiker

2

HSV代表色相饱和度值。它实际上是一种彩色平面表示形式(例如RGB,YCbCr等)。

它是一种与设备无关的颜色表示格式:HSV颜色表示可用于检测特定的颜色类型,例如:肤色,火色等。

Matlab将RGB图像转换为HSV平面的功能是rgb2hsv('/inputimage_name')


1

我会给你一个例子来理解。就像我们的手有很多部分一样,手掌,后手掌及其下方。我们可以在这些区域看到不同的颜色变化,但是所有这些区域的色相变化不大,因此色相值在手分割中很有用。


1

据我所知,与YUV或LAB相比,HSV特别好,因为它可以更好地进行特征提取和照明不变性或可视化。我猜HSV是更常用的一种,因为约定和连续性:如果您使用相同的色彩空间,则它更易于比较结果并相互交流。

话虽如此,HSV(而不是RGB)用于计算机视觉的原因有两个:

  1. 可视化。只要您在图像上密集地获得了方向信息,那么HSV就是一个很好的可视化色彩空间。可以在HSV上绘制颜色,而不是在图像上绘制很少的矢量(它们会使所有内容杂乱无章),方法是将方向矢量映射到H(矢量角度)和S(矢量幅度)。这将留下Value组件,可以根据需要实现的方式以多种方式进行设置。请参阅以下来自Middlebury光流数据集的示例。HSV用于密集显示方向。

来自Middlebury DB的光流示例

  1. 特征提取和照度不变,如其他答案所述。

0

如其他人所述,将亮度与色度分开是有益的。根据落在物体上的光量,场景中的亮度变化很大。另一方面,色度与物体的内在属性具有更好的关联,并且对于适当的白平衡图像而言,或多或少是不变的。

但是,我想补充一点,HSV,HSL或实际上任何具有色度平面极性参数化的色彩空间都是为此目的的不佳选择。这是因为它们在灰度线(哪个色调是灰色?)上引入了奇异性,使它们对噪声和白平衡非常敏感。此外,在极坐标系中比较两种颜色并不是那么简单。还应注意,HSV中的值或HSL中的亮度都不对应于人类感知的亮度或任何其他物理量度的能量。

有很多线性色彩空间可以提供相同的色度-色度分离,同时又能保持线性度(YCbCr,YUV)或正确模拟人类视觉(LUV,LAB)。使用这些颜色,您可以使用欧几里得L2范数在其色度上比较两种颜色,从而使算法总体上更可靠。

为什么那么频繁使用HSV / HSL?很难给出客观答案。根据我的经验,这主要是由于无知和RGB-> HSV转换例程的可用性。必须使用其作者不了解伽玛校正的代码,更不用说不同的色彩空间了。可见的代码将RGB转换为HSV,然后根据色相对图像进行了分割,而忽略了它是模块化数量的事实。我认为我们可以同意,这些不是出于任何原因支持的有意识的决定。


-1

与RGB,YUV,Lab等相比,HSV颜色模型与人类如何看待彩色物体的相关性更高。

我们看到物体是什么颜色(色调),饱和度是多少(饱和度),以及多少白光照射在其上(完整性)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.