27

HSL 是否优于 HSI 和 HSV,因为它考虑了人类的感知。对于某些图像处理算法,他们说我可以使用这些色彩空间中的任何一种,但我不确定该选择哪一种。我的意思是,算法只关心你为它们提供色调和饱和度通道,你可以选择使用哪个颜色空间

4

6 回答 6

32

哪一个最好很大程度上取决于您使用它的目的。但根据我的经验,HSL(HLS)在亮度和饱和度之间存在不幸的相互作用。

这是一个将图像亮度降低 2 的示例。最左边的图像是原始图像;接下来是使用 RGB、HLS 和 HSV 的结果:

RGB、HLS、HSV 比较

请注意 HLS 中蝴蝶边缘周围过于明亮和饱和的斑点,尤其是底部的红色斑点。这就是我所指的饱和问题。

此示例是在 Python 中使用colorsys 模块创建的,用于转换。

于 2012-07-09T20:33:04.253 回答
24

由于还没有公认的答案,而且我必须进一步研究才能完全理解这一点,所以我会加两分钱。

就像其他人所说的那样,关于 HSL 或 HSV 哪个更好的答案取决于您尝试建模和操作的内容。

tl;dr - HSV 在机器视觉方面仅HSL“更好”(有警告,请阅读下文)。“实验室”和其他正式的颜色模型要准确得多(但计算成本高),应该真正用于更严肃的工作。HSL 更适合“绘画”应用程序或任何其他需要人工“设置”、“输入”或以其他方式理解/理解颜色值的应用程序。

有关详细信息,请阅读以下内容:




如果您尝试对颜色的生成方式进行建模,最直观的模型是 HSL,因为它几乎直接映射到您如何混合颜料来创建颜色。例如,要创建“深”黄色,您可以将基础黄色涂料与一点黑色混合。而要创建较浅的黄色阴影,您需要混合一点白色。

HSL 中“L”光谱中 50 到 0 之间的值映射到必须混合多少“黑色”(黑色从 0 增加到 100%,随着 L 从 50 减少到 0)。

50 到 100 之间的值映射到必须混合多少“白色”(随着 L 从 50% 增加到 100%,白色从 0% 变化到 100%)。

50%“L”为您提供“最纯净”的颜色形式,没有任何来自白色或黑色的“污染”。


来自以下链接的见解:
1. http://forums.getpaint.net/index.php?/topic/22745-hsl-instead-of-hsv/ 那里的最后一篇文章。
2. http://en.wikipedia.org/wiki/HSL_and_HSV 检查 HSL 的颜色空间圆柱体 - 它非常清楚地了解我所讨论的分布类型。

另外,如果您在任何时候都处理过油漆,那么上述解释(希望)是有意义的。:)


因此,HSL 是理解如何“生成”颜色的一种非常直观的方式 - 因此它是绘画应用程序或任何其他针对习惯于以“阴影”/“色调”术语思考的受众的应用程序的绝佳模型为颜色。




现在,进入 HSV。

现在这是一个危险的领域,因为我们进入了一个基于我为理解 HSV 而制定的理论的空间,并且没有得到其他来源的验证或证实。

在我看来,HSV 中的“V”映射到物体上投射的光量,假设在零光下,物体将是完全黑暗的,而在 100% 的光下,它会是全白的。

因此,在这个苹果图像中,直接面对光源的点全是白色的,并且很可能在 100% 处有一个“V”,而底部完全处于阴影中且不受光影响的点有一个值“0”。(我没有检查这些值,只是认为它们对解释有用)。

因此,HSV 似乎比 HSL 更好地模拟了物体是如何被照亮的(因此可以解释您在机器视觉应用程序中可能必须对镜面高光或阴影执行的任何补偿)。




但是,正如您从我链接到的 Wikipedia 文章中“缺点”部分的示例中可以清楚地看到的那样,这些方法都不是完美的。“实验室”和其他更正式(计算成本更高)的颜色模型做得更好。

PS:希望这对某人有所帮助。

于 2013-06-27T18:11:08.400 回答
10

唯一具有优势并考虑到人类感知的色彩空间是LAB,因为其中的欧几里得度量与人类色彩差异相关。

直接取自维基百科:

与 RGB 和 CMYK 颜色模型不同,Lab 颜色旨在接近人类视觉。它渴望感知均匀性,其 L 分量与人类对亮度的感知非常匹配

这就是许多计算机视觉算法正在利用 LAB 空间的原因

HSVHSB并且HSI没有这个属性。所以答案是否定的,HSL不是人类感知意义上的HSI“优越”。HSV

如果你想接近人类的感知,试试LAB色彩空间。

于 2012-07-09T14:22:19.993 回答
7

我会说一个不比另一个好,每个都只是另一个的数学转换。不同的表示可以使您想要的效果更容易处理图像。每个人对图像的感知都会略有不同,使用 HSI 或 HSV 可能会在输出图像中提供微小的差异。

甚至在针对系统(即像素阵列)考虑时,RGB 也会考虑到人类的感知。当成像器(带有拜耳覆盖)拍照时,每 1 个红色和蓝色像素对应 2 个绿色像素。显示器仍以 RGB 输出(尽管大多数显示器的红色和蓝色只有一个绿色像素)。夏普制造的新电视显示器现在具有黄色输出像素。他们这样做的原因是由于实际频谱中存在黄色带,因此为了更好地真实表示颜色,他们添加了黄色带(或像素)。

所有这些都是基于人眼对绿色的敏感性高于光谱中的任何其他颜色。

无论如何,无论您使用什么比例,图像都将转换回 RGB 以显示在屏幕上。

http://hyperphysics.phy-astr.gsu.edu/hbase/vision/colcon.html

http://www.physicsclassroom.com/class/light/u12l2b.cfm

简而言之,我不认为任何一个比另一个更好,只是不同的表示。

http://en.wikipedia.org/wiki/Color

于 2012-07-09T14:17:53.797 回答
7

Imma 在这里投入两分钱,既是一名程序员,也是一名在艺术学校获得色彩理论的人,然后才开始明智地从事软件工程职业。

HSL/HSV 非常适合轻松编写编程功能来处理颜色,而无需处理大量边缘情况。它们在准确复制人类对颜色的感知方面很糟糕。

CMYK 非常适合渲染打印内容,因为它近似于打印机所依赖的颜料。准确地复制人类对颜色的感知也很糟糕(虽然不是因为它本身很糟糕,而是因为计算机真的不擅长在屏幕上显示它。稍后会详细介绍)

RGB 是技术中唯一能够准确有效地反映人类视觉的颜色实用程序。LAB 本质上只是在引擎盖下解析为 RGB。还值得考虑的是,屏幕上的文字像素是 RGB 的表示,这意味着您使用的任何其他颜色空间在实际显示时都会被解析回 RGB。真的,最好只是去掉中间人,并在几乎每一种情况下都使用它。

RGB 在编程意义上的问题在于它在表示上本质上是立方的,而 HSL/HSV 都以半径解析,这使得以编程方式创建“色轮”变得更加容易。如果不编写大量代码来处理,RGB 很难做到这一点,因为它在数据表示方面是立方解析的。然而,RGB 非常准确地反映了人类的视觉,它也是显示器所包含的实际硬件的基础。

TLDR;如果你想死在颜色上并且不介意额外的工作,那就一直使用 RGB。如果您想开发一个“足够好”的颜色实用程序,并且可能在以后遇到您无法真正做任何事情的错误票,请使用 HSL/HSV。如果您正在打印,请使用 CMYK,不是因为它好,而是因为如果您不使用它,打印机会窒息,即使它很糟糕。


顺便说一句,如果您像艺术家而不是程序员一样处理色彩理论,您会发现与任何关于色彩的技术规范真正传达的截然不同的看法。请记住,任何使用您创建的颜色实用程序的人基本上都会按照这些思路进行思考,至少如果他们在颜色理论方面有扎实的基础教育。这基本上是艺术家如何处理颜色的概念:

从艺术的角度来看,颜色基本上是在五个平面上表示的。

  • 颜料(或色调),这是您要追求的实际基础颜色。
  • 色调,即与纯白色混合的颜料。
  • 色度,即与纯黑色混合​​的颜料。
  • 色调(或“True Tone”),即颜料与不同程度的灰色混合。
  • 丰富的色调(或“大地色调”),这是一种与其互补色混合的颜料。丰富的色调不会出现在色轮上,因为它们本质上是对立面的混合,并且由于物理媒体中无法在机器上有效复制的细微差异,它们在视觉上的反映与“真实色调”略有不同。

以编程方式表示这种范式的典型问题是实际上没有任何好的方法来表示丰富的色调。材料艺术家在使用绘画时基本上没有问题,因为笔触的细微差异允许补语之间的潜在差异反映在构图中。同样地,数码摄影和视频在这方面都很糟糕,但实际的模拟电影在这方面并没有那么糟糕。它更多地反映在摄影和视频中而不是计算机图形中,因为相机视口中所有东西的纹理都会吸收其中的一部分,但仍然比实际观看相同的东西要少得多(这就是为什么你永远无法真正拍摄例如,一张日落的好照片,没有大量的后期制作来破解它的字面意思)。然而,计算机不擅长复制这些差异,因为颜色基本上会解析为 RGB 像素映射的一致矩阵,在视觉上看起来像是一个平坦的规则色调。没有计算颜色空间可以准确地反映丰富的色调,因为没有计算方法可以使颜色在空间上以漫反射、非重复随机方式略有变化,并且仍然有一个唯一的标识符,而且你不能很好将其存储为没有唯一标识符的数据。

您可以使用计算机对此进行的最佳近似是创建某种颜色的某种扩散重叠另一种颜色,这不会解析为您可以表示为十六进制代码或单个数据库列中的内容的单个值。即便如此,计算机将固有地反映统一的模式,其中真正丰富的色调依赖于随机性和不重复的纹理和变化,如果不付出相当大的努力,你就无法在机器上做到这一点。所有真正使色彩流行的艺术作品都依赖于这个原则,如果没有大量的辅助工作来模拟它,计算表示基本上是无法访问的(这就是我们有 Photoshop 和 Corel Painter 的原因,因为它们可以很好地模拟这些东西需要做一些工作,但代价是执行大量对运行时效率不高的过滤)。

从艺术的角度来看,RGB 是其他四个特征的一个很好的近似。我们几乎明白它不会涵盖丰富的色调,我们将不得不破解一个设计实用程序并手动将这部分混合。然而,用 RGB 编程的根本问题是它想要解析为 3 维空间(因为它是立方体),而您试图在二维显示器上呈现它,这使得创建合理的 UI 变得非常困难直观,因为您无法以任何对最终用户来说直观的方式有效地表示计算机显示器上第三轴的深度。


您还需要考虑表示为光的颜色和表示为颜料的颜色之间的区别。RGB 是表示为光的颜色表示,对应于用于混合照明以表示颜色的主要值,并且使用 1:1 映射来实现。CMYK 代表色素沉着光谱。区别在于,当你等量混合光时,你会得到白色,当你等量混合颜料时,你会得到黑色。如果您正在对任何使用计算机的实用程序进行编程,那么您就是在使用光,因为像素本质上是显示器上发出 RGB 光波的单个节点。我之所以说 CMYK 很烂,不是因为它不准确,而是因为当您尝试将其表示为光时它不准确,这在所有计算机显示器上都是如此. 如果您使用的是实际的油漆、记号笔、彩色铅笔等,它就可以了。然而,在屏幕上表示 CMYK 仍然必须解析为 RGB,因为这是计算机显示器的工作方式,所以它在显示方面总是有点偏离。


不要走得太远,因为这是一个编程论坛,而您作为程序员提出了这个问题。但是,如果您追求准确性,则需要考虑一个明显的“非技术性”方面,即您的工作在实现其预期目标方面的有效性,即很好地解决视觉感知问题,这在大多数计算色彩空间。归根结底,任何颜色实用程序的目标都是使其在人类对颜色的感知方面看起来正确。HSL/HSV 在这方面都失败了。它们之所以突出,是因为它们易于编码,并且仅出于这个原因。如果您的截止日期很短,它们是可以接受的答案。如果你想要一些真的很好用的东西,那么你需要做繁重的跑腿工作并考虑这些东西,


给你一些参考点(我故意避免任何技术参考,因为它们只涉及计算视角,而不是实际的颜色感知,无论如何你可能已经阅读了所有这些):

色彩理论维基

色调、色调、色调和阴影的基本分类

大地色调(如果您愿意,也可以选择丰富的色调)

配色方案的基本原理

于 2018-04-18T02:36:28.573 回答
6

实际上,只要您了解在 HSV 中,饱和度是颜色的纯度,值是该颜色的强度,而不是整体的亮度,我不得不争辩说 HSV 更好地解释了人类的视觉感知。以这张图片为例...
光谱

这是 HSL 饱和度(左)和 HSL 亮度(右)的映射... 请注意,饱和度是 100%,直到您碰到最顶部的白色突然下降。在查看原始图像时不会感知到这种映射。亮度映射也是如此。虽然它是一个更清晰的渐变,但它只是在视觉上模糊地匹配。将其与下面的 HSV 饱和度(左)和 HSV 值(右)进行比较...... 这里可以看到饱和度映射随着颜色变得更白而下降。同样,在原始图像中可以非常清楚地看到值映射。在查看原始图像的各个颜色通道的映射时,这一点变得更加明显(非黑色区域几乎与值映射完全匹配,但与亮度映射相去甚远)......
HSL 饱和度在此处输入图像描述

HSV 饱和度在此处输入图像描述

红色通道绿色通道蓝色通道
根据这些信息,我不得不说 HSV 更适合处理实际图像(尤其是照片),而 HSL 可能只适合在颜色选择器中选择颜色。

附带说明一下,HSV 中的值是 CMYK 中黑色的倒数。

使用 HSV 而不是 HSL 的另一个论点是,HSV 具有更少的不同值组合可以导致相同的颜色,因为 HSL 将其分辨率的一半左右丢失到其顶部锥体。假设您使用字节来表示组件 - 从而为每个组件提供 256 个唯一级别。这将在 HSL 中产生的唯一 RGB 输出的最大数量为 4,372,984 色(可用 RGB 色域的 26%)。在 HSV 中,这一数字高达 9,830,041(RGB 色域的 59%)……超过两倍。并且允许色调的范围为 0 到 359,HSV 将产生 11,780,015,而 HSL 仅会产生 5,518,160。

于 2017-05-08T03:28:55.117 回答