RGB相似颜色近似算法

时间:2012-08-22 08:53:11

标签: algorithm colors approximation

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

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

当然,'相似性'将是某种可以调整的任意/可调参数,但无论如何这都是近似值。那么任何指针,伪代码,直观的代码示例,资源都有帮助我建模这样的函数吗?

非常感谢你的帮助

3 个答案:

答案 0 :(得分:11)

计算颜色之间的距离有很多种方法,最简单的方法是在任何颜色空间的颜色组件上定义。这些是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 :max(abs(r1-r2),abs(g1-g2),abs(b1-b2))
然而,这些并没有考虑到人类视觉对色彩的敏感度低于亮度的事实。为获得最佳效果,您应该从RGB转换为分别编码亮度和颜色的颜色空间。然后在新颜色空间中使用上述度量之一,可能会给亮度分量增加更多权重,而对颜色分量则减少。

彼此难以区分的颜色区域称为MacAdam ellipses。椭圆在CIELUVCIELAB颜色空间中几乎呈圆形,这对于计算非常有用,但遗憾的是从RGB进入这些颜色空间并不是那么简单。

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

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

维基百科上的color difference上的文章提供了更多不同颜色空间的示例。

答案 1 :(得分:6)

可以使用CIEDE2000 Color-Difference Formula计算感知色差。 CIEDE2000 formula基于LCH颜色空间(亮度,色度和色调)。 LCH颜色空间表示为圆柱体(参见图像here)。

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

答案 2 :(得分:1)

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

示例:

由RGB =(100,100,100)定义的

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