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

时间:2012-03-20 02:28:59

标签: java image-processing colors

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

所以给定颜色,如何确定它是否更接近白色肤色或黑色?

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

4 个答案:

答案 0 :(得分:26)

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

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

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

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

color c = Y < 128 ? black : white

请注意,如果颜色空间不是伽马压缩的,那么这很有效,否则你必须在计算亮度之前添加一个步骤,即伽马扩展,计算Y,然后执行伽玛压缩以获得非线性亮度值,然后您可以使用该值来确定颜色是否更接近黑色或白色。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

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

前者很简单:转换为灰度范围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值可能大约是典型条件下的中点< / p>

答案 3 :(得分:2)

  • 将颜色转换为灰度(灰度颜色使所有3个RGB成分相等,请参阅convert color image to grayscale)。

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