2013-03-28 17 views
8

Ho usato molte formule per convertire da RGB a scala di grigi, ma non ho ottenuto buoni risultati rispetto a GIMP.convertire RGB in scala di grigi in C

ho già verificato le seguenti formule:

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

Non credo che questo è davvero in argomento qui, dal momento che è una domanda (soggettive) grafica piuttosto di una domanda di programmazione. Detto questo, GIMP è open-source, quindi hai pensato solo a quello che fa? – Useless

+0

Non puoi semplicemente usare 'libgimp' per farlo per te? – teppic

+0

Poiché l'occhio ha una sensibilità massima al verde, sembra che sia la prima o la quarta formula a destra. –

risposta

12

Al fine di convertire correttamente RGB in scala di grigio, si dovrebbe trasformare la gamma corretta valori B R, G e nello spazio colore lineare, applicare la conversione nel spazio lineare e quindi applicare una correzione gamma al risultato.

Lo spazio di colori sRGB ha una trasformazione che si avvicina solo a una curva gamma. Vedere l'articolo Wikipedia per i dettagli. Wikipedia ha anche uno specifico section in materia di sRGB in scala di grigi.

Fondamentalmente, per convertire un componente sRGB formato lineare:

double sRGB_to_linear(double x) { 
    if (x < 0.04045) return x/12.92; 
    return pow((x+0.055)/1.055, 2.4); 
} 

Poi, per convertire sRGB a lineare in scala di grigi:

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; 

Quindi, applicare la correzione gamma sRGB ancora:

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); 
+0

Potresti darmi un riferimento o un'equazione? – user2000255

+0

Ho trovato l'equazione matematica dal sito di Wikipedia sotto il titolo Conversione da colore a scala di grigi. Ma non capisco cosa significhi. Grazie. – user2000255

+1

Questi coefficienti (0.2126, 0.7152 e 0.0722) provengono originariamente dalla matrice di trasformazione dello spazio lineare RGB -> XYZ (la riga centrale della matrice, che calcola Y). Il valore "intensità" risultante è in realtà il valore "Y" del vettore XYZ. https: // en.wikipedia.org/wiki/SRGB#The_reverse_transformation –

2

C'è a GIMP tutorial che descrive diversi modi che The GIMP può convertire un'immagine a colori in scala di grigi. Un metodo è una desaturazione ponderata come hai già provato e l'articolo fornisce alcuni pesi che possono essere utilizzati per approssimare la conversione di GIMP.

gegl La biblioteca del GIMP, che è la base per tutte le sue operazioni di immagine, ha a rather elaborate mechanism for converting color to greyscale, che tiene conto il colore dei pixel vicini e utilizza un approccio iterativo che sembra emulare il processo di sviluppo di fotografie in bianco e nero.

0

Lo gimp help for the desaturate tool indica tre formule disponibili corrispondenti alle opzioni denominate "Lighness", "Luminosity" e "Average". Quelli sarebbero:

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

Luminosità: (0.21 * R) + (0.72 * G) + (0.07 * B)

media: (R + G + B)/3

Problemi correlati