सी

2013-03-28 7 views
8

में आरजीबी से ग्रेस्केल में कनवर्ट करें मैंने आरजीबी से ग्रेस्केल में कनवर्ट करने के लिए कई सूत्रों का उपयोग किया, लेकिन जीआईएमपी की तुलना में अच्छे नतीजे नहीं मिले।सी

मैं पहले से ही निम्नलिखित सूत्र का परीक्षण किया:

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

मुझे नहीं लगता कि यह यहाँ वास्तव में विषय पर है, क्योंकि यह एक (व्यक्तिपरक) ग्राफिक्स प्रश्न नहीं बल्कि है एक प्रोग्रामिंग सवाल से। उस ने कहा, जीआईएमपी ओपन-सोर्स है, तो क्या आपने यह देखा कि यह क्या करता है? – Useless

+0

क्या आप इसे अपने लिए करने के लिए सिर्फ 'libgimp' का उपयोग नहीं कर सकते? – teppic

+0

चूंकि आंखों में हरे रंग की अधिकतम संवेदनशीलता है, यह पहले या चौथे सूत्र के जैसा लगता है। –

उत्तर

12

आदेश सही ढंग से आरजीबी परिवर्तित करने के लिए स्केल में, आप बदलना चाहिए गामा रैखिक रंग अंतरिक्ष में आर, जी और बी मूल्यों को सही में रूपांतरण लागू रैखिक स्थान, और उसके परिणामस्वरूप एक गामा सुधार लागू करें।

sRGB रंगस्थान में एक परिवर्तन है जो केवल गामा वक्र का अनुमान लगाता है। विवरण के लिए Wikipedia आलेख देखें। विकिपीडिया में एसआरबीबी के ग्रेस्केल के विषय पर एक विशिष्ट section भी है। तब

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

, ग्रेस्केल रैखिक sRGB कन्वर्ट करने के लिए:

असल में, रैखिक प्रारूप करने के लिए एक 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); 
+0

क्या आप मुझे एक संदर्भ या समीकरण दे सकते हैं? – user2000255

+0

मुझे कनवर्टिंग रंग के नीचे विकिपीडिया साइट से ग्रेस्केल शीर्षक तक गणित समीकरण मिला। लेकिन मुझे समझ में नहीं आता कि इसका क्या अर्थ है। धन्यवाद। – user2000255

+1

उन गुणांक (0.2126, 0.7152 और 0.0722) मूल रूप से रैखिक-आरजीबी -> एक्सवाईजेड स्पेस ट्रांसफॉर्मेशन मैट्रिक्स (मैट्रिक्स की मध्य पंक्ति, जो वाई की गणना करता है) से हैं। परिणामस्वरूप "तीव्रता" मान वास्तव में XYZ वेक्टर से 'वाई' मान है। https: // en। –

2

वहाँ a GIMP tutorial कि कई अलग अलग तरीकों कि GIMP एक रंग छवि स्केल के लिए परिवर्तित कर सकते हैं का वर्णन है। एक विधि एक भारित desaturation है जैसा कि आप पहले से ही कोशिश की है, और लेख कुछ वजन देता है जिसका उपयोग जीआईएमपी के रूपांतरण को अनुमानित करने के लिए किया जा सकता है।

GIMP के gegl पुस्तकालय है, जो अपनी छवि कार्यों के सभी के लिए आधार है, a rather elaborate mechanism for converting color to greyscale, जिसके खाते में पड़ोसी पिक्सल के रंग लेता है और एक सतत दृष्टिकोण है कि काले और सफेद तस्वीरें विकसित करने की प्रक्रिया का अनुकरण करने लगता है का उपयोग करता है।

0

gimp help for the desaturate tool "लाइटनेस", "ल्यूमिनोसिटी" और "औसत" नामक विकल्पों के अनुरूप तीन उपलब्ध सूत्र बताते हैं। उन होगा:

लपट: 0.5 * (max(R,G,B) + min(R,G,B))

दीप्ति: (0.21 * R) + (0.72 * G) + (0.07 * B)

औसत: (R + G + B)/3