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

Java 如何确定颜色是接近白色还是黑色?,java,image-processing,colors,Java,Image Processing,Colors,我正在处理图像,想确定一组像素是接近白色还是黑色 因此,给定一组颜色/pixles,如何确定它们更接近白色还是黑色 我尝试过一些noobish算法,有人知道我怎么做吗?看看。由于Java和大多数计算机都以RGB格式处理颜色,所以需要将RGB转换为YCbCr。有许多公式可以将RGB转换为YCbCr 获得YCbCr值后,可以检查亮度值(YCbCr中的值Y)。 将颜色转换为灰度(灰度颜色的所有3个RGB分量相等,请参见) 检查灰度是否接近黑色(0)或白色(255) 我想说,您可以先将颜色转换为灰度,然

我正在处理图像,想确定一组像素是接近白色还是黑色

因此,给定一组颜色/pixles,如何确定它们更接近白色还是黑色

我尝试过一些noobish算法,有人知道我怎么做吗?

看看。由于Java和大多数计算机都以RGB格式处理颜色,所以需要将RGB转换为YCbCr。有许多公式可以将RGB转换为YCbCr

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

  • 将颜色转换为灰度(灰度颜色的所有3个RGB分量相等,请参见)

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


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

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

Y = 0.2126*R + 0.7152*G + 0.0722*B
然后检查该值是否接近0或255,并相应地选择黑色或白色

color c = Y < 128 ? black : white
颜色c=Y<128?黑:白
请注意,如果颜色空间不是gamma压缩的,则此方法效果良好,否则必须在计算亮度之前添加一个步骤,该亮度是gamma扩展,compute Y,然后执行伽马压缩以获得非线性亮度值,然后可以使用该值确定颜色是更接近黑色还是白色。

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

  • 可见光光谱
  • 人类肤色由种族、晒黑程度等决定
前者很容易:转换为灰度范围0-255。127或以下更接近黑色(0),128或以上更接近白色(255)

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


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

在RGB世界中,白色为255255,黑色为0,0,0。你似乎可以将这三个值取平均值,然后确定结果是否接近0(黑色)或255(白色)。是的,我在我的一个“noobish”解决方案中尝试了这种平均值,但效果不好。这就是你要寻找的答案。1+你能给我举个例子,说明我如何测试是否存在伽马压缩并获得适当的亮度值,这种方法似乎适合我的需要。你无法测试伽马压缩是否存在。你必须事先知道,伽马压缩是如何用幂函数“去线性化”RGB值的,如果这是在你的颜色上做的,那么你必须在计算亮度之前进行反向操作,就是这样。在Android中,有一个内置的方法,你可以使用:。它返回一个介于0和1之间的浮点值,0表示绝对黑色,1表示绝对白色。
public static int getLuminance(int argb) {
    int lum= (   77  * ((argb>>16)&255) 
               + 150 * ((argb>>8)&255) 
               + 29  * ((argb)&255))>>8;
    return lum;
}