鉴于在 RGB 中我们可以表示 256^3 种组合 = 16,777,216 种颜色,并且由于人眼只能区分大约 10,000,000 种颜色,因此显然存在多余的 6,777,216 种 RGB 组合,这些组合在色彩上与对应颜色无法区分。
我相信,压缩算法在近似整个帧的颜色范围的空间差异时在此基础上工作。考虑到这一点,如何可靠地计算给定颜色是否在与另一种颜色的“相似性”范围内?
当然,“相似性”将是某种可以调整的任意/可调参数,但这无论如何都是一个近似值。那么有没有指针、伪代码、直观的代码示例、资源可以帮助我对这样的函数进行建模?
非常感谢您的帮助
计算颜色之间距离的方法有很多,最简单的方法是在任何颜色空间中的颜色分量上定义。这些是 RGB 颜色 (r1,g1,b1) 和 (r2,g2,b2) 之间的常见“距离”或度量:
- L1: abs(r1-r2) + abs(g1-g2) + abs(b1-b2)
- L2: sqrt((r1-r2)² + (g1-g2)² + (b1-b2)²)
- L∞: max(abs(r1-r2), abs(g1-g2), abs(b1-b2))
然而,这些都没有考虑到人类视觉对颜色的敏感度不如对亮度的敏感度这一事实。为了获得最佳结果,您应该从 RGB 转换为分别编码亮度和颜色的颜色空间。然后在新的颜色空间中使用上述指标之一,可能会给予亮度分量更多的权重,而给予颜色分量更少的权重。
彼此无法区分的颜色区域称为麦克亚当椭圆。椭圆变成接近圆形CIELUV and CIELAB颜色空间,这对于计算来说非常有用,但不幸的是从 RGB 到这些颜色空间并不是那么简单。
JPEG converts colors into YCbCr, where Y is brightness and the two C's encode color, and then halves the resolution of the C components. You could do the same and then use a weighed version of one of the above metrics, for example:
diff = sqrt(1.4*sqr(y1-y2) + .8*sqr(cb1-cb2) + .8*sqr(cr1-cr2))
文章关于色差维基百科有更多不同颜色空间的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)