2012-08-22 397 views
5

鉴于在RGB我们可以表示256^3组的组合= 16,777,216种颜色,并且由于人眼只能区别大致10,000,000,有明显的6777216个RGB组合即色是无法区分来自对应颜色的剩余。RGB颜色相近的近似算法

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

当然,“相似性”将是某种可以进行调整任意波形/可调参数,但是这是一个近似反正。那么,任何指针,伪代码,直观的代码示例,资源在那里帮助我建模这样的功能?

的帮助

+0

你说“6,777,216盈余”,好像几乎一半的信息被浪费了。情况并非如此。这6,777,216种颜色占1-log2(1000000)/ 24',即。 3.11%的信息。不要指望压缩! –

+0

多年后,这个问题似乎仍然相关。如果它帮助任何人,我发现了一个不同的使用HSL的解决方案,这是我最近写的[这里](https://medium.com/@dariushodaei/colour-coding-part-1-aa0d9910592) – ComethTheNerd

回答

5

感知色差可以使用的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 *。文章解释了程序和公式。

+0

优秀的资源!带回我对颜色感知所做的一个本底图形模块的记忆。谢谢你的指点 – ComethTheNerd

1

RGB色彩系统非常感谢这样设计,如果2种颜色有接近彼此的值,则颜色也感知紧密。

示例:

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

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

+0

因此,任何一列中的n <5都不会产生可感知的色差,那么?这是一个开始测试的好地方,谢谢 – ComethTheNerd

+0

是的。试试这个在线工具进行测试:[Colors scheme](http://www.colorschemer.com/online.html) –

+0

请注意,您必须检查value * component-wise *的紧密度,您不能只是去(color1 - color2)<阈值,因为数据表示。这是显而易见的,但可能是一个陷阱。 – Thomas

9

有计算颜色之间的距离的方法很多,最简单的那些正在对任何颜色空间中的颜色分量来定义。这些是常见的 “距离” 或RGB颜色之间的度量(R1,G1,B1)和(R2,G2,B2):

  • 大号:ABS(R1-R2)+ ABS(G1-G2 )+ ABS(B1-B2)
  • 大号:SQRT((R1-R2)2 +(G1-G2)2 +(B1-B2)2)
  • 大号:最大(绝(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文章有不同的色彩空间更多的例子。

+0

这真的很棒,谢谢你的建议。棘手的业务近似的颜色! – ComethTheNerd