我正在处理图像,并希望确定一组像素是更接近白色还是黑色。
因此,给定一组颜色/像素,如何确定它们更接近白色还是黑色?
我尝试了一些新手算法,有谁知道我该如何做到这一点?
我正在处理图像,并希望确定一组像素是更接近白色还是黑色。
因此,给定一组颜色/像素,如何确定它们更接近白色还是黑色?
我尝试了一些新手算法,有谁知道我该如何做到这一点?
Y = 0.2126*R + 0.7152*G + 0.0722*B
然后检查该值是更接近于0还是255,并相应选择黑色或白色。
color c = Y < 128 ? black : white
请注意,如果颜色空间不是伽马压缩的,则此方法效果良好,否则您需要在计算亮度之前添加一个步骤,即进行 伽马扩展,计算 Y 值,然后执行 伽马压缩 以获得非线性亮度值,然后使用它来确定颜色是否更接近黑色或白色。
白色和黑色可能有两种潜在含义:
前者很容易:转换为灰度范围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;
}
后一种定义(人类肤色)无法通过简单的算法完成,因为它取决于光照条件、相机设置、曝光等。在典型条件下,RGB值为(190,115,60)可能大致处于中点位置。
请查看YCbCr。由于Java和大多数计算机处理颜色的格式为RGB,因此您需要将RGB转换为YCbCr。有许多公式可将RGB转换为YCbCr。
一旦获得YCbCr值,您可以检查亮度值(YCbCr中的值Y)。