我使用了很多公式从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;
答案 0 :(得分:13)
为了将RGB正确转换为灰度,您应该将经过伽马校正的R,G和B值转换为线性色彩空间,在线性空间中应用转换,然后对结果应用伽马校正。
sRGB颜色空间的变换仅近似于伽马曲线。有关详细信息,请参阅Wikipedia文章。维基百科还有一个关于sRGB到灰度的特定section。
基本上,要将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;
}
即
double gray_color = round(linear_to_sRGB(gray_linear) * 255);
答案 1 :(得分:2)
有a GIMP tutorial描述了GIMP可以将彩色图像转换为灰度的几种不同方式。一种方法是加权去饱和,就像你已经尝试过的那样,文章给出了一些权重,可以用来估算GIMP的转换。
GIMP的gegl
库是其所有图像操作的基础,具有a rather elaborate mechanism for converting color to greyscale,它考虑了相邻像素的颜色,并使用似乎模拟过程的迭代方法开发黑白照片。
答案 2 :(得分:0)
gimp help for the desaturate tool表示三个可用的公式对应于名为&#34; Lighness&#34;,&#34; Luminosity&#34;和&#34;平均&#34;。那些将是:
轻盈:0.5 * (max(R,G,B) + min(R,G,B))
亮度:(0.21 * R) + (0.72 * G) + (0.07 * B)
平均值:(R + G + B)/3