2008-08-04 15 views
44

Original Questionफॉलोअप: रंगों

मैं एक समारोह है कि यों के लिए कैसे "दूर" (या अलग) दो रंग हैं प्रयास करता रहा हूँ के बीच एक सटीक "दूरी" ढूँढना। यह प्रश्न वास्तव में दो भागों में है:

  1. कौन सा रंग स्थान मानव दृष्टि का सबसे अच्छा प्रतिनिधित्व करता है?
  2. क्या दूरी है कि अंतरिक्ष में मीट्रिक सबसे अच्छा मानव दृष्टि (यूक्लिडियन?) का प्रतिनिधित्व करता है
+1

मैंने इसी तरह की स्थिति से निपटने के दौरान नीचे दिए गए कुछ समाधानों को साजिश समाप्त कर दी। अन्य लोग भूखंडों को दिलचस्प पाते हैं http://stackoverflow.com/q/5774152/156755 – Basic

उत्तर

43

ला * बी * (उर्फ बस सादा "लैब" में कनवर्ट करें, और आप "CIELAB" के संदर्भ भी देखेंगे)। रंग अंतर का एक अच्छा त्वरित measaure है

(एल 1-एल 2)^2 + (A1-A2)^2 + (बी 1-बी 2)^2

रंग वैज्ञानिकों है अन्य अधिक परिष्कृत उपायों , जो आप कर रहे हैं उसके लिए आवश्यक शुद्धता के आधार पर परेशान नहीं हो सकता है।

a और b मूल्य शंकु के काम के समान तरीके से विपरीत रंगों का प्रतिनिधित्व करते हैं, और नकारात्मक या सकारात्मक हो सकते हैं। तटस्थ रंग - सफेद, ग्रे a=0, b=0 हैं। L चमक को एक विशेष तरीके से परिभाषित किया गया है, शून्य (शुद्ध अंधेरा) से जो भी हो।

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

वैसे, यह आपके कैरियर के लिए अपने रंगीन गुफागार के ऊपर उठने के लिए बहुत अच्छा होगा जो केवल "आरजीबी" या "सीएमवाईके" के बारे में जानते हैं जो उपकरणों के लिए बहुत अच्छे हैं लेकिन गंभीर धारणा के काम के लिए चूसते हैं। मैंने इमेजिंग वैज्ञानिकों के लिए काम किया है जो इस सामान के बारे में कुछ नहीं जानते थे!

अधिक मज़ा रंग अंतर के सिद्धांत पर पढ़ने के लिए, कोशिश:

http://en.kioskea.net/video/cie-lab.php3 पर लैब पर अधिक जानकारी मैं इस समय एक गैर-बदसूरत पृष्ठ ढूंढ सकता हूं जिसमें वास्तव में रूपांतरण सूत्र थे। मुझे यकीन है कि कोई इस जवाब को संपादित करने के लिए संपादित करेगा।

+4

रूपांतरण सूत्रों की कुरूपता के संबंध में : वे एक कारण के लिए बदसूरत हैं, क्योंकि आरजीबी से एक्सवाईजेड से एलएबी तक पहुंचने से परिस्थितियों पर निर्भर करता है। सीएफ: (चेतावनी, कुरूपता) http://www.easyrgb.com/index.php?X=MATH –

+1

संभावित रूप से यह मानक रंग दूरी मीट्रिक और सीआईई द्वारा परिभाषित छद्मकोश का वर्णन जोड़ने लायक होगा: http: // en .wikipedia.org/wiki/Color_difference – BartoszKP

2

स्पैम की तरह लग सकता है लेकिन नहीं, इस लिंक रंग रिक्त स्थान :) के लिए वाकई दिलचस्प है

http://www.compuphase.com/cmetric.htm

+0

बस आपकी औसत 90 की वेबसाइट की तरह दिखता है, जो कि, आकस्मिक रूप से, 2010+ शिक्षाविदों के लिए भी एक लोकप्रिय वेबसाइट है। – Domi

2

सबसे आसान दूरी निश्चित रूप से रंगों को उसी उत्पत्ति से उत्पन्न होने वाले 3 डी वैक्टरों के रूप में मानना ​​होगा, और उनके अंतिम बिंदुओं के बीच की दूरी लेना होगा।

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

ImageMagic निम्नलिखित तराजू प्रदान करता है:

  • लाल: 0.3
  • हरी: 0.6
  • नीले रंग: 0,1
बेशक

, इस तरह मान केवल के संबंध में सार्थक होगा अन्य रंगों के लिए अन्य मूल्य, ऐसा कुछ नहीं जो मनुष्यों के लिए सार्थक होगा, इसलिए आप सभी मानों का उपयोग कर सकते हैं क्योंकि समानता आदेश होगा।

4

मानव रंग धारणा के लिए एचएसएल और एचएसवी बेहतर हैं। Wikipedia के अनुसार:

यह क्योंकि तरीकों से मतभेद की कभी कभी कला सामग्री, डिजीटल चित्र, या अन्य मीडिया के साथ काम करने, इस तरह के आरजीबी या सीएमवाईके के रूप में वैकल्पिक मॉडल से अधिक एचएसवी या एचएसएल रंग मॉडल का उपयोग करने के लिए बेहतर है, मॉडल अनुकरण करते हैं कि मनुष्य रंग कैसे समझते हैं। आरजीबी और सीएमवाईके क्रमशः additive और subtractive मॉडल हैं, जिस तरह से मिश्रित जब प्राथमिक रंग रोशनी या वर्णक (क्रमशः) नए रंग बनाने के लिए गठबंधन।

Graphical depiction of HSV

+0

देखें: लाल 0 डिग्री पर है, इसलिए पीला लाल लाल + 10 डिग्री पर है और नीली लाल लाल -10 डिग्री या 350 डिग्री पर है। दूरी की गणना करना अब दो मानों को घटाना जितना आसान नहीं है। –

+2

दूसरे उत्तर के संदर्भ में वास्तव में सहायक नहीं है। सीआईई द्वारा परिभाषित मेट्रिक्स मानव रंग धारणा के लिए बेहतर हैं एचएलएस और एचएसवी नहीं। – BartoszKP

+0

इस पेपर में, एचएसवी स्पेस में रंग दूरी के लिए एक सूत्र है http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.84.2498&rep=rep1&type=pdf – fyts

2

खैर, कॉल का पहला बिंदु के रूप में, मैं सामान्य मीट्रिक एचएसवी (रंग, संतृप्तता और मूल्य) या एचएसएल की कहेंगे कि मनुष्य कैसे रंग अनुभव से आरजीबी कहते हैं या के बेहतर प्रतिनिधि हैं CYMK। HSL, HSV on Wikipedia देखें।

मुझे लगता है कि मैं दो रंगों के लिए एचएसएल अंतरिक्ष में अंक प्लॉट करता हूं और अंतर वेक्टर की परिमाण की गणना करता हूं। हालांकि इसका मतलब यह होगा कि उज्ज्वल पीले और उज्ज्वल हरे रंग को गहरे हरे रंग के हरे रंग के रूप में अलग माना जाएगा। लेकिन फिर कई लाल और गुलाबी दो अलग-अलग रंगों पर विचार करते हैं।

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

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

और भी बेहतर, आप देख सकते हैं अगर कोई पहले से ही ऑनलाइन ऐसी बात किया है ...

3

Wikipedia article on color differences सूचियों रंग रिक्त स्थान और रंग दूरी के मानव धारणा से सहमत करने के लिए डिज़ाइन दूरी अनेक मीट्रिक।

2

कोई व्यक्ति जो रंगहीन अंधेरा है, मेरा मानना ​​है कि अधिक अलगाव को सामान्य दृष्टि जोड़ने की कोशिश करना अच्छा होता है। रंग अंधापन का सबसे आम रूप लाल/हरा कमी है। इसका मतलब यह नहीं है कि आप लाल या हरे रंग को नहीं देख सकते हैं, इसका मतलब है कि अंतर देखना और देखना मुश्किल है। इसलिए एक रंग अंधे व्यक्ति अंतर को बता सकता है इससे पहले कि यह एक बड़ा अलगाव लेता है।

8

ऊपर के cmetric.htm लिंक के रूप में मेरे लिए असफल रहा, साथ ही मुझे रंग दूरी के लिए कई अन्य कार्यान्वयन मिला (एक बहुत लंबे जर्नी के बाद ..OpenCV का उपयोग कर deltaE और 2 आरजीबी से() को महत्व देता है:) कैसे सबसे अच्छा रंग दूरी की गणना करने के लिए, और .. सबसे वैज्ञानिक रूप से सही है!

यह आवश्यक 3 रंग अंतरिक्ष रूपांतरण जावास्क्रिप्ट से + कुछ कोड रूपांतरण (http://svn.int64.org/viewvc/int64/colors/colors.js) सी ++

और अंत में कोड करने के लिए (सही बॉक्स से बाहर काम करने के लिए, कोई भी एक गंभीर बग पाता आशा लगता है ... लेकिन यह परीक्षण की संख्या के बाद ठीक लग रहा है)

#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/photo/photo.hpp> 
#include <math.h> 

using namespace cv; 
using namespace std; 

#define REF_X 95.047; // Observer= 2°, Illuminant= D65 
#define REF_Y 100.000; 
#define REF_Z 108.883; 

void bgr2xyz(const Vec3b& BGR, Vec3d& XYZ); 
void xyz2lab(const Vec3d& XYZ, Vec3d& Lab); 
void lab2lch(const Vec3d& Lab, Vec3d& LCH); 
double deltaE2000(const Vec3b& bgr1, const Vec3b& bgr2); 
double deltaE2000(const Vec3d& lch1, const Vec3d& lch2); 


void bgr2xyz(const Vec3b& BGR, Vec3d& XYZ) 
{ 
    double r = (double)BGR[2]/255.0; 
    double g = (double)BGR[1]/255.0; 
    double b = (double)BGR[0]/255.0; 
    if(r > 0.04045) 
     r = pow((r + 0.055)/1.055, 2.4); 
    else 
     r = r/12.92; 
    if(g > 0.04045) 
     g = pow((g + 0.055)/1.055, 2.4); 
    else 
     g = g/12.92; 
    if(b > 0.04045) 
     b = pow((b + 0.055)/1.055, 2.4); 
    else 
     b = b/12.92; 
    r *= 100.0; 
    g *= 100.0; 
    b *= 100.0; 
    XYZ[0] = r * 0.4124 + g * 0.3576 + b * 0.1805; 
    XYZ[1] = r * 0.2126 + g * 0.7152 + b * 0.0722; 
    XYZ[2] = r * 0.0193 + g * 0.1192 + b * 0.9505; 
} 

void xyz2lab(const Vec3d& XYZ, Vec3d& Lab) 
{ 
    double x = XYZ[0]/REF_X; 
    double y = XYZ[1]/REF_X; 
    double z = XYZ[2]/REF_X; 
    if(x > 0.008856) 
     x = pow(x , .3333333333); 
    else 
     x = (7.787 * x) + (16.0/116.0); 
    if(y > 0.008856) 
     y = pow(y , .3333333333); 
    else 
     y = (7.787 * y) + (16.0/116.0); 
    if(z > 0.008856) 
     z = pow(z , .3333333333); 
    else 
     z = (7.787 * z) + (16.0/116.0); 
    Lab[0] = (116.0 * y) - 16.0; 
    Lab[1] = 500.0 * (x - y); 
    Lab[2] = 200.0 * (y - z); 
} 

void lab2lch(const Vec3d& Lab, Vec3d& LCH) 
{ 
    LCH[0] = Lab[0]; 
    LCH[1] = sqrt((Lab[1] * Lab[1]) + (Lab[2] * Lab[2])); 
    LCH[2] = atan2(Lab[2], Lab[1]); 
} 

double deltaE2000(const Vec3b& bgr1, const Vec3b& bgr2) 
{ 
    Vec3d xyz1, xyz2, lab1, lab2, lch1, lch2; 
    bgr2xyz(bgr1, xyz1); 
    bgr2xyz(bgr2, xyz2); 
    xyz2lab(xyz1, lab1); 
    xyz2lab(xyz2, lab2); 
    lab2lch(lab1, lch1); 
    lab2lch(lab2, lch2); 
    return deltaE2000(lch1, lch2); 
} 

double deltaE2000(const Vec3d& lch1, const Vec3d& lch2) 
{ 
    double avg_L = (lch1[0] + lch2[0]) * 0.5; 
    double delta_L = lch2[0] - lch1[0]; 
    double avg_C = (lch1[1] + lch2[1]) * 0.5; 
    double delta_C = lch1[1] - lch2[1]; 
    double avg_H = (lch1[2] + lch2[2]) * 0.5; 
    if(fabs(lch1[2] - lch2[2]) > CV_PI) 
     avg_H += CV_PI; 
    double delta_H = lch2[2] - lch1[2]; 
    if(fabs(delta_H) > CV_PI) 
    { 
     if(lch2[2] <= lch1[2]) 
      delta_H += CV_PI * 2.0; 
     else 
      delta_H -= CV_PI * 2.0; 
    } 

    delta_H = sqrt(lch1[1] * lch2[1]) * sin(delta_H) * 2.0; 
    double T = 1.0 - 
      0.17 * cos(avg_H - CV_PI/6.0) + 
      0.24 * cos(avg_H * 2.0) + 
      0.32 * cos(avg_H * 3.0 + CV_PI/30.0) - 
      0.20 * cos(avg_H * 4.0 - CV_PI * 7.0/20.0); 
    double SL = avg_L - 50.0; 
    SL *= SL; 
    SL = SL * 0.015/sqrt(SL + 20.0) + 1.0; 
    double SC = avg_C * 0.045 + 1.0; 
    double SH = avg_C * T * 0.015 + 1.0; 
    double delta_Theta = avg_H/25.0 - CV_PI * 11.0/180.0; 
    delta_Theta = exp(delta_Theta * -delta_Theta) * (CV_PI/6.0); 
    double RT = pow(avg_C, 7.0); 
    RT = sqrt(RT/(RT + 6103515625.0)) * sin(delta_Theta) * -2.0; // 6103515625 = 25^7 
    delta_L /= SL; 
    delta_C /= SC; 
    delta_H /= SH; 
    return sqrt(delta_L * delta_L + delta_C * delta_C + delta_H * delta_H + RT * delta_C * delta_H); 
} 

यह आशा है कि किसी की मदद करता है :)

संबंधित मुद्दे