我正在寻找某种公式或算法来确定给定RGB值的颜色的亮度。我知道这不像把RGB值加在一起那么简单,更高的总和更亮,但我有点不知所措,不知道从哪里开始。
当前回答
这里有一小段C代码,可以正确地计算可感知的亮度。
// reverses the rgb gamma
#define inverseGamma(t) (((t) <= 0.0404482362771076) ? ((t)/12.92) : pow(((t) + 0.055)/1.055, 2.4))
//CIE L*a*b* f function (used to convert XYZ to L*a*b*) http://en.wikipedia.org/wiki/Lab_color_space
#define LABF(t) ((t >= 8.85645167903563082e-3) ? powf(t,0.333333333333333) : (841.0/108.0)*(t) + (4.0/29.0))
float
rgbToCIEL(PIXEL p)
{
float y;
float r=p.r/255.0;
float g=p.g/255.0;
float b=p.b/255.0;
r=inverseGamma(r);
g=inverseGamma(g);
b=inverseGamma(b);
//Observer = 2°, Illuminant = D65
y = 0.2125862307855955516*r + 0.7151703037034108499*g + 0.07220049864333622685*b;
// At this point we've done RGBtoXYZ now do XYZ to Lab
// y /= WHITEPOINT_Y; The white point for y in D65 is 1.0
y = LABF(y);
/* This is the "normal conversion which produces values scaled to 100
Lab.L = 116.0*y - 16.0;
*/
return(1.16*y - 0.16); // return values for 0.0 >=L <=1.0
}
其他回答
正如@Nils Pipenbrinck所提到的:
所有这些方程在实践中都很有效,但如果你需要非常精确,你就必须[做一些额外的gamma东西]。在深灰色中,忽略伽玛和正确伽玛之间的亮度差异高达20%。
这里有一个完全自包含的JavaScript函数,它做了“额外的”工作来获得额外的准确性。它基于Jive Dadson对这个问题的c++回答。
// Returns greyscale "brightness" (0-1) of the given 0-255 RGB values
// Based on this C++ implementation: https://stackoverflow.com/a/13558570/11950764
function rgbBrightness(r, g, b) {
let v = 0;
v += 0.212655 * ((r/255) <= 0.04045 ? (r/255)/12.92 : Math.pow(((r/255)+0.055)/1.055, 2.4));
v += 0.715158 * ((g/255) <= 0.04045 ? (g/255)/12.92 : Math.pow(((g/255)+0.055)/1.055, 2.4));
v += 0.072187 * ((b/255) <= 0.04045 ? (b/255)/12.92 : Math.pow(((b/255)+0.055)/1.055, 2.4));
return v <= 0.0031308 ? v*12.92 : 1.055 * Math.pow(v,1.0/2.4) - 0.055;
}
请参阅Myndex的答案以获得更准确的计算。
我认为你正在寻找的是RGB ->流光转换公式。
光度/数字ITU BT.709:
Y = 0.2126 R + 0.7152 G + 0.0722 B
数字ITU BT.601(给予R和B部分更多权重):
Y = 0.299 R + 0.587 G + 0.114 B
如果你愿意用准确性来换取性能,有两个近似公式:
Y = 0.33 R + 0.5 G + 0.16 B
Y = 0.375 R + 0.5 G + 0.125 B
这些可以快速计算为
Y = (R+R+B+G+G+G)/6
Y = (R+R+R+B+G+G+G+G)>>3
基于所有这些答案,我的简单结论是,对于大多数实际用例,您只需要:
brightness = 0.2*r + 0.7*g + 0.1*b
当r,g,b值在0到255之间时,亮度范围也在0(=黑)到255(=白)之间。
可以对它进行微调,但通常没有必要。
请定义亮度。如果你想知道颜色有多接近白色你可以用欧几里得距离(255,255,255)
有趣的是,RGB=>HSV的公式只是使用v=MAX3(r,g,b)。换句话说,你可以用(r,g,b)的最大值作为HSV中的V。
我查了一下,在Hearn & Baker的575页,这也是他们计算“价值”的方法。
推荐文章
- 更改UITextField和UITextView光标/插入符颜色
- 设置Matplotlib色条大小以匹配图形
- Matplotlib:如何在图像上绘制矩形
- 用jQuery检查图像是否加载(无错误)
- 是否可以在。net中以彩色方式写入控制台?
- 用标志图像替换H1文本:SEO和可访问性的最佳方法?
- 如何在CSS中定义颜色作为变量?
- CSS十六进制RGBA?
- 如何从Linux上的命令行将一系列图像转换为PDF ?
- 如何获取android.widget.ImageView的宽度和高度?
- 通过编程方式从Android内置的Gallery应用程序中获取/选择一张图像
- 在CSS中为PNG图像删除阴影
- 将HTML渲染为图像
- JPG和JPEG图像格式
- 根据背景色确定字体颜色