将RGB转换为C中的灰度
我使用了许多公式将RGB转换为灰度,但与GIMP相比并没有得到很好的结果 我已经测试了以下公式:将RGB转换为C中的灰度,c,equation,graphic,C,Equation,Graphic,我使用了许多公式将RGB转换为灰度,但与GIMP相比并没有得到很好的结果 我已经测试了以下公式: gray = (int)(0.299 * r + 0.587 * g + 0.144 * b); gray = (int)(0.299 * r + 0.587 * g + 0.114 * b); gray = (int)(0.2126 * r + 0.7152 * g + 0.0722 * b); gray = (int) (0.35*r + 0.50*g + 0.15*b); gray =
gray = (int)(0.299 * r + 0.587 * g + 0.144 * b);
gray = (int)(0.299 * r + 0.587 * g + 0.114 * b);
gray = (int)(0.2126 * r + 0.7152 * g + 0.0722 * b);
gray = (int) (0.35*r + 0.50*g + 0.15*b);
gray = ((r * 61) + (g * 174) + (b * 21)) / 256;
gray = (int)((4897 * r + 9617 * g + 1868 * b) >> 14);
gray = r; if(g > gray) gray = g; if(b > gray) gray = b;
为了正确地将RGB转换为灰度,应将经gamma校正的R、G和B值转换为线性颜色空间,在线性空间中应用转换,然后对结果应用gamma校正 颜色空间具有仅近似于gamma曲线的变换。详情见文章。维基百科也有一个关于从sRGB到灰度的特定主题 基本上,要将sRGB组件转换为线性格式,请执行以下操作:
double sRGB_to_linear(double x) {
if (x < 0.04045) return x/12.92;
return pow((x+0.055)/1.055, 2.4);
}
然后,再次应用sRGB伽马校正:
double linear_to_sRGB(double y) {
if (y <= 0.0031308) return 12.92 * y;
return 1.055 * pow(y, 1/2.4) - 0.055;
}
它描述了GIMP将彩色图像转换为灰度的几种不同方式。一种方法是像您已经尝试过的那样进行加权去饱和,本文给出了一些可以用来近似GIMP转换的权重
GIMP的gegl
库是其所有图像操作的基础,它考虑了相邻像素的颜色,并使用了一种迭代方法,似乎模拟了黑白照片的冲洗过程。列出了三个与指定选项相对应的可用公式“亮度”、“亮度”和“平均值”。它们是:
亮度:0.5*(最大(R,G,B)+最小(R,G,B))
光度:(0.21*R)+(0.72*G)+(0.07*B)
平均:
(R+G+B)/3
我认为这不是真正的主题,因为这是一个(主观的)图形问题,而不是一个编程问题。GIMP是开源的,所以你只考虑它所做的事情吗?你不能仅仅使用<代码> LBGIMP < /代码>来为你做这件事吗?因为眼睛在绿色上有最大的敏感度,它看起来像是第一个或第四个公式。你能给我一个参考或等式吗?我找到了。Wikipedia网站上的数学公式,下面是“将颜色转换为灰度”标题。但我不明白它的意思。谢谢。这些系数(0.2126、0.7152和0.0722)最初来自线性RGB->XYZ空间变换矩阵(矩阵的中间行,用于计算Y)。得到的“强度”“值实际上是XYZ向量中的‘Y’值。
double linear_to_sRGB(double y) {
if (y <= 0.0031308) return 12.92 * y;
return 1.055 * pow(y, 1/2.4) - 0.055;
}
double gray_color = round(linear_to_sRGB(gray_linear) * 255);