计算颜色之间距离的方法有很多,最简单的方法是在任何颜色空间中的颜色分量上定义的。这些是 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 转换为分别编码亮度和颜色的颜色空间。然后在新的色彩空间中使用上述指标之一,可能会给亮度分量更多的权重,而对颜色分量的权重更少。
彼此无法区分的颜色区域称为麦克亚当椭圆。椭圆在CIELUV和CIELAB颜色空间中变得接近圆形,这对计算非常有用,但不幸的是,从 RGB 进入这些颜色空间并不是那么简单。
JPEG 将颜色转换为YC b C r,其中 Y 是亮度,两个 C 编码颜色,然后将 C 分量的分辨率减半。您可以这样做,然后使用上述指标之一的加权版本,例如:
diff = sqrt(1.4*sqr(y1-y2) + .8*sqr(cb1-cb2) + .8*sqr(cr1-cr2))
维基百科中关于色差的文章有更多不同颜色空间的示例。