如何检测颜色是否为灰色
这些图片完全归功于@Wolff。如前所述,灰色是 100% 相对于照明、周围颜色、感知和您正在测量的方法。以这些图像为例。主图像实际上根本没有“红色”。如果你用滴管测量任何看起来是红色的区域,它们实际上都是灰色的。
如果你剪下鹦鹉的翅膀并断章取意,它看起来像棕色和灰色。
如果你把完全相同的剪断放回鹦鹉身上,它在蓝/绿的背景下再次看起来是红色的。
但话虽如此,LCH 或 LAB 将是您测量中性灰色的最佳选择。
@Luciano对本文的推荐:色彩理论:有“色彩”的度量吗? 对于您正在尝试做的事情有一些很好的信息。
RGB 或实际上其极坐标等效项中的饱和度是高度非线性的,当人们试图将其用作衡量“在屏幕上观看时,这种 RGB 颜色看起来有多接近灰色”时,它根本没有考虑到人类色觉,它纯粹是用于控制屏幕电子设备。你已经对这个事实嗤之以鼻。
您应该代替它将 RGB 值转换为 LCH 系统并提取 C(=色度)或 CIELAB 系统(=Photoshop 中的实验室)并计算 sqrt(a^2+b^2)。这些系统被开发为在预测所见内容方面更加线性。对于灰色 C=0 和 a=b=0。如果屏幕没有经过颜色校准,这当然是谎言。
添加适当的评论:提问者很可能认为他的程序不会被它所看到的任何其他东西所愚弄,它可以一次集中到一个单一的 RGB 组合。我猜提问者期望的东西可以帮助他的程序做出与完美色度计相同的决定,当它读取由无故障的 sRGB 屏幕输出的相同 RGB 且没有干扰的额外灯光时。
我确实同意已经提到的颜色感知。有暖灰色和冷灰色,但最灰色的是中性灰色。
看RGB值,如果3个数字都一样,那就是中性灰,比如R109 G109 B109,或者R228 G228 B228。如果一个数字略有不同,它将使灰色调为冷色或暖色。
查看 HSB 值,在我看来,HUE 是什么并不重要,只要饱和度为 0,它将是 100% 灰色。如果您将饱和度提高任何百分比,那么无论色调是什么,您都会得到一种色调。
因此,作为一名平面设计师,我认为任何低于 4% 的 SATURATION 值都将被视为灰色,但它可能是冷灰色或暖灰色,具体取决于 HUE 值(即使它是 0)。
程序员仍然必须对什么被认为是灰色进行最终调用,除非您只希望它检测 100% 灰色,否则很容易。
HSL 是表示灰度的最佳色彩空间。
灰度可以看成一个距离S(饱和度),如果是纯灰色则为0.0,如果离灰色最远则为1.0。
测量和感知
在我提供的两个样本中(使用 Photoshop 吸管):0 10% 49% 和 216 12% 51%,这与您声称的有所不同,可能是由于在发布过程中丢弃了颜色配置文件。
使用经过校准的 Eizo CG303w (120cd/m2 5000k 2.2),我感觉左边那个偏红色,右边那个偏蓝色。我降低了饱和度,直到我感觉两者都是灰色的,我在 HSL 空间中达到了 4% 和 5% 的饱和度。
我的 5000k 白点有点暖,我看到棕色补丁比蓝色补丁颜色更深。5500k-6500k 的白点可能会更好,我们还应该确保环境光(理想情况下是校准光,如 Just)和墙壁颜色(白色、脏白色?)在可接受的灰度范围内。
讨论
在 RGB 中,当 R=G=B 时颜色为灰色,但操作员需要评估几个数字才能回答“是否为灰色”。仅通过查看数字很难让我们自己与 R=G=B 保持距离。
HSL 颜色空间更直接,因为 S(饱和度,在 [0,1] 范围内)立即给出答案:0 为灰色,或者低于阈值的值被选择为灰色。
R' = R/max // normalization from [0-max] to [0.0-1.0]
G' = G/max // where max is 255 if the colors are 8 bits per channel
B' = B/max
Cmax = max(R', G', B') // find the maximum among R,G,B
Cmin = min(R', G', B') // find the minimum among R,G,B
Δ = Cmax - Cmin // gives the maximum difference
然而,L 和 S 由下式给出:
L = (Cmax + Cmin) / 2
S = Δ/(1-|2L-1|)
因此,您可以构建一个指示器过滤器,而不是在像素为纯灰色或足够灰色时以纯绿色显示;或者它将以假色显示所有足够灰度的像素,并使其余像素去饱和。实施将取决于您的软件和语言;例如,您可以为 Photoshop 创建一个 Matlab 过滤器,甚至可以创建一个自治插件。
参考