如何确定颜色是接近白色还是黑色?

我正在处理肤色,并想确定一个人的肤色是否接近白色或黑色。

所以给定一种颜色 ,如何确定它是接近白色肤色还是黑色肤色?

我尝试了一些noobish算法,有谁知道我怎么做到这一点?

我会说你可以先将颜色转换为灰度,然后检查它是否更接近黑色或白色。

首先通过以下公式转换RGB颜色值以计算亮度

Y = 0.2126*R + 0.7152*G + 0.0722*B 

然后检查该值是否更接近0或255,并相应地选择黑色或白色

 color c = Y < 128 ? black : white 

请注意,如果颜色空间没有进行伽马压缩,则此方法很有效,否则您必须在计算亮度之前添加一个步骤,即伽马扩展 ,计算Y,然后执行伽马压缩以获得非线性亮度值然后可以用来决定颜色是否更接近黑色或白色。

看看YCbCr 。 由于Java和大多数计算机处理RGB格式的颜色,您需要进行从RGB到YCbCr的一些转换。 有许多公式可以将RGB转换为YCbCr。

获得YCbCr值后,您可以检查亮度值(YCbCr中的值Y)。

白色和黑色有两种潜在的含义:

  • 可见光的色谱
  • 人体肤色由种族,棕褐色等决定。

前者很简单:转换为灰度范围0-255。 127或更小更接近黑色(0),128或更接近白色(255)。

我使用以下函数使用亮度值转换为灰度(假设输入颜色为int ARGB格式):

 public static int getLuminance(int argb) { int lum= ( 77 * ((argb>>16)&255) + 150 * ((argb>>8)&255) + 29 * ((argb)&255))>>8; return lum; } 

后一种定义(人体肤色)不可能用简单的算法,因为它取决于光线条件,相机设置,曝光等。(190,115,60)的RGB值可能大约是典型条件下的中点

  • 将颜色转换为灰度(灰度颜色使所有3个RGB分量相等,请参阅将彩色图像转换为灰度 )。

  • 检查灰度是否接近黑色(0)或白色(255)