2013-03-28 53 views
8

RGBからグレースケールに変換するのに多くの公式を使用しましたが、GIMPに比べて良い結果は得られませんでした。CでRGBからグレースケールに変換

は、私はすでに次の式をテストした:

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

プログラミングの質問よりも。つまり、GIMPはオープンソースなので、それが何をしているのか見てみましたか? – Useless

+0

'libgimp'を使ってあなたのためにやることはできませんか? – teppic

+0

目は緑色で感度が最大であるため、第1または第4の式のように見えます。 –

答えて

12

で変換を適用し、あなたは、ガンマは線形色空間にR、G、Bの値を修正し変換する必要があり、正しくグレースケールにRGBを変換するためにその結果にガンマ補正を適用します。

sRGB色空間には、ガンマカーブに近似する変換しかありません。詳細については、Wikipediaの記事を参照してください。 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; 
} 

e

double gray_color = round(linear_to_sRGB(gray_linear) * 255); 
+0

私に参照や式を教えてください。 – user2000255

+0

私はWikipediaのサイトから色変換グレースケールの下の数式を見つけました。しかし、私はそれが何を意味するのか理解していません。ありがとうございます。 – user2000255

+1

これらの係数(0.2126,0.7152および0.0722)は、もともとは線形RGB→XYZ空間変換行列(Yを計算する行列の中央の行)からのものです。 結果の「輝度」値は、実際にはXYZベクトルの「Y」値です。 https:// ja。wikipedia.org/wiki/SRGB#The_reverse_transformation –

2

GIMPは、カラー画像をグレースケールに変換することができますいくつかの異なる方法を説明a GIMP tutorialがあります。 1つの方法は、すでに試したような重み付けされた不飽和化であり、記事ではGIMPの変換を近似するために使用できるいくつかの重みを与えています。

その画像操作のすべての基礎であるGIMPのgeglライブラリは、アカウントに隣接する画素の色を取得し、白黒写真を現像するプロセスをエミュレートするように思われる反復アプローチを使用a rather elaborate mechanism for converting color to greyscaleを有しています。

0

gimp help for the desaturate toolには、「Lighness」、「Luminosity」、および「Average」というオプションに対応する3つの使用可能な公式が記載されています。それらは次のようになります。

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

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

平均:私はそれが(主観)、グラフィックスの質問は、むしろだから、これは、ここでは本当に上のトピックではないと思います(R + G + B)/3

関連する問題