一种简单的说法是,当 RGB 分量相等时,它们形成灰色。 然而,这还不是全部,因为如果它们只有细微的差别,它们看起来仍然是灰色的。
假设观看者具有健康的色彩视觉,我如何确定给定值是否会被视为灰色(大概具有可调节的“灰度”阈值级别)?
最佳答案
一个相对直接的方法是将 RGB 值转换为 HSV color space并在 saturation 上使用阈值组件,例如“如果饱和度 < 0.05,则‘几乎是灰色’,否则不是灰色”。
饱和度是实际上定义为“灰度/色彩”。
此方法比使用 R、G 和 B channel 之间的差异更准确(因为人眼对浅色和深色的饱和度感知不同)。另一方面,将 RGB 转换为 HSV 是计算密集型的。由您决定什么更有值(value) - 精确答案(灰色/非灰色)或性能。
如果您需要更精确的方法,您可以使用 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)
并对这个值使用阈值。
关于colors - 给定颜色的 RGB 分量,我如何确定它是否被人类感知为灰色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16209111/