如何确定颜色更接近白色还是黑色?
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+以上是关于如何确定颜色更接近白色还是黑色?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将状态栏文本(前景)颜色更改为任意颜色(即不是黑色或白色)? [复制]
如何将所有文本颜色更改为默认颜色(文本为黑色,提示为灰色)而不是白色