一种简单的方法是,当RGB分量相等时,它们会形成灰色。 然而,这不是整个故事,因为如果它们只有微小的差别,它们仍然会显得灰暗。
假设观众有一个健康的色彩视觉,我如何判断给定的值是否会被视为灰色(可能是“灰度”的可调阈值水平)?
答案 0 :(得分:4)
一种相对简单的方法是将RGB值转换为HSV color space并在saturation组件上使用阈值,例如“如果饱和度<0.05,那么'几乎是灰色',否则不是灰色的”。
根据定义,饱和度 实际上是“灰度/色彩”。
这种方法比使用R,G和B通道之间的差异准确得多(因为人眼在浅色和深色上感知饱和度不同)。另一方面,将RGB转换为HSV是计算密集型的。由您决定什么是更有价值的 - 精确答案(灰色/非灰色)或性能。
如果您需要更精确的方法,可以使用L*a*b* color space并将色度计算为sqrt(a*a + b*b)
(请参阅here),然后将阈值应用于此值。但是,这将是甚至更多计算密集型。
您还可以合并多种方法:
计算R,G,B组件之间的简单差异。如果颜色可以被识别为绝对去饱和(例如max(abs(R-G), abs(R-B), abs(G-B)) <= 5
)或肯定饱和(例如max(abs(R-G), abs(R-B), abs(G-B)) > 100
),那么停止。
否则,转换为L * a * b *,将色度计算为sqrt(a*a + b*b)
并对此值使用阈值。
答案 1 :(得分:0)
r = 160; g = 179; b = 151;
公差= 20;
if(Math.abs(r-g)&lt; 20&amp;&amp; Math.abs(r-b)&lt; 20){ #then被认为是灰色的 }