9

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

3 回答 3

14

为了正确地将 RGB 转换为灰度,您应该将经过 Gamma 校正的 R、G 和 B 值转换为线性色彩空间,在线性空间中应用转换,然后对结果应用 Gamma 校正。

sRGB颜色空间具有仅近似伽马曲线的变换。有关详细信息,请参阅Wikipedia文章。维基百科也有一个关于 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 R_linear = sRGB_to_linear(R/255.0);
double G_linear = sRGB_to_linear(G/255.0);
double B_linear = sRGB_to_linear(B/255.0);
double gray_linear = 0.2126 * R_linear + 0.7152 * G_linear + 0.0722 * B_linear;

然后,再次应用 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;
}

IE

double gray_color = round(linear_to_sRGB(gray_linear) * 255);
于 2013-03-28T15:53:11.557 回答
2

一个 GIMP 教程描述了 GIMP 可以将彩色图像转换为灰度的几种不同方法。一种方法是加权去饱和,就像您已经尝试过的那样,本文提供了一些可用于近似 GIMP 转换的权重。

GIMP 的gegl库是其所有图像操作的基础,它有一个相当精细的将颜色转换为灰度的机制,它考虑了相邻像素的颜色,并使用了一种迭代方法,似乎模拟了黑色和白色照片。

于 2013-03-28T15:56:32.387 回答
1

去饱和工具的gimp 帮助说明了三个可用公式,对应于名为“亮度”、“亮度”和“平均”的选项。那些将是:

亮度:0.5 * (max(R,G,B) + min(R,G,B))

亮度:(0.21 * R) + (0.72 * G) + (0.07 * B)

平均:(R + G + B)/3

于 2017-07-08T16:40:41.880 回答