RGB相似颜色近似算法



假设在RGB中,我们可以表示256^3个组合=16777216种颜色,并且由于人眼只能区分大约10000000种,因此显然有6777216种RGB组合在色度上无法与对应颜色区分。

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

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

非常感谢您的帮助

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

  • L1:abs(r1-r2)+abs(g1-g2)+abs
  • L2:sqrt((r1-r2)²+(g1-g2)²=(b1-b2)²)
  • L:最大值(abs(r1-r2),abs(g1-g2),abs(b1-b2))

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

互不可区分的颜色区域称为麦克亚当椭圆。椭圆在CIELUV和CIELAB颜色空间中几乎变成圆形,这对于计算来说很好,但不幸的是,从RGB进入这些颜色空间并不是那么简单。

JPEG将颜色转换为YCbCr,其中Y是亮度,两个C对颜色进行编码,然后将C分量的分辨率减半。你可以做同样的事情,然后使用上面指标之一的加权版本,例如:

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

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

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

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

RGB颜色系统的设计使得如果两种颜色的值彼此接近,那么这些颜色在感知上也很接近。

示例:

由RGB=(100,100,100)定义的颜色在感知上几乎与颜色相同RGB=(101100),RGB=(98100,99)等…

最新更新