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

Posted

技术标签:

【中文标题】如何确定颜色更接近白色还是黑色?【英文标题】:How do I determine if a color is closer to white or black? 【发布时间】:2012-04-04 13:20:31 【问题描述】:

我正在处理图像并想确定一组像素是否更接近白色或黑色。

那么给定一组颜色/像素,如何确定它们更接近白色还是黑色?

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

【问题讨论】:

在 RGB 世界中,白色是 255,255,255,黑色是 0,0,0。看起来您可以将这三个取平均值,然后确定结果是更接近 0(黑色)还是 255(白色)。 是的,我在我的一个“noobish”解决方案中尝试了这种平均,但效果不佳。 【参考方案1】:

将颜色转换为灰度(灰度颜色具有所有 3 个 RGB 分量,请参阅convert color image to grayscale)。

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

【讨论】:

【参考方案2】:

白色和黑色有两种可能的含义:

可见光的色谱 人类肤色由种族、棕褐色程度等决定。

前者很简单:转换为 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颜色值转换为通过以下公式计算亮度

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

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

color c = Y < 128 ? black : white

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

【讨论】:

你能告诉我一个例子,我可以测试看看是否有伽马压缩并获得适当的亮度值,这种方法似乎符合我的需要 您无法测试是否存在伽马压缩。你必须事先知道,伽玛压缩是如何用幂函数“去线性化”RGB值的,如果这是在你的颜色上完成的,那么你必须在计算亮度之前进行反向操作,就是这样.. android 中有一个可以使用的内置方法:Color.luminance()。它返回一个介于 0 和 1 之间的浮点数,0 表示绝对黑色,1 表示绝对白色。 遗憾的是,API 24 中添加了 Color.luminance()。【参考方案4】:

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

一旦得到 YCbCr 值,就可以检查亮度值(YCbCr 中的 Y 值)。

【讨论】:

这是您正在寻找的答案。 1+

以上是关于如何确定颜色更接近白色还是黑色?的主要内容,如果未能解决你的问题,请参考以下文章

将按钮的文本颜色从黑色更改为白色,然后恢复

是否可以将状态栏文本(前景)颜色更改为任意颜色(即不是黑色或白色)? [复制]

将 RGB 转换为黑色或白色

如何将所有文本颜色更改为默认颜色(文本为黑色,提示为灰色)而不是白色

iOS 7:如何在一个视图控制器中将状态栏文本颜色更改为白色,在第二个视图控制器中更改为黑色?

eclipse怎么设置背景为黑色 字体为白色