我正在处理肤色,并想确定一个人的肤色是否接近白色或黑色。
所以给定颜色,如何确定它是否更接近白色肤色或黑色?
我尝试了一些noobish算法,有谁知道我怎么做?
答案 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)