2009-11-12 36 views
11

ढूंढना मेरे पास जावा में एक बफर की गई छवि है और मैं रिकॉर्ड करना चाहता हूं कि प्रत्येक पिक्सेल रंग मूल्य के आधार पर दूसरे के समान कैसे है। इसलिए 'समान' रंग वाले पिक्सल में उच्च समानता मान होगा। उदाहरण के लिए लाल और गुलाबी के समानता मान 1000 होगा लेकिन लाल और नीले रंग में 300 या उससे कम की तरह कुछ होगा।समान रंगों को प्रोग्रामेटिक रूप से

मैं यह कैसे कर सकता हूं। जब मुझे एक बफर किए गए छवि पिक्सेल से आरजीबी मिलता है तो यह एक नकारात्मक पूर्णांक देता है, मुझे यकीन नहीं है कि इसके साथ इसे कैसे कार्यान्वित किया जाए।

उत्तर

18

सबसे पहले, आप पूर्णांक मूल्य कैसे प्राप्त कर रहे हैं?

एक बार जब आप आरजीबी मूल्यों को प्राप्त है, तो आप की कोशिश कर सकते

((r2 - r1) + (G2 - G1) + (बी 2 - बी 1)) 1/2

यह आपको दो बिंदुओं से 3 डी स्पेस में दूरी प्रदान करेगा, प्रत्येक द्वारा निर्दिष्ट (आर 1, जी 1, बी 1) और (आर 2, जी 2, बी 2)।

या रंग के एचएसवी मूल्य का उपयोग करके अधिक परिष्कृत तरीके हैं।

+0

मैं तुम्हें^2 के बाद (बी 2 बी 1-बाहर छोड़ दिया है) लगता है; वैसे भी, +1 क्योंकि मैं उसी –

+0

पोस्ट करने वाला था, क्या वास्तव में आप 3 डी स्पेस में दूरी को मापते हैं? मैंने सोचा होगा कि इसमें कहीं वर्ग वर्ग शामिल होगा? यदि यह काम करता है, तो इसका उपयोग 2 डी स्पेस में किया जा सकता है, और आपने अभी पाइथागोरस को आउटमार्ट किया है। – Breton

+7

वह घन रूट ले रहा है, जो गलत है; यह वर्ग रूट होना चाहिए। लेकिन जड़ लेना अनावश्यक है, क्योंकि आप दूर की दूरी को आसानी से दूरी के रूप में तुलना कर सकते हैं, और रूट लेने का समय बचा सकते हैं। एचएसएल या एचएसवी के लिए –

2

दोनों रंगों को एचएसवी मान में परिवर्तित करना और एच मानों में अंतर ढूंढना सबसे आसान है। न्यूनतम परिवर्तन का मतलब है कि रंग समान हैं। हालांकि यह एक सीमा तय करने के लिए आप पर निर्भर है।

2

आप शायद प्रत्येक पिक्सेल पर getRGB() को कॉल कर रहे हैं जो रंग को 4 8 बिट्स बाइट्स, उच्च बाइट अल्फा, अगले बाइट लाल, अगले बाइट हरे, अगले बाइट नीले रंग के रूप में वापस कर रहा है। आपको चैनलों को अलग करने की जरूरत है। फिर भी, आरजीबी स्पेस में रंग समानता इतनी महान नहीं है - आपको एचएसएल या एचएसवी स्पेस का उपयोग करके बेहतर परिणाम मिल सकते हैं। रूपांतरण कोड के लिए here देखें।

दूसरे शब्दों में:

int a = (argb >> 24) & 0xff; 
int r = (argb >> 16) & 0xff; 
int g = (argb >> 8) & 0xff; 
int b = argb & 0xff; 

मैं जावा बफ़र छवियों में विशिष्ट बाइट आदेश पता नहीं है, लेकिन मुझे लगता है यह सही है।

+1

-1। वे विज्ञापन परिवर्तन हैं जो असली दुनिया में वास्तव में कुछ भी नहीं है। उनका प्रारंभिक ग्राफिक्स कार्यक्रमों के लिए आविष्कार किया गया था। एल * ए * बी स्पेस में दूरी वास्तविक आंखों और वास्तविक रंगों के साथ सैकड़ों प्रयोगों से माप पर आधारित है। – Breton

2

इस प्रकार आप अलग बाइट्स मिल सकता है:

int rgb = bufferedImage.getRGB(x, y); // Returns by default ARGB. 
int alpha = (rgb >>> 24) & 0xFF; 
int red = (rgb >>> 16) & 0xFF; 
int green = (rgb >>> 8) & 0xFF; 
int blue = (rgb >>> 0) & 0xFF; 
9

मैं सुझाव है कि आप यहाँ

Color difference formulas पढ़ने अगर आप इस अधिकार क्या करना चाहते शुरू करते हैं। यह ΔE*ab, ΔE*94, ΔE*00 और ΔE*CMC रंग अंतर की गणना के लिए सूत्रों को बताता है।

1

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

8

एचएसएल एक खराब कदम है। एल * ए * बी एक रंगीन जगह है जो यह दर्शाती है कि रंग वास्तव में कैसे प्राप्त किया जाता है, और वास्तविक आंखों वाले लोगों को शामिल करने वाले सैकड़ों प्रयोगों से डेटा पर आधारित है और कह रहा है, "मैं उन दोनों के बीच अंतर बता सकता हूं। लेकिन नहीं वे दो"।

एल * ए * बी स्पेस में दूरी उन प्रयोगों से प्राप्त भविष्यवाणियों के अनुसार वास्तविक पारस्परिक दूरी का प्रतिनिधित्व करती है।

एक बार जब आप एल * ए * बी में परिवर्तित हो जाते हैं तो आपको केवल 3 डी स्पेस में रैखिक दूरी को मापने की आवश्यकता होती है।

+0

+1 अच्छा विचार। अधिक जानकारी: http://en.wikipedia.org/wiki/Lab_color_space – BalusC

0

यह #1634206 पर एक समान प्रश्न है।

यदि आप आरजीबी स्पेस में दूरी की तलाश में हैं, तो यूक्लिडियन दूरी काम करेगी, मान लीजिए कि आप लाल, हरे और नीले मूल्यों को समान रूप से मानते हैं।

यदि आप उन्हें अलग-अलग वजन करना चाहते हैं, जैसा सामान्य रूप से रंग/आरजीबी को ग्रेस्केल में परिवर्तित करते समय किया जाता है, तो आपको प्रत्येक घटक को एक अलग राशि से भारित करने की आवश्यकता होती है। उदाहरण के लिए, आरजीबी से लोकप्रिय रूपांतरण का उपयोग 30% लाल + 59% की स्केल के लिए हरा + 11% नीले रंग:

d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2; 

छोटे d2 के मूल्य करीब रंग (r1,g1,b1) और (r2,g2,b2) एक दूसरे के लिए कर रहे हैं।

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

+0

वजन में गामा सुधार भार हैं।जबकि ब्लूज़ (11) चमक की मानवीय धारणा में बड़ा योगदान नहीं देते हैं, वे वास्तव में रंग दूरी के मानव निर्धारण में एक बड़ा भेदभाव करते हैं। http://www.compuphase.com/cmetric.htm वजन के लिए वजन 2,4,3 बेहतर उद्देश्य के लिए बेहतर हैं। मैं रंग दूरी (2^24 * 2^24) के हर क्रमपरिवर्तन के माध्यम से एलएबी (डेल्टा ई) चला गया और उनका औसत था। और वजन 22, 43, 35 बेहतर हैं (मानव आंखों के लिए एक सरोगेट के रूप में एलएबी का उपयोग करना)। इसके अलावा, मैंने उस भारित यूक्लिडियन एल्गोरिदम को लागू किया है, यह बेकार है! – Tatarize

-2

मैंने इसे आजमाया। एचएसएल/एचएसवी मूल्य निश्चित रूप से उपयोगी नहीं है। उदाहरण के लिए:

  • एल के साथ सभी रंग = 0, हालांकि उनके एचएसएल अंतर एक उच्च रंग दूरी फंसाना सकता है, 'काली' (आरजीबी 000000) कर रहे हैं।

  • एस = 0 के साथ सभी रंग 'ग्रे' की छाया हैं, हालांकि उनके एचएसएल अंतर उच्च रंग दूरी को प्रभावित कर सकते हैं।

  • एच (रंग) श्रेणी 'लाल' की छाया के साथ शुरू होती है और समाप्त होती है, इसलिए एच = 0 और एच = [अधिकतम] (360 डिग्री या 100% या 240, आवेदन के आधार पर) दोनों लाल और अपेक्षाकृत एक दूसरे के समान, लेकिन यूक्लिडियन एचएसएल दूरी अधिकतम के करीब है।

तो मेरी सिफारिश जड़ के बिना इयूक्लिडियन आरजीबी दूरी (r2-R1) ² + (G2-G1) ² + (बी 2-बी 1) ² का प्रयोग है। 1000 (व्यक्तिपरक) दहलीज 1000 के समान रंगों के लिए ठीक काम करता है। अंतर के साथ रंग> 1000 मानव आंखों से अच्छी तरह से अलग हैं। इसके अतिरिक्त यह घटकों को अलग-अलग वजन के लिए हंसमुख हो सकता है (पिछला पोस्ट देखें)।

+0

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

5

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

एक्स = क्योंकि (एच) * S * वी

वाई = पाप (एच) * S * वी

जेड = वी

दोनों अंक के लिए

और फिर उन दोनों के बीच Euclidian दूरी लेने :

Sqrt((X0 - X1)*(X0 - X1) + (Y0 - Y1)*(Y0 - Y1) + (Z0 - Z1)*(Z0 - Z1)) 

2 कॉस, 2 पाप और एक वर्ग रूट की लागत पर।

वैकल्पिक रूप से आप वास्तव में दूरी को और अधिक आसानी से गणना कर सकते हैं यदि आप यह महसूस करके इतने इच्छुक हैं कि 2 डी स्पेस में फ़्लैटन होने पर आपको मूल से दो वैक्टर होते हैं, और एक्सवाई स्पेस में दूरी खोजने के लिए कोसाइन के कानून को लागू करते हैं :

C² = A² + B² + 2*A*B*Cos(Theta) 

कहाँ पहले मूल्य का एक = एस * वी, और बी = एस * दूसरे और Cosign के वी अंतर थीटा या H0-एच 1

तो फिर तुम जेड में कारक, विस्तार करने के लिए 3 डी स्पेस में 2 डी स्पेस।

A = S0*V0 
B = S1*V1 
dTheta = H1-H0 
dZ = V0-V1 
distance = sqrt(dZ*dZ + A*A + B*B + 2*A*B*Cos(dTheta); 

ध्यान दें कि क्योंकि cosigns के कानून हमें देता है C² हम सिर्फ यह सही वहाँ में प्लग कौन सा 1 क्योंकि और 1 Sqrt लागत जेड में परिवर्तन के साथ। एचएसवी बहुत उपयोगी है, आपको बस यह जानने की जरूरत है कि यह किस प्रकार की रंगीन जगह का वर्णन कर रहा है। आप उन्हें केवल एक यूक्लिडियन फ़ंक्शन में थप्पड़ मार नहीं सकते हैं और इससे कुछ सुसंगत हो सकते हैं।

1

वहाँ वास्तव में इस समस्या पर एक दिलचस्प कागज है:

सामग्री आधारित छवि और वीडियो रिट्रीवल के लिए एक नई Perceptually वर्दी एसोसिएटेड रंग समानता उपाय के साथ रंग रिक्ति एम Sarifuddin और Rokia Missaoui द्वारा

आप [1]

संक्षेप में यह गूगल या विशेष रूप से आसानी से का उपयोग कर प्राप्त कर सकते हैं [गूगल स्कॉलर।], कुछ रंग रिक्त स्थान (जैसे आरजीबी, एचएसवी, लैब) और दूरी measu res (जैसे कि ज्यामितीय माध्य और यूक्लिडियन दूरी) दूसरों की तुलना में रंग समानता की मानव धारणा के बेहतर प्रतिनिधित्व हैं। पेपर एक नई रंगीन जगह के बारे में बात करता है, जो बाकी की तुलना में बेहतर है, लेकिन यह आम मौजूदा रंग रिक्त स्थान और दूरी उपायों की अच्छी तुलना भी प्रदान करता है। योग्यता *, ऐसा लगता है कि सामान्य रूप से उपलब्ध रंग रिक्त स्थान का उपयोग करके अवधारणात्मक दूरी के लिए सबसे अच्छा उपाय है: एचएसवी रंग स्थान और बेलनाकार दूरी माप।

* कम से कम, संदर्भित पेपर में चित्र 15 के अनुसार।

बेलनाकार दूरी मापन (लेटेक्स संकेतन में) है:

D_ {cyl} = \ sqrt {\ डेल्टा वी^{2} + S_1^{2} + S_2^{2} -2S_1S_2cos (\ डेल्टा एच)}

+2

कागज पढ़ने और एल्गोरिदम लागू करने के बाद। यह मूल रूप से बकवास है। यह भयानक नहीं है लेकिन यह वास्तव में एचएसवी से बेहतर नहीं है। सी और एल चर के व्युत्पन्न ठीक हैं, पेपर सूचियों को गलत तरीके से सूचीबद्ध करता है (यदि आपने हरे = लाल दिए गए मानों का उपयोग किया है)। आकृति 15 का निकटता एक दोषपूर्ण पद्धति के कारण है। यह तब तक रंगों को खारिज कर देता है जब तक कि उस क्षेत्र को भरने के लिए पर्याप्त न हो। तो किसी भी रंगस्थान को अस्वीकार करने की दहलीज पर वर्गीकृत किया जा रहा है और यह * नहीं * यह सही ढंग से प्रतिबिंबित करने की क्षमता है कि औसत मानव सबसे अलग रंगों के रूप में क्या अनुमान लगाएगा। और यह भी सभी गलतियों नहीं है। – Tatarize

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