一个简单的方法是当RGB颜色值相等时,它们形成灰色。
然而,这并不是全部,因为如果它们只有微小的差异,它们仍然看起来是灰色的。
假设观察者具有良好的色彩视觉,我如何确定给定的值是否会被感知为灰色(可能需要可调节的“灰度”阈值)?
一个简单的方法是当RGB颜色值相等时,它们形成灰色。
然而,这并不是全部,因为如果它们只有微小的差异,它们仍然看起来是灰色的。
假设观察者具有良好的色彩视觉,我如何确定给定的值是否会被感知为灰色(可能需要可调节的“灰度”阈值)?
sqrt(a*a + b*b)
(请参见此处),然后对该值进行阈值处理。但是,这将会使计算量更大。计算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)
,并对该值进行阈值处理。
Color.GetSaturation()
返回HSB空间中的亮度组件(HSB与我在这个答案中提到的HSV非常相似)。 - Alex ShesterovRGB(0,0,0)
之外的值):饱和度 = (MAX(R, G, B) - MIN(R, G, B)) / MAX(R, G, B)
当然,计算色调和亮度并非必要,可以避免。 - Alex Shesterovr = 160; g = 179; b = 151;
tolerance = 20;
如果 (Math.abs(r-g) < 20 && Math.abs(r-b) < 20) { #则被视为灰色 }