从 HSV 中提取色度/相对色度

Posted

技术标签:

【中文标题】从 HSV 中提取色度/相对色度【英文标题】:Extract chromaticness/relative chroma from HSV 【发布时间】:2014-05-23 20:47:14 【问题描述】:

我试图弄清楚如何从 HSV(替代 RGB)中获得色度。问题是;我几乎不知道色度是什么。根据网上可用的少量信息,它通常被称为“相对色度”,它是色调和饱和度的组合。

来自http://www.huevaluechroma.com/012.php

相对于假设最大值的色度概念的另一个术语 是来自瑞典 NCS 系统的色度

我确实有一个已在 PHP 中转换为 HSV 的 RGB。我希望有任何人可以在这个问题上提供他们的专业知识,因为似乎记录的信息非常有限。我需要它来验证 NCS 代码。

到目前为止的色度计算:

   //$hsv is array(h, s, v), maximum considered to be 10000        
   $chroma = $hsv[1] * $hsv[2];
   $chromaticness = $chroma / 10000;

例如,颜色 S 2065-B (#0073B0) 使用上面的计算给出了 69% 的色度,而它应该是 65%。另外,颜色 S 0580-Y (#FECB00) 应该是 80% 时给了我 99%?

我得到的这些示例中的 HSV 是:

#0073B0 'H' => 200.79545454545, 'S' => 100, 'V' => 69.019607843137

#FECB00 'H' => 47.952755905512, 'S' => 100, 'V' => 99.607843137255

任何编程语言都欢迎这个解决方案,但是我用 PHP 编码,所以它可能会被转换为那个。

【问题讨论】:

NCS 系统中的色度与色调无关。它与 HSV 中的饱和度相当。例如,请参见 prominentpaints.co.za/ColoursAndCalculators/NCSColour 中的图表。 我不确定我在关注你,我在上面的计算中使用了饱和度和亮度。 你能提供你为你提到的两种颜色计算的 hsv 值吗? 使用 HSV 阵列更新,我从中得到。 :) 【参考方案1】:

色度是孟塞尔系统的第三个属性,超越色相和明度/亮度。

色度通常定义相关色调的色彩: 即颜色的属性,表示颜色与相同亮度的灰色的偏离程度。从这里 Color Space and Its Divisions 作者 Rolf G. Kuehni(可在 google 图书中找到)

色相和亮度相同的两种颜色的色度和饱和度相同。无论亮度或亮度如何,饱和度都保持不变。另一方面,色度随着亮度的增加而增加。

编码的色度公式给出here

在您考虑色域之前,色度仍然是一个开放的量 - 范围从 0 到无穷大。

NCS 色度是指定为百分比的色度 - 其中 100% 对应于某个有限的上限,see ISSN-03912051。您需要选择该有限值才能在您的计算系统中获得良好的工作动态范围。

相信会有所帮助。

【讨论】:

感谢您的回复!我对这种色度计算的问题是它与我给出的 NCS 样本偏差太大。如果我设置一个上限来计算一个百分比,那么在几个样本之后,该百分比与 NCS 百分比完全没有逻辑联系。 我也确定我的 RGB -> HSV 计算工作正常。 当您说“它与我收到的 NCS 样本偏差太大”时,您是在谈论将您与显示器屏幕上的瓷砖进行比较的色卡吗?如果是这样,则外观不匹配可能涉及一些因素。然后,您的任务就变成了将您的特定显示器校准到您的标准样品。查看这篇文章link.springer.com/article/10.3758%2FBF03204528 或类似文章,了解如何为可重复的心理物理实验进行适当的监视器校准。 对不起,我不够清楚。我的意思是 NCS 中的色度与我计算的色度不匹配。没有任何模式让我认为算法有问题。我有 NCS 样本也显示 RGB,这就是为什么我肯定我的计算是错误的。 写的时候: //$hsv 是array(h, s, v),最大值认为是10000 $chroma = $hsv[1] * $hsv[2]; $色度= $色度/10000;你确定数组不是零索引的。色调真的是 $hsv[0] 和饱和度 $hsv[1] 吗?【参考方案2】:

我认为您遇到的问题与 NCS 系统中的四种基本颜色在 HSV 系统中并非都具有 100% 的值有关。

例如,NCS 系统中完全饱和且完全明亮的橙色将位于 HSV 弧线的中间,介于 NCS 黄色和 NCS 红色之间。 NCS 黄色的 HSV 值为 100%,但 NCS 红色的 HSV 值仅为 77%,因此该橙色的 HSV 值约为 88.5%。尽管如此,NCS 色度仍为 100%,即使您从 HSV 计算得出的色度为 88.5%。 (还有一个问题是 NCS red 在 HSV 系统中只有 99% 饱和,但我忽略了这一点。)

NCS 基础颜色的 HSV 值如下:

white 100%
black 0%
green 63%
red 77%
yellow 100%
blue 74%

来源:https://en.wikipedia.org/wiki/Natural_Color_System

我认为您需要做的是,在计算 NCS GY/GB/RY/RB“色调”之后,根据两个相关 NCS 基础颜色的比例计算该 NCS 色调的最大 HSV 值,然后将 NCS 色度计算为该最大 HSV 值的一部分(即,如果我们处理 0 到 1 之间的数字,则除以该最大值)。因此,我们将 HSV 值为 22.125% 的饱和 Y50R 橙赋予 25% 的色度,因为 22.125% 是 Y50R 橙的最大值 88.5% 的 25%。

请注意,这意味着您必须处理超出 NCS 颜色最大值的 RGB/HSV 颜色。在这些情况下,我可能只是将 HSV 值缩放回具有相同色调的 NCS 颜色的最大值。

【讨论】:

我不完全确定您所说的“HSV 值为 22.125%”是什么意思,您能详细说明一下吗? “HSV 值”是指 HSV 的“V”部分。 “22.125%”是指“HSV 值”最大值的 22.125%; HSV 值通常以百分比或分数表示。 不过,不完全确定如何计算您提到的内容。我已经使用从我的函数中获得的 HSV 数组更新了我的示例。

以上是关于从 HSV 中提取色度/相对色度的主要内容,如果未能解决你的问题,请参考以下文章

从音频文件中提取音高特征

HSV模型简介以及利用HSV模型随机增强图像

高级色度键代码示例

如何计算二维对数色度?

H.264编码YUV422的4*4色度编码

色度图的问题