2013-03-28 22 views
8

Użyłem wielu formuł do konwersji z RGB na skalę szarości, ale nie uzyskałem dobrych wyników w porównaniu do GIMP.Konwersja RGB do skali szarości w C

już przetestowała następujące formuły:

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

I nie sądzę, że to jest naprawdę na temat tutaj, ponieważ jest to kwestia (subiektywne) grafika raczej niż pytanie programistyczne. To powiedziawszy, GIMP jest open-source, więc zastanawiałeś się po prostu patrząc na to, co robi? – Useless

+0

Nie możesz po prostu użyć 'libgimp', aby zrobić to za Ciebie? – teppic

+0

Ponieważ oko ma maksymalną czułość na zielono, wydaje się, że pierwsza lub czwarta formuła jest prawidłowa. –

Odpowiedz

12

W celu prawidłowej konwersji RGB do skali szarości, należy przekształcić gamma poprawione R, G i wartości B w liniowej przestrzeni kolorów, zastosować konwersję w przestrzeni liniowej, a następnie zastosuj korektę gamma do wyniku.

Przestrzeń kolorów zawiera transformację, która jest tylko przybliżeniem krzywej gamma. Szczegółowe informacje można znaleźć w artykule Wikipedia. Wikipedia ma również specyficzne section na temat sRGB do skali szarości.

Zasadniczo, w celu przekształcenia składnika sRGB do formatu liniowego:

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

Następnie przekonwertować sRGB liniowego skali szarości: znowu

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; 

Następnie zastosować korekcję gamma 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; 
} 

Tzn.

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

Czy możesz podać mi odniesienie lub równanie? – user2000255

+0

Znalazłem równanie matematyczne z Wikipedii poniżej tytułu Konwertuj kolor na tytuł skali szarości. Ale nie rozumiem, co to znaczy. Dzięki Ci. – user2000255

+1

Współczynniki te (0,2126, 0,7152 i 0,0722) pochodzą pierwotnie z macierzy transformacji przestrzeni liniowej RGB -> XYZ (środkowy rząd macierzy, który oblicza Y). Wynikowa wartość "intensywności" jest w rzeczywistości wartością "Y" z wektora XYZ. https: // pl.wikipedia.org/wiki/SRGB#The_reverse_transformation –

2

Jest a GIMP tutorial że opisano kilka różnych sposobów, że GIMP może konwertować kolor obrazu do skali szarości. Jedną z metod jest ważona desaturacja, którą już wypróbowałeś, a artykuł podaje kilka wag, które można wykorzystać do przybliżenia konwersji GIMPa.

GIMP za gegl biblioteka, która jest podstawą dla wszystkich swoich operacji graficznych, ma a rather elaborate mechanism for converting color to greyscale, który bierze pod uwagę kolor sąsiadujących pikseli i używa iteracyjnego podejścia, które wydaje się naśladować proces tworzenia czarno-białych fotografii.

0

gimp help for the desaturate tool podaje trzy dostępne formuły odpowiadające opcjom o nazwie "Lighness", "Luminosity" i "Average". Ci będzie:

Lekkość: 0.5 * (max(R,G,B) + min(R,G,B))

Jasność: (0.21 * R) + (0.72 * G) + (0.07 * B)

Średnia: (R + G + B)/3

Powiązane problemy