Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将RGB转换为C中的灰度_C_Equation_Graphic - Fatal编程技术网

将RGB转换为C中的灰度

将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 =

我使用了许多公式将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 = ((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);