2010-06-10 18 views
15

मैं रंगों की एक-आयामी सूची को सॉर्ट करना चाहता हूं ताकि एक सामान्य मनुष्य एक दूसरे के जैसा "एक जैसे" जैसा महसूस कर सके।एक आयाम में रंगों की एक सूची छंटनी?

स्पष्ट रूप से यह "पूरी तरह से" पाने के लिए एक कठिन या शायद असंभव समस्या है, क्योंकि रंगों को आमतौर पर तीन आयामों के साथ वर्णित किया जाता है, लेकिन इसका मतलब यह नहीं है कि कुछ सॉर्टिंग विधियां नहीं हैं जो दूसरों की तुलना में स्पष्ट रूप से अधिक प्राकृतिक दिखती हैं।

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

(1) आर = 254 जी = 0 बी = 0 (2) आर = 254 जी = 255 बी = 0 (3) आर = 255 जी = 0 बी = 0 (4) आर = 255 जी = 255 बी = 0

है यही कारण है, यह उन रंगों लाल, पीले वैकल्पिक होगा, लाल, पीला, दो "लाल रंग" अनिवार्य रूप से अनिवार्य रूप से एक-दूसरे से भिन्न होते हैं, और दो चिल्लाना भी एक-दूसरे से अलग-अलग होते हैं।

लेकिन एचएलएस द्वारा सॉर्टिंग आमतौर पर बोलने से काफी बेहतर काम करता है, और मुझे लगता है कि एचएसएल इससे भी बेहतर है; या तो, लाल एक दूसरे के बगल में होंगे, और चिल्लाना एक-दूसरे के बगल में होंगे।

लेकिन एचएलएस/एचएसएल में कुछ समस्याएं भी हैं; चीजें जिन्हें लोग "काला" के रूप में समझते हैं, उन्हें एक दूसरे से अलग किया जा सकता है, क्योंकि चीजें जो लोग "सफेद" के रूप में समझ सकें।

फिर, मैं समझता हूं कि मुझे यह स्वीकार करना है कि इस तरह के कुछ विभाजन होंगे; मैं बस सोच रहा हूं कि अगर किसी को एचएलएस/एचएसएल से बेहतर तरीका मिल गया है। और मुझे पता है कि "बेहतर" कुछ मनमाना है; मेरा मतलब है "एक सामान्य मानव के लिए अधिक प्राकृतिक"।

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

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

किसी भी मदद के लिए अग्रिम धन्यवाद।

+0

हम कितने रंग (मोटे तौर पर) बात कर रहे हैं की तुलना में एल्गोरिथ्म संख्या 3 से जाना होगा चयन करने के लिए था? और क्या आपको इसके लिए एल्गोरिदम चाहिए, या टेबल-आधारित या बाल्टी दृष्टिकोण पर्याप्त होगा? –

उत्तर

4

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

मेरा अनुमान है कि आप कुछ आसान और तेज़ चाहते हैं जो "पर्याप्त" दिखता है ("इष्टतम" सौंदर्य रंग सॉर्ट को समझने की कोशिश करने के बजाय, इसलिए सरल दृष्टिकोण आपके लिए पर्याप्त है।

मैं कहूंगा कि एचएसएल जाने का रास्ता है।

sortValue = L * 5 + S * 2 + H 

मानते हैं कि एच, एस और एल प्रत्येक श्रेणी [0, 1] में हैं।

+0

मैंने यह कोशिश की है और यह वास्तव में काफी अच्छी तरह से काम करता है। धन्यवाद। – liviucmg

+1

क्या आप स्वयं इसके साथ आए थे या क्या आपके पास मेरा संदर्भ है? – Sander

0

यहां एक विचार है कि मैं कुछ मिनट के विचार के बाद आया था। यह बकवास हो सकता है, या यह बिल्कुल भी काम नहीं कर सकता है, लेकिन मैं इसे किसी भी तरह से थूक दूंगा।

रंग की जगह पर एक दूरी समारोह को परिभाषित करें, d(x, y) (जहां इनपुट पर x और y रंग हैं और आउटपुट शायद एक फ्लोटिंग प्वाइंट नंबर है)। आपके द्वारा चुने गए दूरी का कार्य बहुत महत्वपूर्ण नहीं हो सकता है। यह आर, जी और बी घटकों में मतभेदों के वर्गों का योग हो सकता है, कह सकता है, या यह एच, एल और एस घटकों में अंतर में बहुपद हो सकता है (घटकों के साथ अलग-अलग वजन के अनुसार वे आपको कितना महत्वपूर्ण महसूस करते हैं कर रहे हैं)।

फिर आप एक दूसरे से अपनी सूची में प्रत्येक रंग की "दूरी" की गणना करते हैं, जो प्रभावी रूप से आपको एक ग्राफ देता है। इसके बाद आप अपने ग्राफ के न्यूनतम स्पैनिंग पेड़ की गणना करें। फिर आप अपने एमएसटी में मौजूद सबसे लंबे पथ (बिना बैकट्रैकिंग के) की पहचान करते हैं। इस पथ के अंत बिंदु अंतिम सूची के अंत बिंदु होंगे। इसके बाद आप पथ में अपने रास्ते से "शाखाओं" में अंक लाकर पेड़ को "रेखा" में लाने की कोशिश करते हैं।

हम्म। यदि आपका एमएसटी कलर स्पेस में पास-लूप के आकार में समाप्त होता है तो यह सब ठीक से काम नहीं कर सकता है। लेकिन शायद किसी भी दृष्टिकोण में उस समस्या होगी।

0
A. R=254 G=0 B=0 
B. R=254 G=255 B=0 
C. R=255 G=0 B=0 
D. R=255 G=255 B=0 

आपको पड़ोसी रंगों के बीच अंतर देखने की आवश्यकता है।

ए और बी के बीच अंतर 0 + 255 + 0 = 255. है ए और सी के बीच अंतर 1 + 0 + 0 = 1.

और ए और बी के बीच अंतर एक से अधिक है सी तो एक सी के करीब है तो बी और सी

A. R=254 G=0 B=0 
C. R=255 G=0 B=0 
B. R=254 G=255 B=0 
D. R=255 G=255 B=0 

स्वैप सी और बी के बीच अंतर 1 + 255 + 0 = 256. है सी और डी के बीच अंतर 0 + 255 + 0 = 255 है

सी और बी के बीच अंतर सी और डी से अधिक है इसलिए सी डी के करीब है इसलिए स्वैप बी और डी।

A. R=254 G=0 B=0 
C. R=255 G=0 B=0 
D. R=255 G=255 B=0 
B. R=254 G=255 B=0 

इसे एक बबल प्रकार की तरह व्यवहार करें। यह किसी भी खिंचाव से एक परिपूर्ण अलगाव नहीं है और संभवतः इस तक पहुंचने के बेहतर तरीके हैं लेकिन यह सही दिशा में एक लात हो सकता है।

भी ...

आप अपने विषय भर की तुलना में से कुछ अजीब तरह से देख सकते हैं।

5

आप एक माप में 3 रंग आयामों को कम किए बिना ऐसा नहीं कर सकते हैं। इस जानकारी को कम करने के कई (अनंत) तरीके हैं, लेकिन यह ऐसा करने के लिए गणितीय रूप से संभव नहीं है जिससे यह सुनिश्चित किया जा सके कि कम निरंतरता पर एक दूसरे के पास दो डेटा बिंदु एक दूसरे के पास अपने सभी घटक रंगों में एक दूसरे के पास हों मान। नतीजतन, इस प्रकार का कोई भी सूत्र संभावित रूप से अलग-अलग रंगों को समूहीकृत कर देगा।

जैसा कि आपने अपने प्रश्न में उल्लेख किया है, ऐसा करने का एक तरीका यह है कि आप जिस डेटा पॉइंट्स को सॉर्ट करने का प्रयास कर रहे हैं, उसके द्वारा त्रि-आयामी रंग स्थान के माध्यम से एक जटिल वक्र फिट करना होगा, और फिर प्रत्येक डेटा पॉइंट को कम करें वक्र पर अपने निकटतम स्थान पर और फिर वक्र के साथ उस बिंदु की दूरी तक। यह काम करेगा, लेकिन प्रत्येक मामले में यह डेटा बिंदुओं के एक विशेष सेट (आमतौर पर लागू समाधान के बजाय) के अनुरूप कस्टम समाधान होगा।यह अपेक्षाकृत महंगा (शायद) भी होगा, और बस उस डेटा सेट पर काम नहीं करेगा जो अच्छी तरह से घुमावदार लाइन प्रकार में वितरित नहीं किया गया था।

एक आसान विकल्प (जो पूरी तरह से काम नहीं करेगा) रंगीन पहिया के विपरीत किनारे पर दो "एंडपॉइंट" रंग चुनना होगा। तो, उदाहरण के लिए, आप रेड को एक एंडपॉइंट रंग और ब्लू को दूसरे के रूप में चुन सकते हैं। फिर आप प्रत्येक रंग डेटा बिंदु को 0 से 1 के पैमाने पर एक मान में परिवर्तित कर देंगे, जहां अत्यधिक लाल रंग वाला रंग 0 के पास स्कोर प्राप्त करेगा और एक रंग जो अत्यधिक ब्लूश होता है उसे स्कोर 1 मिलता है। 5 उस रंग को इंगित करेगा जिसमें या तो लाल या नीला नहीं है (उर्फ ग्रीन) या अन्य में लाल और नीले (उर्फ बैंगनी) की बराबर मात्रा होती है। यह दृष्टिकोण सही नहीं है, लेकिन यह समस्या आप इस समस्या से कर सकते हैं।

4

"निकटता" की कुछ धारणा के साथ एक आयाम में एकाधिक आयामों को कम करने के लिए कई मानक तकनीकें हैं।

मुझे लगता है कि आपको विशेष रूप से z-order transform देखें।

आप अपने तीन रंग घटकों के बिट्स को अंतःस्थापित करके और इस रूपांतरित मूल्य के आधार पर रंगों को सॉर्ट करके इसका एक त्वरित संस्करण कार्यान्वित कर सकते हैं।

निम्नलिखित जावा कोड की मदद करनी चाहिए आप आरंभ:

public static int zValue(int r, int g, int b) { 
      return split(r) + (split(g)<<1) + (split(b)<<2); 
    } 

    public static int split(int a) { 
      // split out the lowest 10 bits to lowest 30 bits 
      a=(a|(a<<12))&00014000377; 
      a=(a|(a<<8)) &00014170017; 
      a=(a|(a<<4)) &00303030303; 
      a=(a|(a<<2)) &01111111111; 
      return a; 
    } 
+1

पी।यह ध्यान देने योग्य है कि इस दृष्टिकोण को भी बहुत तेज़ धन्यवाद है कि आप इसे बिटवाईर ऑपरेशंस के साथ कार्यान्वित कर सकते हैं। – mikera

+1

यह भी ध्यान देने योग्य है कि हिल्बर्ट वक्र एक अच्छा विकल्प – mikera

+0

बहुत देर हो सकता है लेकिन उन लोगों के लिए जो कि हिल्बर्ट वक्र रंग सॉर्टिंग को रिलीज़ करता है, विशेष रूप से "हिल्बर्ट सॉर्टिंग" नामक अनुभाग) http://www.alanzucconi.com/2015/09/30/रंग-छँटाई / – Zimm3r

7

आप एक आयाम में रंग आप पहली बार क्या मीट्रिक्स पर उन्हें सुलझाने के लिए जा रहे हैं द्वारा निर्णय करना है की एक सूची सॉर्ट करने के लिए चाहते हैं। मेरे लिए सबसे अधिक समझ कथित चमक है (related question)।

मैं चमक से रंगों को क्रमबद्ध करने और उनकी तुलना करने के लिए 4 एल्गोरिदम में आया हूं। परिणाम यहाँ है।

मैंने चक्र में रंग उत्पन्न किए जहां केवल हर 400 वें रंग का उपयोग किया गया था। प्रत्येक रंग को 2x2 पिक्सेल द्वारा दर्शाया जाता है, रंगों को सबसे हल्के से हल्के (बाएं से दाएं, ऊपर से नीचे तक) क्रमबद्ध किया जाता है।

1 चित्र - Luminance (relative)

0.2126 * R + 0.7152 * G + 0.0722 * B 

2 चित्र - http://www.w3.org/TR/AERT#color-contrast

0.299 * R + 0.587 * G + 0.114 * B 

3 चित्र - HSP Color Model

sqrt(0.299 * R^2 + 0.587 * G^2 + 0.114 * B^2) 

4td चित्र - WCAG 2.0 SC 1.4.3relative luminance और contrast ratio फॉर्मूला

पैटर्न को कभी-कभी एक पंक्ति में रंगों की संख्या के आधार पर पहली और दूसरी तस्वीर पर देखा जा सकता है। मैंने कभी तीसरे या चौथे एल्गोरिदम से चित्र पर कोई पैटर्न नहीं देखा।

तो मैं मैं के बाद से बहुत तेजी से लागू करने के लिए आसान है और इसके बारे में 33% 4

Perceived brightness algorithm comparison

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