7

鉴于在 RGB 中我们可以表示 256^3 组合 = 16,777,216 种颜色,并且由于人眼只能区分大约 10,000,000 种颜色,因此显然有 6,777,216 种 RGB 组合在颜色上与对应颜色无法区分。

压缩算法在此基础上工作时,我相信在估计整个帧的颜色范围的空间差异时。考虑到这一点,如何可靠地计算给定颜色是否在与另一种“相似”范围内?

当然,“相似性”将是某种可以调整的任意/可调参数,但无论如何这是一个近似值。那么是否有任何指针、伪代码、直观的代码示例、资源来帮助我对这样的函数进行建模?

非常感谢您的帮助

4

3 回答 3

12

计算颜色之间距离的方法有很多,最简单的方法是在任何颜色空间中的颜色分量上定义的。这些是 RGB 颜色 (r1,g1,b1) 和 (r2,g2,b2) 之间的常见“距离”或度量:

  • L 1 : abs(r1-r2) + abs(g1-g2) + abs(b1-b2)
  • L 2 : sqrt((r1-r2)² + (g1-g2)² + (b1-b2)²)
  • L ∞</sub>: max(abs(r1-r2), abs(g1-g2), abs(b1-b2))

然而,这些都没有考虑到人类视觉对颜色的敏感度低于对亮度的敏感度。为了获得最佳结果,您应该从 RGB 转换为分别编码亮度和颜色的颜色空间。然后在新的色彩空间中使用上述指标之一,可能会给亮度分量更多的权重,而对颜色分量的权重更少。

彼此无法区分的颜色区域称为麦克亚当椭圆椭圆在CIELUVCIELAB颜色空间中变得接近圆形,这对计算非常有用,但不幸的是,从 RGB 进入这些颜色空间并不是那么简单。

JPEG 将颜色转换为YC b C r,其中 Y 是亮度,两个 C 编码颜色,然后将 C 分量的分辨率减半。您可以这样做,然后使用上述指标之一的加权版本,例如:

diff = sqrt(1.4*sqr(y1-y2) + .8*sqr(cb1-cb2) + .8*sqr(cr1-cr2)) 

维基百科中关于色差的文章有更多不同颜色空间的示例。

于 2012-08-22T10:15:40.673 回答
6

可以使用CIEDE2000 色差公式计算感知色差。CIEDE2000 公式基于LCH 颜色空间(亮度、色度和色调)。LCH 颜色空间表示为圆柱体(参见此处的图像)。

一个不太准确(但更易于管理)的模型是CIE76色差公式,它基于Lab 颜色空间 (L*a*b*)。RGB 或 CMYK 值与 L*a*b* 之间的转换没有简单的公式,因为 RGB 和 CMYK 颜色模型取决于设备。RGB 或 CMYK 值首先需要转换为特定的绝对色彩空间,例如 sRGB 或 Adob​​e RGB。此调整将取决于设备,但转换的结果数据将与设备无关,允许将数据转换为 CIE 1931 颜色空间,然后转换为 L*a*b*。这篇文章解释了过程和公式。

于 2012-08-22T10:04:42.663 回答
1

RGB 颜色系统的设计使得如果 2 种颜色的值彼此接近,则颜色在感知上也接近。

例子:

由 RGB = (100, 100, 100) 定义的颜色在感知上与颜色 RGB = (101, 101, 100)、RGB = (98, 100, 99) 等几乎相同...

于 2012-08-22T09:57:11.377 回答