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

Azi*_*ziz 16 java colors image-processing

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

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

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

Jac*_*ack 30

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

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

Y = 0.2126*R + 0.7152*G + 0.0722*B
Run Code Online (Sandbox Code Playgroud)

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

color c = Y < 128 ? black : white
Run Code Online (Sandbox Code Playgroud)

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


mik*_*era 5

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

  • 可见光的色谱
  • 人类肤色由种族、晒黑程度等决定。

前者很简单:转换为灰度范围 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;
}
Run Code Online (Sandbox Code Playgroud)

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