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 をグレースケールに正しく変換するには、ガンマ補正された R、G、および B 値を線形色空間に変換し、線形空間で変換を適用してから、結果にガンマ補正を適用する必要があります。

sRGB色空間には、ガンマ曲線のみを近似する変換があります。詳細については、ウィキペディアの記事を参照してください。ウィキペディアには、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;
}

いえ

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

GIMP がカラー画像をグレースケールに変換するいくつかの異なる方法を説明する GIMP チュートリアルがあります。1 つの方法は、既に試した加重脱飽和です。この記事では、GIMP の変換を概算するために使用できる加重をいくつか示しています。

geglすべての画像操作の基礎となるGIMP のライブラリには、色をグレースケールに変換するためのかなり精巧なメカニズムがあり、隣接するピクセルの色を考慮し、黒と白い写真。

于 2013-03-28T15:56:32.387 に答える
1

彩度低下ツールのgimp ヘルプには、「明度」、「光度」、「平均」という名前のオプションに対応する 3 つの使用可能な式が記載されています。それらは次のとおりです。

明度: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 に答える